/****************************************************************
* 文件名 :ir.c
* 描述 :红外线解码实验C语言程序。红外线遥控器遥控开发板,
* 开发板解码收到的信号,把收到的信号通过串口传送到电脑上,
* 同时把解码出的最后三个字节通过数码管显示出来。
* 创建人 : 云杰
* QQ : 494713348
* 电话 : 15123350190
* Email : [email protected]
* 网址 : http://shop66398134.taobao.com
* 时间 : 2010年4月10日
* 版本号 : V0.1.0
* 修改记录:
*
****************************************************************/
#include <c8051f340.h>
#include <stdarg.h>
#include <stdio.h>
#include "ir.h"
//数码管7段显示的编码
u8 sec7_code[] =
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
// 0 1 2 3 4 5 6 7 8 9 A B C
0xa1,0x86,0x8e,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
// D E F 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
};
u16 xdata rxdata[10]; //全局变量,保存接收数据
u16 tmp_data; //全局变量,临时保存接收数据
bit rxdata_over; //全局变量,接收数据标完成志位
u8 rxbitcnt; //全局变量,接收数据bit位计数
u16 rxdata_cnt; //全局变量,接收到的数据的长度
bit ir_len_cnt_en; //全局变量,使能红外线计数
u16 ir_len_cnt; //全局变量,接红外线长度计数
u8 ir_negedge_cnt; //全局变量,红外线下降沿计数
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
u8 i;
u32 rx_last3_char;
SysclkInit(); //初始化是系统时钟到12M
F340PortInit(); //初始挂交叉开关和I/O口
NOP;
NOP;
NOP;
Init74HC595(); //初始化串转并芯片74HC595的输入端口
InitTimer(); //初始化Timer0、Timer1和Timer2的值
//Timer0用于串口波特率产生;Timer1用于捕获
//红外线下降沿;Timer2用于计数的步长
Uart0Init();
HexDisplay(0x888888); //初始化数码管显示为8
tmp_data = 0;
rxdata_over = 0; //全局变量,接收数据完成标志位
rxbitcnt = 0; //全局变量,接收数据bit位计数
rxdata_cnt = 0; //全局变量,接收到的数据的长度
ir_len_cnt_en = 0; //全局变量,使能红外线计数
ir_len_cnt = 0; //全局变量,接红外线长度计数
ir_negedge_cnt = 0; //
EA = 1; //使能总总断,全局变量,红外线下降沿计数
while(1)
{
while(!rxdata_over) //等待接收红外线数据
{
NOP;
NOP;
NOP;
NOP;
}
rx_last3_char = rxdata[rxdata_cnt-3];
rx_last3_char = ((rx_last3_char<<8) | rxdata[rxdata_cnt-2]);
rx_last3_char = ((rx_last3_char<<8) | rxdata[rxdata_cnt-1]);
HexDisplay(rx_last3_char);//数码管显示接收到最后3个字节
UartPrintf("Rxlen 0x%x",rxdata_cnt); //在PC机上打印字符串
for(i=0; i< rxdata_cnt; i++)
{
if(rxdata[i] == IR_HEAD)
UartPuts(" Head");//表示接收到数据头
else
UartPrintf(" %02x",rxdata[i]);
rxdata[i] = 0;
}
UartPuts("\t\n");//换行
rxdata_over = 0;
rxdata_cnt = 0;
Delay(100);
}
}
/********************************************************************
* 名称 : SysclkInit()
* 功能 : 系统时钟配置
* 输入 : 无
* 输出 : 无
*********************************************************************/
void SysclkInit(void)
{
REG0CN = 0x00; // 稳压器使能
OSCICN |= 0x83; // 不分频,使用内部12M晶振,系统时钟频率为12MHz
OSCICL = 0x00; // 内部晶振工作在最高频率
OSCLCN = 0x00; // 禁止内部L-F振荡器
OSCXCN = 0x00; // 关闭外部振荡器
PCA0MD &= ~0x40; // 禁止看门狗
RSTSRC = 0x00; // 禁止时钟丢失检测器
}
/********************************************************************
* 名称 : F340PortInit()
* 功能 : C8051F340的端口和交叉开关配置
* 输入 : 无
* 输出 : 无
***********************************************************************/
void F340PortInit(void)
{
//端口引脚配置
P0MDOUT = 0x10; //设置P0.4(对应TX0)输出为推挽方式,其他管脚采用漏极开路方式
P1MDOUT = 0x34; //设置P1.2,P1.4,P1.5 输出为推挽方式
P0SKIP = 0xcf; //选择应被交叉开关跳过P0.0,P0.1,P0.2,P0.3,P0.6,P0.7,
//交叉开关配置
XBR0 = 0x01; //UART TX0, RX0 连到端口引脚 P0.4 和 P0.5。
XBR1 = 0x50; //T0 连到端口引脚,交叉开关使能并弱上拉
}
/********************************************************************
* 名称 : InitTimer()
* 功能 : 初始化Timer0、Timer1和Timer2的值
* 输入 : 无
* 输出 : 无
***********************************************************************/
void InitTimer(void)
{
TMOD=0x26; //用自动重装载的8位计数器,定时器 0 由外部输入引脚(T0)的负跳变加 1
CKCON = 0xf5; //定时器0和定时器2用系统时钟(12M),定时器1用(系统时钟/4)作为它的时基
TH0 = 0xff; //Timer0,0xff, 每次捕获一个下降沿(负跳变),就产生一次中断
TL0 = 0xff;
TH1 = 256-(SYSCLK/BAUDRATE/8); //设置定时1用作波特率的重载值
T2SPLIT = 1; //定时器2工作在双 8位自动重装载定时器方式
T2SOF = 0;
TMR2RLL = 0x88; //Timer2,12000000/120 = 100KHZ
TMR2L = 0x88; //对应10us,256(2的8幂)-120 = 136 = 0x88
TMR2RLH = 0x88;
TMR2H = 0x88;
TF2L = 0; //清除中断标志位
TF2H = 0;
ET0 = 1; //允许定时器0中断
ET1 = 0; //允许定时器1中断
ET2 = 1; //允许定时器2中断
TR0 = 1; //允许Timer0
TR1 = 1; //允许Timer1
TR2 = 0; //定时器 2高TMR2H被禁止
TF2LEN = 1; //定时器 2 低字节中断允许
}
/********************************************************************
* 名称 : Uart0Init()
* 功能 : C8051F340的UART0的初始化,参考《C8051F34x中文版.pdf》的P196,
* 表 18.1 对应标准波特率的定时器设置(使用内部振荡器)
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Uart0Init(void)
{
SCON0 = 0x50; // SCON0:模式1,8位UART,使能RX
TI0 = 0; // 清发送标志位
}
/********************************************************************
* 名称 : UartSendByte()
* 功能 : 用Uart发送一个Byte数据
* 输入 : 待发送的Byte数据
* 输出 : 无
***********************************************************************/
void UartSendByte(char dat)
{
SBUF0 = dat; //将数据送出
while(TI0==0) NOP; //发送标志位是否产生
TI0=0; //清发送标志位
}
/********************************************************************
* 名称 : UartPuts()
* 功能 : 发送字符串
* 输入 : 指向字符串指针
* 输出 : 无
***********************************************************************/
void UartPuts(char *pt)
{
while(*pt)
UartSendByte(*pt++);
}
/********************************************************************
* 名称 : UartSendString()
* 功能 : 发送字符串,和省约参数
* 输入 : 指向字符串指针
* 输出 : 无
***********************************************************************/
void UartPrintf(char *fmt,...)
{
va_list ap;
char xdata string[32];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
UartPuts(string);
va_end(ap);
}
/********************************************************************
* 名称 : Init74HC595()
* 功能 : 初始化串转并芯片74HC595的输入端口
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Init74HC595(void)
{
SH = 0;
21.红外线遥控器解码实验.zip_C8051F 红外遥控_cannotbss_guardoi6
版权申诉
24 浏览量
2022-07-15
08:04:20
上传
评论
收藏 36KB ZIP 举报
alvarocfc
- 粉丝: 109
- 资源: 1万+
最新资源
- 基于mysql和python的学生选课系统【课程设计(实验报告+源码)】
- PxCook-像素大厨Windows版本安装包
- aspose-words-23.12-jdk16 有水印
- [大模型部署]在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现.zip
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统设计与实现+使用说明.zip
- 基于STM32单片机空气监测系统设计源码+详细文档+配套全部资料(毕业设计).zip
- rdf0412-kcu116-pcie-c-2019-1.zip(XILINX KCU116 源码)
- 基于C#语言的winform界面火车票订票系统(源码+实验报告)
- 【华为OD部分真题及讲解】华为OD部分真题及讲解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0