久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc8a8k64s4a12單片機紅外解碼LCD1602顯示程序

  [復制鏈接]
跳轉到指定樓層
樓主
                                                                              stc8a8k64s4a12紅外解碼LCD1602顯示
    在原來解碼數碼管的程序上修復了8位LED燈初始顯示任意值bug,新增加了解碼顯示到LCD屏幕與pc串口端完全同步,可以通過三種有效解碼方式更加精確的對支持NEC協議的所有紅外遙控設備解碼,此外對于其他型號及平臺移植更為方便,希望有用到的 積極下載共享,有好的獨特想法的可以提出來共同討論,積極指正批評。

單片機源程序如下:
  1. ////////////////////////////////////////////////////////////
  2. //   紅外接收數據,查詢方式,并通過串口發送輸出  
  3. //   晶振:22.1184MHz         ,波特率:9600
  4. ////////////////////////////////////////////////////////////
  5. #include <STC8.H>
  6. #include "LCD1602.h"
  7. #define  LED P0
  8. sbit Ir_Pin = P2^7;             // 紅外接收頭信號輸出腳
  9. extern delay(uint time);
  10. uchar code lhc_table[16]="0123456789ABCDEF";
  11. uchar tempdata[16];
  12. uchar Ir_Buf[4]; // 用于保存解碼結果(Ir_Buf[0]--用戶碼L,Ir_Buf[3] --鍵反碼)

  13. // 獲取低電平時間 (其實是16位計數器的計數值,STC15系列定時器默認為16位自動重裝方式)
  14. uint Ir_Get_Low()
  15. {
  16.         TL0 = 0;                 // 清空16位計數器0
  17.         TH0 = 0;                 // 清空16位計數器0
  18.         TR0 = 1;                 // 計數器0開始運行
  19.         while (!Ir_Pin && (TH0<0x80));          // 信號引腳變成高或低電平時間>17ms退出(只要>12ms即可)
  20.                                       // 0x8000=32768,  32768*0.54253uS=17777.62 uS            
  21.         TR0 = 0;                          // 這里 ! 優先級大于&&     
  22.         return (TH0 * 256 + TL0);                  // 返回16位計數器的計數值。
  23. }

  24. // 獲取高電平時間(其實是16位計數器的計數值,STC15系列定時器默認為16位自動重裝方式)
  25. uint Ir_Get_High()
  26. {
  27.         TL0 = 0;                    // 清空16位計數器0
  28.         TH0 = 0;                    // 清空16位計數器0
  29.         TR0 = 1;
  30.         while (Ir_Pin && (TH0<0x40));           // 信號引腳變成低電平或高電平時間>17ms退出
  31.         TR0 = 0;
  32.         return (TH0 * 256 + TL0);
  33. }  

  34. void UART_init(void)                      // 9600@22.1184MHz
  35. {                  
  36.         //下面代碼設置定時器1
  37.         TMOD = 0x20;           // 0010 0000 定時器1工作于方式2(8位自動重裝方式)
  38.         TH1  = 0xFA;           // 波特率:57600 /22.1184MHZ
  39.         TL1  = 0xFA;           // 波特率:57600 /22.1184MHZ
  40.         TR1  = 1;
  41.         //下面代碼設置定串口
  42.         AUXR = 0x00;             // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0
  43.         SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接收)
  44. }        

  45. //  UART發送一字節        
  46. void UART_Send_Byte(uchar dat)
  47. {
  48.         SBUF = dat;
  49.         while (TI == 0);
  50.         TI = 0;             // 此句可以不要,不影響后面數據的發送,只供代碼查詢數據是否發送完成
  51. }

  52. void IR_work()  //紅外解碼程序
  53. {
  54.         tempdata[0]=lhc_table[Ir_Buf[0]/16];   //處理客戶碼
  55.         tempdata[1]=lhc_table[Ir_Buf[0]%16];
  56.         tempdata[2]='-';
  57.         tempdata[3]=lhc_table[Ir_Buf[1]/16];  //處理客戶碼
  58.         tempdata[4]=lhc_table[Ir_Buf[1]%16];
  59.         tempdata[5]='-';
  60.         tempdata[6]=lhc_table[Ir_Buf[2]/16];  //處理數據碼
  61.         tempdata[7]=lhc_table[Ir_Buf[2]%16];
  62.         tempdata[8]='-';
  63.         tempdata[9]=lhc_table[Ir_Buf[3]/16];  //處理數據反碼
  64.         tempdata[10]=lhc_table[Ir_Buf[3]%16];
  65.         LCD_write_string(5,1,tempdata);
  66.         LED=~Ir_Buf[2];
  67. }

  68. void main()
  69. {
  70.         uint time;
  71.         uchar i,j;
  72.         LED=0xff;
  73.         UART_init();
  74.         UART_Send_Byte(0X55);                // 測試串口工作是否正常
  75.         LCD_init();
  76.         delay(20);         //延時有助于穩定
  77.         LCD_clear();
  78.         
  79.         LCD_write_string(0,0,"LHC-DIY-STC8");
  80.         LCD_write_string(0,1,"code:");
  81.         while (1)
  82.         {
  83. start:
  84.                 ///////////// 接收同步信號 ///////////
  85.                 while (Ir_Pin);                    // 等待低電平出現
  86.                 time = Ir_Get_Low();        // 低電平區間16位計數器的計數值
  87.                 if ((time < 15667) || (time > 17510))   goto start;        
  88.                                                         // 引導脈沖低電平8500~9500us,T=12/22.1184=0.54253uS
  89.                                                         // 8500/0.54253uS=15667.3    9500/0.54253uS=17510.5
  90.                 time = Ir_Get_High();
  91.                 if ((time < 7372) || (time > 9216))  goto start;   // 引導脈沖高電平4000-5000us
  92.                                                                                      // 4000/0.54253uS=7372.8    5000/0.54253uS=9216
  93.                 ////////// 接收后續的4 字節數據        ////////
  94.                 for (i=0; i<4; i++)                  // 4個字節
  95.                 {
  96.                         for (j=0; j<8; j++)              // 每個字節8位
  97.                         {
  98.                                 time = Ir_Get_Low();                 // 接收每位560us 低電平
  99.                                 if ((time < 626) || (time > 1438))   goto start;                 // 340-780us
  100.                                                                                  // 340/0.54253uS=626.7    780/0.54253uS=1437.7
  101.                                 time = Ir_Get_High();                    // 接收每位560us或1690us高電平時間
  102.                                 if ((time>626) && (time<1438))  // 時間范圍為340-780us(中心值560us),
  103.                     {
  104.                          Ir_Buf[i] >>= 1;                // 因低位在先,所以數據右移,移入的最高位為0
  105.                                 }
  106.                     else if ((time>2728) && (time<3502))
  107.                 {                           // 時間判定范圍為1480~1900us(中心值1690us)
  108.                                                                             // 1480/0.54253uS=2727.9   1900/0.54253uS=3502.1
  109.                                         Ir_Buf[i] >>= 1;                // 因低位在先,所以數據右移,移入的最高位為0
  110.                                         Ir_Buf[i] |= 0x80;          // 最高位置1
  111.                                 }
  112.                     else                            // 不在上述范圍內則說明為誤碼,直接退出
  113.                                 {
  114.                                         goto start;        
  115.                                 }
  116.                         }
  117.                 }
  118.                 UART_Send_Byte(Ir_Buf[0]);                // 用戶碼低字節
  119.                 UART_Send_Byte(Ir_Buf[1]);                // 用戶碼高字節
  120.                 UART_Send_Byte(Ir_Buf[2]);                // 鍵碼
  121.                 UART_Send_Byte(Ir_Buf[3]);                // 鍵反碼
  122.                 IR_work();
  123.         }
  124. }  
