找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2005|回复: 0
打印 上一主题 下一主题
收起左侧

红外控制流水灯

[复制链接]
跳转到指定楼层
楼主
ID:306790 发表于 2018-4-12 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在弄红外解锁:数据码,数据反码:
  1.                          /*NEC协议红外通信
  2. 单片机解码后通过串口以9600的比特率发送出去
  3. */
  4. #include <reg52.h>
  5. /*====================================
  6. 自定义类型名
  7. ====================================*/
  8. typedef unsigned char INT8U;
  9. typedef unsigned char uchar;

  10. typedef unsigned int INT16U;
  11. typedef unsigned int uint;
  12. /*====================================
  13. 硬件接口位声明
  14. ====================================*/
  15. sbit IR  = P3^2;     //定义红外脉冲数据接口        外部中断O输入口

  16. uchar IRtime;//储存检测红外高低电平持续时间
  17. uchar IRcord[4];//储存解码后的4个字节数据
  18. uchar IRdata[33];//包含起始码在内的33位数据
  19. bit IRpro_ok;//解码后4个字节数据接收完成标志位
  20. bit IRok;//33位数据接收完成标志
  21. //初始化定时器0,外部中断0
  22. void init()
  23. {
  24.         TMOD|=0x02;//设置定时器0工作模式2,8位自动重装
  25.         TL0=TH0=0;//初始化定时器0寄存器,定时器0溢出一次时间为256个机器周期
  26.         EA=1;//开总中断
  27.         ET0=1;//开定时器0中断
  28.         TR0=1;//启动定时器0
  29.        
  30.         IT0=1;//设置外部中断0跳变沿触发方式
  31.         EX0=1;//开外部中断0中断
  32.        
  33. }
  34. //定时器0中断,每中断一次需要256*1.085us =  277.76us
  35. void time0() interrupt 1
  36. {
  37.         IRtime++;  //277.76us
  38. }
  39. //外部中断0 存入33次脉宽
  40. void int0() interrupt 0
  41. {
  42.         static uchar i;//静态变量用于存入33次数据计数
  43.         static bit startflag;//开始储存脉宽标志位
  44.         if(startflag)
  45.         {
  46.                 /*判断引导码,如果是引导码则从起始码开始存*/
  47.                 if((IRtime<53)&&(IRtime>=32)) i=0;
  48.                 IRdata[i]=IRtime;  //以TO溢出的次数来计算脉宽把这个时间存放在数组中
  49.                 IRtime=0;  //计数清零
  50.                 i++;//计数脉宽存入次数自加
  51.                 if(i==33)  //i等于33那么就表示已经存入了33次脉宽
  52.                 {
  53.                         IRok=1;  //脉宽检查完成
  54.                         i=0; //把脉宽计数清零准备下次存入
  55.                 }
  56.         }
  57.         else
  58.         {
  59.                 IRtime=0;//定时器0计数清零
  60.                 startflag=1;//开始处理标志位置1
  61.         }
  62. }
  63. void IRcordpro()
  64. {
  65.         uchar i;//i是用于计数处理4个字节
  66.         uchar j;//j用于计数处理1个字节的8位数据
  67.         uchar k;//k用于计数处理33次脉宽
  68.         k = 1;//从第一位脉宽开始处理,丢掉起始码
  69.         for(i=0;i<4;i++)
  70.         {
  71.                 for(j=0;j<8;j++)
  72.                 {
  73.                         //如果脉宽大于数据0标准的1125us那么就判定为数据1
  74.                         if(IRdata[k]>5)  IRcord[i]|=0x80;//写1
  75.                         //只能右移7次,如果右移8次则会把第一位数据移出去
  76.                         if(j<7)  IRcord[i]>>=1;
  77.                         k++;  //处理下一次脉宽
  78.                 }
  79.         }
  80.         IRpro_ok=1;//解码完成
  81. }
  82. void main()
  83. {
  84.         init(); //初始化
  85.         while(1)
  86.         {
  87.                 if(IRok)//判断33次脉宽是否提取完成
  88.                 {
  89.                         IRcordpro();//根据脉宽解码出4个字节的数据
  90.                         IRok=0;//清零脉宽检查完成标志位等待下一次脉宽检查
  91.                         if(IRpro_ok)//判断解码完成,4个字节数据
  92.                         {
  93.                                 if(IRcord[2] == 0x45)
  94.                                         P1 = 0xfe;  //数据码,低电平,开锁       
  95.                                 else
  96.                                         P1 = 0x01;          //数据反码,高电平
  97.                                 IRpro_ok=0;//清零解码标志位
  98.                         }
  99.                 }
  100.         }
  101. }
复制代码



评分

参与人数 1黑币 +5 收起 理由
stkh + 5 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表