找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AT89s52单片机设计的红外遥控计算器显示于1602上

[复制链接]
跳转到指定楼层
楼主
ID:506496 发表于 2019-12-30 12:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #ifndef _Redreceive_H_
  2. #define _Redreceive_H_

  3. //红外按键检测
  4. /*69 70 71
  5. 68 64 67                   44 40
  6. 77 21 91                   07 15 5B
  7. 22 25 13                   16 19 0D
  8. 12 24 94
  9. 82 28 90
  10. 66 82 74*/
  11. sbit IR=P3^2;                          //红外接口标志

  12. #define uchar unsigned char//宏定义
  13. #define uint  unsigned int //宏定义
  14. unsigned char  irtime;        //红外用全局变量
  15. unsigned char  red_date;        //红外数据
  16. bit irpro_ok,irok;

  17. unsigned char IRcord[4];
  18. unsigned char irdata[33];
  19. unsigned char first_line[8];
  20. unsigned char second_line[4];
  21. bit flag_cd;
  22. uchar count_cd;

  23. void Ir_work(void);
  24. void Ircordpro(void);
  25. void tim0_isr (void) interrupt 1 using 1
  26. {
  27.   irtime++;  //用于计数2个下降沿之间的时间
  28. }

  29. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  30. {
  31.         static unsigned char  i;             //接收红外信号处理
  32.         static bit startflag;                //是否开始处理标志位

  33.         if(startflag)                        
  34.         {
  35.                 if(irtime<140&&irtime>=130)//引导码 TC9012的头码,9ms+4.5ms
  36.             i=0;
  37.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  38.                     irtime=0;
  39.                     i++;
  40.                            if(i==33)
  41.                       {
  42.                                   irok=1;
  43.                                 i=0;
  44.                           }
  45.         }
  46.         else
  47.         {
  48.                 irtime=0;
  49.                 startflag=1;
  50.         }
  51. }

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

  66. void Ir_work(void)//红外键值散转程序
  67. {
  68.         static uchar i;
  69.         static uchar j;
  70.         static int A;
  71.         static int B;
  72.         static int C;
  73.         if(IRcord[0]==0)//判断用户码
  74.         {
  75.          switch(IRcord[2])//判断第三个数码值
  76.                  {
  77.                          case 0x0c:red_date='1';break;//1 显示相应的按键值
  78.                          case 0x18:red_date='2';break;//2
  79.                          case 0x5e:red_date='3';break;//3
  80.                          case 0x08:red_date='4';break;//4
  81.                          case 0x1c:red_date='5';break;//5
  82.                          case 0x5a:red_date='6';break;//6
  83.                          case 0x42:red_date='7';break;//7
  84.                          case 0x52:red_date='8';break;//8
  85.                          case 0x4a:red_date='9';break;//9
  86.                          case 0x16:red_date='0';break;//0
  87.                          case 0x19:red_date='=';break;//=
  88.                          case 0x07:red_date='-';break;//-
  89.                          case 0x15:red_date='+';break;//+
  90.                          case 0x44:red_date='*';break;//*
  91.                          case 0x40:red_date='/';break;///
  92.                          case 0x0d:red_date=0x0d;break;//clear
  93.          
  94.                          }
  95.                 if(red_date==0x0d)
  96.                 {
  97.                         LCD1602_W_cmd(0x01);
  98.                         count_cd=0;                       
  99.                 }
  100.                 else
  101.                 {
  102.                                 first_line[count_cd++]=red_date;
  103.                                 LCD1602_W_cmd(0x80);
  104.                                 for(i=0;i<count_cd;i++)
  105.                                 {
  106.                                  LCD1602_W_dat(first_line[i]);
  107.                                 }

  108.                                                          if(red_date=='=')
  109.                                                          {
  110.                                                                           for(i=0;i<count_cd-1;i++)
  111.                                                                           {
  112.                                                                                           if(first_line[i]>=48&&first_line[i]<=57)
  113.                                                                                         {
  114.                                                                                          A=pow(10,i)*A+(first_line[i]-48);                                                                       
  115.                                                                                         }
  116.                                                                                         else
  117.                                                                                         {
  118.                                                                                              j=i;
  119.                                                                                                  break;
  120.                                                                                         }
  121.                                                                            }
  122.                                                                                          for(i=j+1;i<count_cd-1;i++)
  123.                                                                                          {
  124.                                                                                           B=pow(10,i-j-1)*B+(first_line[i]-48);
  125.                                                                                          }
  126.                                                                                          switch(first_line[j])
  127.                                                                                  {
  128.                                                                                          case '+':C=B+A;break;//
  129.                                                                                          case '-':C=A-B;break;//
  130.                                                                                          case '*':C=B*A;break;//
  131.                                                                                          case '/':C=A/B;break;//
  132.                                                                              default:break;
  133.                                                                                          }

  134.                                                                   sprintf(second_line,"%d",C);
  135.                                                                   LCD1602_W_cmd(0x80+0x40+16-strlen(second_line));

  136.                                                                   for(i=0;i<strlen(second_line);i++)
  137.                                                                   {
  138.                                                                    LCD1602_W_dat(second_line[i]);
  139.                                                                   }
  140.                                                         }
  141.                 }

  142.                                                                  A=0;
  143.                                                                  B=0;
  144.                                                                  C=0;
  145.                                                                  j=0;
  146.                                                                  i=0;
  147.                                                                   
  148.         }
  149.         irpro_ok=0;//处理完成标志
  150. }
  151.        


  152. void Ircordpro(void)//红外码值处理函数
  153. {
  154.         unsigned char i, j, k,cord,value;
  155.         k=1;
  156.         for(i=0;i<4;i++)      //处理4个字节
  157.         {
  158.                 for(j=1;j<=8;j++) //处理1个字节8位
  159.                 {
  160.                         cord=irdata[k];
  161.                         if(cord>15)//大于某值为1,这个和晶振有绝对关系,这里使用11.0592M计算
  162.                         value=value|0x80;
  163.                         if(j<8)
  164.                         {
  165.                                 value>>=1;
  166.                         }
  167.                         k++;
  168.                 }
  169.                 IRcord[i]=value;
  170.                 value=0;     
  171.         }
  172.         irpro_ok=1;//处理完毕标志位置1
  173. }

  174. void red_dispaly()
  175. {
  176.                 if(irok)                        //如果接收好了进行红外处理
  177.                 {   
  178.                         Ircordpro();
  179.                         irok=0;
  180.                 }
  181.                 if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  182.                 {
  183.                         Ir_work();
  184.                 }
  185. }

  186. void red_ini(void)
  187. {
  188.         EX0init(); //初始化外部中断
  189.         TIM0init();//初始化定时器
  190. }
  191.   
  192. #endif
复制代码


简易红外遥控计算器.zip

50.79 KB, 下载次数: 12, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:1 发表于 2019-12-31 00:47 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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