找回密码
 立即注册

QQ登录

只需一步,快速开始

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

对前期帖51单片机红外通信第一种方案修正,附完整源码

[复制链接]
跳转到指定楼层
楼主
ID:965487 发表于 2021-10-18 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前期我发帖称也谈51单片机红外通信(附四种方案),现对第一方案一处错误进行修正。前期贴链接附在下面:

也谈51单片机红外通信(附有四种红外解码源码) - 单片机DIY制作 (51hei.com)


  1. /*-----------------------------------------------
  2. 【实验平台】: QX-MCS51 单片机开发板
  3. * 【外部晶振】: 11.0592Mhz       
  4. * 【主控芯片】: STC89C52
  5. * 【编译环境】: Keil μVisio4         
  6. * 【编    程】:wzqwxx 水上人家
  7. 名称:遥控器红外解码数码管显示
  8.   内容:按配套遥控器会在数码管上对应显示键码值,实测通过

  9.                   NEC 标准下的编码表示

  10.                 其中:引导码高电平约9000us 左右,低电平约4500us 左右;
  11.                 接收端:引导码低电平约9000us 左右,高电平约4500us 左右;
  12.                 用户码16 位,数据码16 位,共32位;
  13.         发送端:        数据0 是用“高电平约560us +低电平约560us”表示。
  14.                                 数据1 可用“高电平约560us+低电平约1680us”表示

  15.         接收端反转:数据0 是用“低电平约560us +高电平约560us”表示。
  16.                                 数据1 可用“低电平约560us+高电平约1680us”表示

  17. ------------------------------------------------*/
  18. #include<reg52.h>            //包含头文件,头文件包含特殊功能寄存器的定义
  19. #include <stdio.h>
  20. #include "SMG.H"

  21. sbit IR=P3^2;                          //红外接口
  22. sbit beep = P2^3;//蜂鸣器接口
  23. unsigned char irtime;        //红外用全局变量   计数延时,识别比特位电平高低
  24. unsigned char IRcord[4]= {0x12,0x34,0x56,0x78};//存储键码


  25. void tim0_isr (void) interrupt 1   //STC89C52 11.0592M
  26. {
  27.   irtime++;  //用于计数2个下降沿之间的时间         每个溢出中断时长256*1.085069us=277.77us
  28. }


  29. void EX0_ISR (void) interrupt 0  //外部中断0服务函数
  30. {
  31.         static unsigned char  i,blag;             //接收红外信号处理
  32.           if(blag == 1)
  33.         {
  34.                 if( irtime <3 || irtime >51)goto end;  //两个下降沿延时过短(少于833us)或过长不解码 滤除干扰波
  35.                 if(irtime > 28 && irtime < 55)//跳过引导码 头码,9ms+4.5ms
  36.                 { i=0; goto end;}               
  37.                 IRcord[i/8] >>= 1;          //i/8每处理8位换下一个元素,总的处理4个字节共32位的数据
  38.                  if(irtime > 5 ) IRcord[i/8] |= 0x80;           //位0电平时长计数上限4,位1高电平计数上限8
  39.                 i++;                                                                           //这里取6为0/1 的识别分界
  40.                 if(i > 31){ i = 0; blag = 0; beep = 0; delay(30); beep = 1; }        //beep 鸣叫一声        解码成功                                                  
  41.         }
  42.         else  
  43.                 {blag = 1;}
  44.         end:irtime=0;                                                                          
  45. }


  46. //void UART_init()
  47. //{
  48. //        TMOD |= 0x20;          //T1工作模式2  8位自动重装
  49. //        TH1 = 0xfd;
  50. //        TL1 = 0xfd;         //比特率9600   时钟频率11.0592MHZ
  51. //        TR1 = 1;                //启动T1定时器
  52. //        SM0 = 0;
  53. //        SM1 = 1;                 //串口工作方式1 10位异步
  54. //        REN = 1;                //串口允许接收
  55. //        TI = 1;
  56. //}

  57. void TIM0init(void)//定时器0初始化
  58. {
  59.         TMOD|=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  60.         TH0=0x00; //重载值
  61.         TL0=0x00; //初始化值
  62.         ET0=1;    //开中断
  63.         TR0=1;   
  64. }
  65. void EX0init(void)
  66. {
  67. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  68. EX0 = 1;   //使能外部中断
  69. EA = 1;    //开总中断
  70. }


  71. void main(void)
  72. {
  73. //        UART_init();
  74.         EX0init(); //初始化外部中断
  75.         TIM0init();//初始化定时器

  76.         while(1)//主循环
  77.         {
  78.                 SMGXSSZ(IRcord);
  79.         //        printf(" %bx %bx %bx %bx \n  ",IRcord[0],IRcord[1],IRcord[2],IRcord[3]) ;
  80.         }
  81. }
  82.   
  83.   
复制代码

  1. #include "SMG.H"

  2. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  3.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  4.                                                 //0-F的码表
  5. uchar code wen_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管位数选择码表

  6. void delay(uint i)//延时毫秒程序
  7. {
  8.         uint m,n;
  9.         for(m=i;m>0;m--)
  10.                 for(n=114;n>0;n--);
  11. }

  12. //一位数码管显示,参数1:位,参数2:数
  13. void smgxs(uchar we,uchar shu)
  14. {
  15.        
  16.         P0=table[shu];
  17.         du=1;
  18.         du=0;

  19.         P0=wen_code[we];
  20.         we=1;
  21.         we=0;
  22.         delay(2);
  23. }
  24. //void smgxs8w(unsigned long shu)         //数码管显示8位大数
  25. //{
  26. //        unsigned long shu_temp=shu;
  27. //        uchar i=8;
  28. //    if(shu>0)
  29. //    {
  30. //          while(shu_temp)
  31. //          {       
  32. //                  i--;
  33. //                smgxs(i,shu_temp%10);         
  34. //                shu_temp=shu_temp/10;
  35. //          }
  36. //        } else {smgxs(7,0);}//归零数码管显一个零
  37. //}

  38. void SMGXSSZ(uchar shuz[])         //数码管显示数组
  39. {
  40.         uchar i;
  41.           for(i = 0;i < 4;i++)
  42.           {       
  43.                 smgxs(i*2+1,shuz[i]&0x0f);                 //显示十六进制数
  44.                 smgxs(i*2,shuz[i]>>4);
  45.           }                       
  46. }
复制代码




评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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