当前位置:   article > 正文

NEC通化协议_nec协议

nec协议

简介:NEC通化协议是一个广泛应用与红外光通讯设备的协议,具有单工、异步的特点。常用红外LED波长为940ns。

一、NEC编码说明:

      


应用例子:红外遥控

模块一:定时器 0 计时

  1. void Timer0_Init()
  2. {
  3. TMOD&=0xF0; //高四位保持不变,低四位清零
  4. TMOD|=0x01; //高四位保持不变,最低位置一
  5. TL0 = 0; //设置定时初始值
  6. TH0 = 0; //设置定时初始值
  7. TF0 = 0; //清楚TF0标志
  8. TR0 = 0; //开始计时
  9. }
  10. void Timer0_SetCounter() //清空重装值
  11. {
  12. TH0 = 0;
  13. TL0 = 0;
  14. }
  15. unsigned int Timer0_GetCounter() //返回计入的数(时间)
  16. {
  17. return (TH0<<8)|TL0;
  18. }
  19. void Timer0_Run(unsigned char Flag) //计时控制函数
  20. {
  21. TR0=Flag;
  22. }

模块二:红外遥控中断

  1. void Int0_Init() //中断初始化
  2. {
  3. IT0=1;
  4. EX0=1; //下降沿触发
  5. EA=1;
  6. PX0=1;
  7. IE0=0;
  8. }

模块三:红外解码

  1. unsigned int IR_Time; //记录每个下降沿所用时间
  2. unsigned char IR_State; //状态标志位
  3. unsigned char IR_Data[4]; //存储获取到的数据
  4. unsigned char PIR_Data; //数据位指向
  5. unsigned char IR_DataFlag; //数据标志位
  6. unsigned char IR_RepeatFlag; //连发标志位
  7. unsigned char IR_Address; //存储得到的地址
  8. unsigned char IR_Command; //存储得到的命令字
  9. void IR_Init() //初始化
  10. {
  11. Timer0_Init();
  12. Int0_Init();
  13. }
  14. void Int0_Routine() interrupt 0
  15. {
  16. if(IR_State==0)
  17. {
  18. Timer0_SetCounter(); //重装值初始化
  19. Timer0_Run(1); //开始计时
  20. IR_State=1; //转为状态1
  21. }else if(IR_State==1)
  22. {
  23. IR_Time=Timer0_GetCounter(); //计入时间
  24. Timer0_SetCounter(); //重装值初始化
  25. if(IR_Time>(12800-500)&&IR_Time<(12800+500)) //接收到起始信号
  26. {
  27. IR_State=2; //转为状态2 准备解码
  28. Timer0_SetCounter(); //重装值初始化
  29. }else if(IR_Time>(10750-500)&&IR_Time<(10750+500)) //接收到连续信号
  30. {
  31. IR_RepeatFlag=1; //连发信号标志位置1
  32. Timer0_Run(0); //停止计时
  33. IR_State=0; //转为状态0
  34. }else
  35. {
  36. IR_State=1; //重新接收
  37. Timer0_SetCounter(); //重装值初始化
  38. }
  39. }else if(IR_State==2)
  40. {
  41. IR_Time=Timer0_GetCounter(); //计入时间
  42. Timer0_SetCounter(); //重装值初始化
  43. if(IR_Time>=1120-500&&IR_Time<1120+500) //接收到0
  44. {
  45. IR_Data[PIR_Data/8]&=~(0x01<<(PIR_Data%8)); //位变0
  46. PIR_Data++;
  47. }else if(IR_Time>2250-500&&IR_Time<2250+500) //接收到1
  48. {
  49. IR_Data[PIR_Data/8]|=(0x01<<(PIR_Data%8)); //位变1
  50. PIR_Data++;
  51. }else //错误数据
  52. {
  53. PIR_Data=0;
  54. IR_State=1;
  55. Timer0_SetCounter(); //重装值初始化
  56. }
  57. }
  58. if(PIR_Data>=32) //数据接收完成
  59. {
  60. PIR_Data=0; //指向清零
  61. if((IR_Data[0]==~IR_Data[1])&&(IR_Data[2]==~IR_Data[3])) //校验数据
  62. {
  63. IR_Address=IR_Data[0]; //转移数据
  64. IR_Command=IR_Data[2];
  65. IR_DataFlag=1; //数据标志位置1
  66. }
  67. Timer0_Run(0); //停止计时
  68. IR_State=0; //转为状态0
  69. }
  70. }
  71. unsigned char IR_GetDataFlag() //返回数据标志位 1表示一个数据接收完成
  72. {
  73. if(IR_DataFlag)
  74. {
  75. IR_DataFlag=0;
  76. return 1;
  77. }
  78. return 0;
  79. }
  80. unsigned char IR_GetRepeatFlag() //返回连发标志位 1表示一个周期接收完成
  81. {
  82. if(IR_RepeatFlag)
  83. {
  84. IR_RepeatFlag=0;
  85. return 1;
  86. }
  87. return 0;
  88. }
  89. unsigned char IR_GetAddress() //返回地址
  90. {
  91. return IR_Address;
  92. }
  93. unsigned char IR_GetCommand() //返回命令字
  94. {
  95. return IR_Command;
  96. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/493082
推荐阅读
相关标签
  

闽ICP备14008679号