復制代碼

所有資料51hei提供下載:
03 LCD1602顯示.7z (33.15 KB, 下載次數: 145)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:149992 發表于 2021-2-5 14:44 | 只看該作者
謝謝共享!,努力賺黑幣!
回復

使用道具 舉報

板凳
ID:675308 發表于 2021-2-8 08:53 來自手機 | 只看該作者
用stc8F系列的行嗎?
回復

使用道具 舉報

地板
ID:151533 發表于 2021-3-27 03:21 | 只看該作者
謝謝共享!下載了學習一下
回復

使用道具 舉報

5#
ID:74143 發表于 2022-4-23 17:13 | 只看該作者
移植到STC15W408AS無顯示。
回復

使用道具 舉報

6#
ID:378617 發表于 2022-9-12 02:55 | 只看該作者
8952還能用嗎
回復

使用道具 舉報

7#
ID:137736 發表于 2022-9-12 08:43 | 只看該作者
很好,下來調試一下
回復

使用道具 舉報

8#
ID:961114 發表于 2022-9-14 08:47 | 只看該作者
現在STC有DMA 直接支持 TFT接口I8080/MC6800方式并口刷屏,
TFT480*320, TFT320*240的 GUI 有 (uGFX + FreeRTOS) 在 32位8051, 
STC32G12K128上實現的開源案例!

或者先在 STC-ISP V6.90I 以上版本的 軟件的 調試接口中顯示部分顯示
有: OLED128*64虛擬顯示,  OLED320*240虛擬顯示
有: 示波器TFT320*240虛擬顯示,TFT480*320虛擬顯示

還有虛擬鍵盤/按鍵, USB-CDC/就是串口
顯示OLED12864很實用, STC 網站上 有 開源的 GUI/OLED12864, U8g2 在 32位 8051, STC32G12K128 上的實現,還有   GUI/U8g2-OLED12864 + FreeRTOS 在 STC32G12K128 上實現的例程,有DMA支持的 SPI/I2C 涮 OLED12864, MCU 無任何負擔! TFT480*320, TFT320*240的 GUI 有 (uGFX + FreeRTOS) 在 32位8051, STC32G12K128上實現的開源案例,DMA 直接支持 TFT接口I8080/MC6800方式并口刷屏
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 尤物视频在线免费观看 | 欧美性猛交一区二区三区精品 | 99精品欧美一区二区三区 | 天天夜夜操 | 久久成人免费视频 | 久久久精品一区二区 | 超碰在线网站 | 国产一区二区中文字幕 | 精品无码久久久久久国产 | 日韩视频1 | 国产麻豆一区二区三区 | 日韩视频1 | 精品91久久久 | av电影一区二区 | 99久久免费观看 | 亚洲一区久久 | 国产福利二区 | 国产精久久久久久久妇剪断 | 一区二区三区在线观看视频 | 久久天天躁狠狠躁夜夜躁2014 | 一级国产精品一级国产精品片 | 一级日韩| 在线观看视频一区 | 国产精品污www一区二区三区 | 特黄av| 日本黄色一级片视频 | 国产精品乱码一二三区的特点 | 国产亚洲精品美女久久久久久久久久 | 日本 欧美 三级 高清 视频 | 欧洲一区二区视频 | 伊人狠狠 | 欧美一级大片免费观看 | 天堂一区二区三区 | 拍真实国产伦偷精品 | 日韩欧美在线视频 | 久久久国产精品 | 91n成人| 欧美5区| 亚洲一区久久久 | 日本久草 | 日日夜精品视频 |