欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3857|回復: 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或其他值的中斷,這里有個變量在自加,然后打開接收端口的上升沿或下降沿中斷(忘了),根據時間 判斷是高電平還是低電平, 這樣解碼,效率要高一些~
回復

使用道具 舉報

無效樓層,該帖已經被刪除
5#
ID:585455 發表于 2020-9-24 10:48 | 只看該作者
顯示那裡修改一下,讓搖控編碼全顯示。
void disp()
{
        uchar i;
              for(i=0;i<4;i++){
           duzhi(0x20);
           zhuanhuan(dat[i]);}

}
回復

使用道具 舉報

6#
ID:65759 發表于 2020-9-27 09:52 | 只看該作者
這個真心實用啊~~
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表