赞
踩
简介:NEC通化协议是一个广泛应用与红外光通讯设备的协议,具有单工、异步的特点。常用红外LED波长为940ns。
一、NEC编码说明:
应用例子:红外遥控
模块一:定时器 0 计时
- void Timer0_Init()
- {
- TMOD&=0xF0; //高四位保持不变,低四位清零
- TMOD|=0x01; //高四位保持不变,最低位置一
- TL0 = 0; //设置定时初始值
- TH0 = 0; //设置定时初始值
- TF0 = 0; //清楚TF0标志
- TR0 = 0; //开始计时
-
- }
-
- void Timer0_SetCounter() //清空重装值
- {
- TH0 = 0;
- TL0 = 0;
- }
-
- unsigned int Timer0_GetCounter() //返回计入的数(时间)
- {
- return (TH0<<8)|TL0;
- }
-
- void Timer0_Run(unsigned char Flag) //计时控制函数
- {
- TR0=Flag;
- }
模块二:红外遥控中断
- void Int0_Init() //中断初始化
- {
- IT0=1;
- EX0=1; //下降沿触发
- EA=1;
- PX0=1;
- IE0=0;
- }
模块三:红外解码
- unsigned int IR_Time; //记录每个下降沿所用时间
- unsigned char IR_State; //状态标志位
-
- unsigned char IR_Data[4]; //存储获取到的数据
- unsigned char PIR_Data; //数据位指向
-
- unsigned char IR_DataFlag; //数据标志位
- unsigned char IR_RepeatFlag; //连发标志位
-
- unsigned char IR_Address; //存储得到的地址
- unsigned char IR_Command; //存储得到的命令字
-
- void IR_Init() //初始化
- {
- Timer0_Init();
- Int0_Init();
- }
-
- void Int0_Routine() interrupt 0
- {
-
- if(IR_State==0)
- {
-
- Timer0_SetCounter(); //重装值初始化
- Timer0_Run(1); //开始计时
- IR_State=1; //转为状态1
- }else if(IR_State==1)
- {
- IR_Time=Timer0_GetCounter(); //计入时间
- Timer0_SetCounter(); //重装值初始化
-
- if(IR_Time>(12800-500)&&IR_Time<(12800+500)) //接收到起始信号
- {
- IR_State=2; //转为状态2 准备解码
- Timer0_SetCounter(); //重装值初始化
- }else if(IR_Time>(10750-500)&&IR_Time<(10750+500)) //接收到连续信号
- {
-
- IR_RepeatFlag=1; //连发信号标志位置1
- Timer0_Run(0); //停止计时
- IR_State=0; //转为状态0
- }else
- {
- IR_State=1; //重新接收
- Timer0_SetCounter(); //重装值初始化
- }
- }else if(IR_State==2)
- {
- IR_Time=Timer0_GetCounter(); //计入时间
- Timer0_SetCounter(); //重装值初始化
-
- if(IR_Time>=1120-500&&IR_Time<1120+500) //接收到0
- {
-
- IR_Data[PIR_Data/8]&=~(0x01<<(PIR_Data%8)); //位变0
- PIR_Data++;
- }else if(IR_Time>2250-500&&IR_Time<2250+500) //接收到1
- {
- IR_Data[PIR_Data/8]|=(0x01<<(PIR_Data%8)); //位变1
- PIR_Data++;
- }else //错误数据
- {
- PIR_Data=0;
- IR_State=1;
- Timer0_SetCounter(); //重装值初始化
- }
- }
-
- if(PIR_Data>=32) //数据接收完成
- {
- PIR_Data=0; //指向清零
- if((IR_Data[0]==~IR_Data[1])&&(IR_Data[2]==~IR_Data[3])) //校验数据
- {
-
- IR_Address=IR_Data[0]; //转移数据
- IR_Command=IR_Data[2];
- IR_DataFlag=1; //数据标志位置1
- }
- Timer0_Run(0); //停止计时
- IR_State=0; //转为状态0
- }
- }
-
- unsigned char IR_GetDataFlag() //返回数据标志位 1表示一个数据接收完成
- {
- if(IR_DataFlag)
- {
- IR_DataFlag=0;
- return 1;
- }
- return 0;
- }
-
- unsigned char IR_GetRepeatFlag() //返回连发标志位 1表示一个周期接收完成
- {
- if(IR_RepeatFlag)
- {
- IR_RepeatFlag=0;
- return 1;
- }
- return 0;
- }
-
- unsigned char IR_GetAddress() //返回地址
- {
- return IR_Address;
- }
-
- unsigned char IR_GetCommand() //返回命令字
- {
- return IR_Command;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。