找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15w204s @11.0592hz单片机红外解码串口助手查看

[复制链接]
跳转到指定楼层
楼主
ID:412370 发表于 2018-12-9 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
nec协议红外通信
15w204s @11.0592hz 单片机解码后通过串口以9600的比特率发送出去,stc的串口助手,串口3查看码值

单片机源码:
  1. #include <reg52.h>
  2. /*====================================
  3. 自定义类型名
  4. ====================================*/
  5. typedef unsigned char INT8U;
  6. typedef unsigned char uchar;

  7. typedef unsigned int INT16U;
  8. typedef unsigned int uint;

  9. uchar IRtime;          //储存检测红外高低电平持续时间
  10. uchar IRcord[4];  //储存解码后的4个字节数据
  11. uchar IRdata[33]; //包含起始码在内的33位数据
  12. bit IRpro_ok;          //解码后4个字节数据接收完成标志位
  13. bit IRok;                  //33位数据接收完成标志

  14. //初始化定时器0,外部中断0,串口
  15. void init()
  16. {
  17.         TMOD |= 0x02;//设置定时器0工作模式2,8位自动重装
  18.         TL0 = TH0 = 0;//初始化定时器0寄存器,定时器0溢出一次时间为256个机器周期
  19.         EA = 1;//开总中断
  20.         ET0 = 1;//开定时器0中断
  21.         TR0 = 1;//启动定时器0

  22.         IT0 = 1;//设置外部中断0跳变沿触发方式
  23.         EX0 = 1;//开外部中断0中断

  24.         S3CON = 0x10;                //8位数据,可变波特率
  25.         S3CON &= 0xBF;                //串口3选择定时器2为波特率发生器
  26.         AUXR &= 0xFB;                //定时器2时钟为Fosc/12,即12T
  27.         T2L = 0xE8;                //设定定时初值
  28.         T2H = 0xFF;                //设定定时初值
  29.         AUXR |= 0x10;                //启动定时器2
  30.         SM1 =  1;//设置串口工作模式1,10位异步收发
  31. }

  32. //定时器0中断,每中断一次需要256*1.085us =  277.76us
  33. void time0() interrupt 1
  34. {
  35.         IRtime++;//277.76us
  36. }

  37. //外部中断0 存入33次脉宽
  38. void int0() interrupt 0
  39. {
  40.         static uchar i;//静态变量用于存入33次数据计数
  41.         static bit startflag;//开始储存脉宽标志位
  42.         if(startflag)
  43.         {
  44.                 /*判断引导码,如果是引导码则从起始码开始存*/
  45.                 if((IRtime < 53) && (IRtime >= 32))        i = 0;
  46.                 IRdata[i] = IRtime;//以TO溢出的次数来计算脉宽把这个时间存放在数组中
  47.                 IRtime = 0;//计数清零
  48.                 i++;//计数脉宽存入次数自加
  49.                 if(i == 33)           //i等于33那么就表示已经存入了33次脉宽
  50.                 {
  51.                         IRok = 1; //脉宽检查完成
  52.                         i = 0;          //把脉宽计数清零准备下次存入
  53.                 }
  54.         }
  55.         else
  56.         {
  57.                 IRtime = 0;          //定时器0计数清零
  58.                 startflag = 1;//开始处理标志位置1
  59.         }

  60. }

  61. //把提取的33次脉宽进行解码 NEC协议
  62. void IRcordpro()
  63. {
  64.         uchar i;//i是用于计数处理4个字节
  65.         uchar j;//j用于计数处理1个字节的8位数据
  66.         uchar k;//k用于计数处理33次脉宽
  67.         k = 1;//从第一位脉宽开始处理,丢掉起始码
  68.         for(i = 0; i < 4; i++)
  69.         {
  70.                 for(j = 0; j < 8; j++)
  71.                 {
  72.                         //如果脉宽大于数据0标准的1125us那么就判定为数据1
  73.                         if(IRdata[k] > 5) IRcord[i] |= 0x80;//写1
  74.                         //只能右移7次,如果右移8次则会把第一位数据移出去
  75.                         if(j < 7) IRcord[i] >>= 1;
  76.                         k++; //处理下一次脉宽
  77.                 }
  78.         }
  79.         IRpro_ok = 1;//解码完成
  80. }

  81. void main()
  82. {
  83.         uchar i; //计数串口发送字节数
  84.         init();//初始化
  85.         while(1)
  86.         {
  87.                 if(IRok)//判断33次脉宽是否提取完成
  88.                 {
  89.                          IRcordpro();//根据脉宽解码出4个字节的数据
  90.                         IRok = 0;//清零脉宽检查完成标志位等待下一次脉宽检查
  91.                         if(IRpro_ok)//判断解码是否完成
  92.                         {
  93.                                 for(i = 0; i < 4; i++) //串口发送4个字节数据
  94.                                 {
  95.                                         SBUF = IRcord[i]; //发送数据
  96.                                         while(!TI);                  //等待发送完成标志
  97.                                         TI = 0;                          //清零发送完成标志位
  98.                                 }
  99.                                 IRpro_ok = 0;//清零解码标志位        
  100.                         }
  101.                 }
  102.         }

  103. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:88704 发表于 2019-3-3 14:25 来自手机 | 只看该作者
楼主,您好,为什么我照你的,写,我的串口收到全部是四个 FF FF FF FF全部按键 都是这样,可以请教你吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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