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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1930|回復: 2
打印 上一主題 下一主題
收起左側

簡單8數碼管顯示紅外編碼 單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:55129 發表于 2019-4-13 02:31 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
無需復雜的電路,使用8個數碼管既可顯示出紅外遙控的編碼,電路簡單,代碼少,適合新手玩,不知道論壇有沒有人發過,新人新帖

單片機源程序如下:
  1. /***************************************************************************
  2. 標題:        紅外遙控解碼器數碼管顯示   使用12mhz晶振
  3. 管腳:P33紅外接收數據,P0口數碼管數據口,P10數碼管千位,P11數碼管百位,P12數碼管十位,P13數碼管個位
  4. 效果:        運行程序,按遙控器按鍵,在數碼管上顯示相應的地址碼-控制碼(以16進制顯示)
  5.                         分兩段,前段是地址碼,后段為控制碼,用點隔開,顯示兩字節,忽略反碼,使用共陰數碼管

  6. ******************************************************************************/

  7. #include <reg51.h>

  8. sbit SMG_0 = P1^0;        //定義數碼管(千萬位)
  9. sbit SMG_1 = P1^1;        //定義數碼管(百萬位)
  10. sbit SMG_2 = P1^2;        //定義數碼管(十萬位)
  11. sbit SMG_3 = P1^3;        //定義數碼管(萬位)
  12. sbit SMG_4 = P1^4;        //定義數碼管(千位)
  13. sbit SMG_5 = P1^5;        //定義數碼管(百位)
  14. sbit SMG_6 = P1^6;        //定義數碼管(十位)
  15. sbit SMG_7 = P1^7;        //定義數碼管(個位)

  16. /********數據定義*************************************************************/
  17. sbit hwx=P3^3;                  //紅外接收數據引腳,
  18. code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};        //數碼管段值表 0-9 a-f
  19. unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0};        //顯示緩沖
  20. unsigned char ly_lhj[4];        //保存NEC的四個字節數據
  21. unsigned char ly_ct=0;    //計數時間
  22. bit ly_flag=1;                  //成功接收標志

  23. //函數聲明:
  24. void display();//定義顯示函數,直接顯示緩沖區數值
  25. void delay(void);
  26. void delay100us(void);

  27. /***********外中斷1入口函數,P33引腳,紅外線接收IC數據腳**************************/
  28. void hongwai(void) interrupt 2
  29.         {
  30.                 unsigned char i,ia;
  31. /**************開始判斷是否為NEC波形引導碼的前9MS和后4.5MS******************************/
  32.                 ly_ct=0;              //計數時間清0

  33.                 while(!hwx)     //hwx紅外管腳

  34.                 delay100us();         //調用0.1MS延時計數,ly_ct每調用一次加1

  35.                 if(ly_ct<80||ly_ct>100)            //NEC引導碼前9MS,ly_ct約等于90,給個誤差值,用80-100之間來判斷

  36.                 return;

  37.                 ly_ct=0;              //計數時間請0

  38.                 while(hwx)

  39.                 {
  40.                         delay100us();

  41.                         if(ly_ct>50)        //NEC引導碼引導碼的后4.5MS,ly_ct約45

  42.                         return;

  43.                 }
  44.                
  45.                 if(ly_ct<40)        //NEC引導碼引導碼的后4。5MS,ly_ct約45

  46.                 return;

  47. /***********開始接收四個字節內容**************************************/

  48.                 for(i=0;i<4;i++)
  49.                 {
  50.                        
  51.                         for(ia=0;ia<8;ia++)
  52.                         {

  53.                                 while(!hwx);        //低電平開始,不處理只等待高電平接收

  54.                                 ly_ct=0;

  55.                                 while(hwx)   //高電平開始,
  56.                                         {       
  57.                                                
  58.                                                 delay100us();

  59.                                                 if(ly_ct>20)

  60.                                                 return;

  61.                                         }

  62. //高電平結束,判斷數據1或0向變量移入

  63.                                                 ly_lhj[i]>>=1;        //數據由高位移入低位

  64.                                                 if(ly_ct>10)        //時間量TH1高于10,即高于1MS判斷為1

  65.                                                 ly_lhj[i]|=0x80;

  66.                                 }

  67.                 }

  68.                 ly_flag=1;        //接收成功

  69.                 TF1=0;

  70. }

  71. //顯示函數,參數為顯示內容,只顯示兩位數

  72.         void display()
  73.         {

  74.                 SMG_0=0;        //選擇千萬位數碼管

  75.                 P0=table[ly_disdate[0]];        //

  76.                 delay();        //

  77.                 P0=0XFF;        //

  78.                 SMG_0=1;        //

  79.                 SMG_1=0;        //選擇百萬位數碼管SMG_b

  80.                 P0=table[ly_disdate[1]]|0x80;        //加上小數點

  81.                 delay();        //延時

  82.                 P0=0XFF;        //

  83.                 SMG_1=1;        //

  84.                 SMG_2=0;        //選擇十位數碼管

  85.                 P0=table[ly_disdate[2]];        //

  86.                 delay();        //

  87.                 P0=0XFF;        //

  88.                 SMG_2=1;        //

  89.                 SMG_3=0;        //選擇個位數碼管

  90.                 P0=table[ly_disdate[3]]|0x80;        //加上小數點;        //

  91.                 delay();        //

  92.                 P0=0XFF;        //

  93.                 SMG_3=1;        //
  94.                
  95.                 SMG_4=0;        //選擇千萬位數碼管

  96.                 P0=table[ly_disdate[4]];        //

  97.                 delay();        //

  98.                 P0=0XFF;        //

  99.                 SMG_4=1;        //

  100.                 SMG_5=0;        //選擇百萬位數碼管SMG_b

  101.                 P0=table[ly_disdate[5]]|0x80;        //加上小數點

  102.                 delay();        //延時

  103.                 P0=0XFF;        //

  104.                 SMG_5=1;        //

  105.                 SMG_6=0;        //選擇十位數碼管

  106.                 P0=table[ly_disdate[6]];        //

  107.                 delay();        //

  108.                 P0=0XFF;        //

  109.                 SMG_6=1;        //

  110.                 SMG_7=0;        //選擇個位數碼管

  111.                 P0=table[ly_disdate[7]];        //加上小數點

  112.                 delay();        //

  113.                 P0=0XFF;        //

  114.                 SMG_7=1;        //

  115.         }

  116. //延時子函數,短暫延時

  117. void delay(void)
  118.         {

  119.                 unsigned char i=10;

  120.                 while(i--);

  121.         }

  122. void delay100us(void)
  123.         {
  124.                 unsigned char i=15;
  125.                 while(i--);
  126.                 ly_ct++;
  127.         }

  128. void main(void)
  129.         {
  130.                 EA=1;        //首先開啟總中斷
  131.                 EX1=1; //開啟外部中斷1,紅外接收數據引腳
  132.                 IT1=1; //設置成下降沿觸發方式
  133.                 while(1)
  134.                         {
  135.                                 if(ly_flag)
  136.                                         {                 //接收成功處理顯示緩沖,以16進制顯示
  137.                                                 ly_flag=0;
  138.                                                 ly_disdate[0]=ly_lhj[0]/16;
  139.                                                 ly_disdate[1]=ly_lhj[0]%16;
  140.                                                 ly_disdate[2]=ly_lhj[1]/16;
  141.                                                 ly_disdate[3]=ly_lhj[1]%16;
  142.                                                 ly_disdate[4]=ly_lhj[2]/16;
  143.                                                 ly_disdate[5]=ly_lhj[2]%16;
  144.                                                 ly_disdate[6]=ly_lhj[3]/16;
  145.                                                 ly_disdate[7]=ly_lhj[3]%16;
  146.                                         }
  147.                                         display();//顯示緩沖內容

  148.                         }

  149.         }
復制代碼

所有資料51hei提供下載:
紅外遙控解碼8數碼管顯示.zip (36.27 KB, 下載次數: 30)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

板凳
ID:254123 發表于 2019-4-13 09:55 | 只看該作者
大佬,牛逼了
回復

使用道具 舉報

沙發
ID:1 發表于 2019-4-13 03:13 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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