找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用51单片机STC15W408AS单片机遥控接收遥控器码值并在1602液晶显示

  [复制链接]
跳转到指定楼层
楼主
/*STC15W408AS单片机遥控接收码值1602液晶显示!*/
/*因为最近在51黑中参考不了不少朋友的程序,所以我也要奉献一下,真实用心处理的东西,写得不好勿喷!*/


以下是原程序!
  1. //主要是用最新51系列增强型的单片机,好多程序不共用,所以这一款是针对开发者需要要用液晶显示遥控器码值,然后用那个码值编程的朋友,非常适用。
  2. #include <reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P2^0;//指令控制端
  6. sbit led=P3^0;//指令控制端
  7. sbit RW=P2^1;//数据控制端
  8. sbit E=P2^2;//使能控制端
  9. sbit IR=P3^2;//遥控全能端
  10. sbit BBT=P3^4;//蜂鸣器控制端
  11. uchar code table[]={
  12. "1602IR-CODE TEST"
  13. };//数组
  14. uchar dat[4];
  15. uint lowtime,hightime;//高位数据与低位数据存储变量
  16. uchar y;
  17. /*******************************/
  18. /***********延时子程序***********/
  19. /*******************************/
  20. void delay(uint z)//延时
  21. {
  22.         uint x,y;
  23.         for(x=50;x>0;x--)//外循环
  24.         for(y=z;y>0;y--);//内循环
  25. }
  26. /*******************************/
  27. /***********写指令子程序***********/
  28. /*******************************/
  29. void xeizhi(uchar tem)//写指令子程序
  30. {
  31.         RS=0;//低
  32.         RW=0;//低
  33.         E=0;//低
  34.         delay(5);//延时一下,防止标志位为忙碌状态
  35.         P1=tem;//数据给P0口
  36.         E=1;//下降沿完成数据传送
  37.         delay(5);
  38.         E=0;        
  39. }
  40. /*******************************/
  41. /***********读数子程序***********/
  42. /*******************************/
  43. void duzhi(uchar tee)//写数子程序
  44. {
  45.         RS=1;//置高
  46.         RW=0;//置低
  47.         P1=tee;//取数
  48.         delay(5);//延时,相当于避开忙碌时间
  49.         E=1;//置高下降沿取走数据
  50.         delay(5);
  51.         E=0;               
  52. }

  53. /***********************************/
  54. /*将2位16进制码转换成压缩型BCD码子程序*/
  55. /***********************************/
  56. void zhuanhuan(uchar dat2e)
  57. {
  58.         uchar temp;
  59.         temp=dat2e;//将要转换的数给变量temp
  60.         dat2e&=0xf0;//将低四位清0
  61.         dat2e>>=4;//右移四位得到高四位码
  62.         dat2e&=0x0f;//与0x0f想与确保高四位为0
  63.         if(dat2e<=0x09)
  64.         {                 
  65.                 duzhi(0x30+dat2e);//lcd显示键值高四位
  66.         }
  67.         else
  68.         {
  69.                 dat2e=dat2e-0x09;
  70.                 duzhi(0x40+dat2e);
  71.         }
  72.         dat2e=temp;
  73.         dat2e&=0x0f;
  74.         if(dat2e<=0x09)
  75.         {
  76.                 duzhi(0x30+dat2e);//lcd显示低四位值
  77.         }
  78.         else
  79.         {
  80.                 dat2e=dat2e-0x09;
  81.                 duzhi(0x40+dat2e);
  82.         }
  83.         duzhi(0x48);                 //显示字符'H'
  84. }
  85. /***********************************/
  86. /**********蜂鸣器响一声程序*********/
  87. /***********************************/
  88. void bbt()
  89. {
  90.         BBT=~BBT;//取反
  91.         delay(200);//延时
  92.         BBT=1;//响完后,将它关掉,防止它响
  93. }
  94. /***********************************/
  95. /**************显示子程序************/
  96. /***********************************/
  97. void disp()
  98. {

  99.         duzhi(0x20);//显示空格
  100.         zhuanhuan(dat[2]);//将数据代码给液晶显示

  101. }
  102. /*******************************/
  103. /*************主程序************/
  104. /*******************************/
  105. void main()
  106. {
  107.         uchar i;//定义变量
  108.         xeizhi(0x01);//清屏
  109.         xeizhi(0x38);//打开主功能
  110.         xeizhi(0x0c);//开显示关光标,不闪烁
  111.         xeizhi(0x06);//地址自动将字向右移一位
  112.         xeizhi(0x80);//将数据放显示区
  113.         for(i=0;i<16;i++)//循环16次,将字显示出来
  114.         duzhi(table[i]);//显示字符表
  115.         EA=1;//开总中断
  116.         EX0=1;//开定时器0中断
  117.         ET0=1;//开外部中断0
  118.         TR0=0;//将定时器关掉
  119.         IT0=1;//设置外中断下降沿触发方式
  120.         TMOD=0x01;//设置定时器方式寄存器为方式1的模式下工作
  121.         TH0=0;//将定时器高位清0
  122.         TL0=0;//将定时器低位清0
  123.         while(1)
  124.         {
  125.                 disp();        //将四种代码显示出来
  126.         }
  127. }
  128. /*******************************/
  129. /**********解码中断程序**********/
  130. /*******************************/  
  131. void Int0() interrupt 0  
  132. {  
  133.         uchar i,j;  
  134.         EX0=0;// 关闭外部中断0   
  135.         i=10;// 0.793ms延时,运行10次  
  136.         while(--i)//定时0.793ms,延时0.793ms*10=7.93ms   
  137.     {  
  138.         TH0=0xfc;  
  139.         TL0=0xe7;  
  140.         TR0=1;  
  141.         while(!TF0);//如果等于0则一直执行,用查询的方法判断定时器时间到了没有  
  142.         TF0=0;//清掉定时器标志位  
  143.         TR0=0;//这7.93ms期间只要IR_Out变高电平,就非合法的红外信号,跳出
  144.         if(IR)  
  145.         {  
  146.             EX0=1;//准许中断  
  147.             return ;  
  148.         }  
  149.     }   
  150.         // 程序进行到这里,表明是合法的红外信号(利用9ms判断)  
  151.         while(!IR);// 等待9ms低电平过去, 程序进行到这里,表明经过9ms低电平   
  152.         TH0=0xf6;  
  153.         TL0=0xff;  
  154.         TR0=1;  
  155.         while(!TF0);//再次查询定时器时间到了没有?  
  156.         TF0=0;  
  157.         TR0=0;// 延时2.305ms   
  158.         if(!IR) //IR为低表明是连发码,不予理睬,跳出   
  159.         {  
  160.             EX0=1;  
  161.             return;  
  162.         }// 程序进行到这里,表明是引导码,等待4.5ms高电平的过去  
  163.         while(IR);      
  164.         for(i=0;i<4;i++)//开始接收用户码   
  165.     {  
  166.         for(j=0;j<8;j++)  
  167.         {
  168.             while(!IR);// 等待低电平过去  
  169.             dat[i]>>=1;//把上次的数据位右移一位  
  170.             TH0=0xfc;  
  171.             TL0=0xe7;  
  172.             TR0=1;  
  173.             while(!TF0);  
  174.             TR0=0;  
  175.             TF0=0;//延时0.793ms   
  176.             if(IR)// 若为数据"1",则延时后IR_Out为高电平   
  177.             {  
  178.                 dat[i]|=0x80;// 所有数据位1放最高位  
  179.                 while(IR);// 等待高电平过去
  180.             }  
  181.         }
  182.                         
  183.     }
  184.         /*************遥控键码值即自己要处理的事情************/     
  185.         /*switch(dat[2])
  186.         {

  187.                 case 0x45:
  188.                 led=~led;
  189.                 break;

  190.         }*/
  191.     EX0=1;// 开中断  
  192.     return;  
  193. }
复制代码

评分

参与人数 2黑币 +58 收起 理由
杨雪飞 + 8 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:370644 发表于 2019-8-24 11:22 | 只看该作者
真心的想发出来,望高人指点!
回复

使用道具 举报

板凳
ID:138119 发表于 2019-8-24 12:43 | 只看该作者
while(IR); while(!TF0);    这样的太多,占用资源太大,这是程序的不足。

一般写法:用定时器定时200us或其他值的中断,这里有个变量在自加,然后打开接收端口的上升沿或下降沿中断(忘了),根据时间 判断是高电平还是低电平, 这样解码,效率要高一些~
回复

使用道具 举报

地板
ID:585455 发表于 2020-9-24 10:48 | 只看该作者
顯示那裡修改一下,讓搖控編碼全顯示。
void disp()
{
        uchar i;
              for(i=0;i<4;i++){
           duzhi(0x20);
           zhuanhuan(dat[i]);}

}
回复

使用道具 举报

5#
ID:65759 发表于 2020-9-27 09:52 | 只看该作者
这个真心实用啊~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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