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

標題: 51單片機8X8鍵盤,紅外線收發,串口收發,1602顯示按鍵源程序+仿真圖 [打印本頁]

作者: ZMRGHY    時間: 2019-4-20 01:33
標題: 51單片機8X8鍵盤,紅外線收發,串口收發,1602顯示按鍵源程序+仿真圖
3個89C52
8x8鍵盤
U3單片機檢測8X8鍵盤,對按鍵紅外線編碼發出。
U2單片機接收,U3單片機發出的紅外信號,解碼后由串口發出。
U1接收U2單片機發出的串口數據。



單片機源程序如下:
  1. #include <STC89C5xRC.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. bit overflag, datafinish;                //開始接收數據,數據處理完畢
  5. bit Updata = 0;
  6. uchar times;                                                                 //定時器T0溢出次數
  7. uchar orders[33];                                                //接收輸入的代碼序列(times組成的33字節級數)
  8. uchar IRCODE[4];                                                //地址碼,地址反碼,數據碼,數據反碼

  9. void initial()                                                        //初始化
  10. {

  11.         SCON=0X50;                        //設置為工作方式1
  12.         TMOD=0X21;                        //設置計數器工作方式2
  13.         PCON=0X80;                        //波特率加倍
  14.         TH0=0xfe;                                                                        //晶振頻率為12MHz
  15.         TL0=0x0c;                                                                        //T0定時間隔為0.5ms
  16.         TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
  17.         TL1=0XF3;
  18.         TR1=1;                                        //打開計數器
  19.         IT0=1;                                                                                //外部中斷INT1下降沿觸發
  20.         EX0=1;                                                                                //允許外部中斷INT1
  21.         ET0=1;                                                                                //允許定時器T0中斷
  22.         TR0=1;                                                                                //啟動定時器T0
  23.         EA=1;                                                                                        //打開總中斷
  24. }

  25. /*******************************************************************************
  26. * 函數名         :UsartInit()
  27. * 函數功能                   :設置串口
  28. * 輸入           : 無
  29. * 輸出                  : 無
  30. *******************************************************************************/
  31. void UsartInit()
  32. {
  33.         SCON=0X50;                        //設置為工作方式1
  34.         TMOD=0X20;                        //設置計數器工作方式2
  35.         PCON=0X80;                        //波特率加倍
  36.         TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
  37.         TL1=0XF3;
  38.         TR1=1;                                        //打開計數器
  39. }
  40. void time0() interrupt 1    //T0中斷,每0.5ms計數一次
  41. {
  42.         TH0=0xfe;                                                                        //重新載入定時參數
  43.         TL0=0x0c;
  44.         times++;                                                                        //計算每位的寬度
  45. }

  46. void infrared()interrupt 0                //外部中斷,接收一個數據位
  47. {                                                                                                                //每接收到一個下降沿,中斷發生一次
  48.         static bit startflag;                        //定義“開始接收”標志
  49.         static uchar i;
  50.         if(startflag)                                                        //開始接收標志
  51.         {
  52.                 if(times<32 && times>=16)
  53.                         i=0;                                                                        //記下引導碼長度(正常為9ms)
  54.                 orders[i]=times;                                //記錄一個數據位的長度
  55.                 times=0;                                                                //下次中斷發生重新計數
  56.                 i++;                                                                                //數組指針指向下個存儲單元
  57.                 if(i==33)                                                                //如果記滿了32字節數據和引導碼
  58.                 {
  59.                         overflag=1;                                                //建立“已記滿”標志
  60.                         i=0;                                                                        //數組指針指向開頭
  61.                 }
  62.         }
  63.         else                                                                                        //如果尚未開始接收數據
  64.         {
  65.                 startflag=1;                                                //建立“開始接收”標志
  66.                 times=0;
  67.         }
  68. }

  69. void process()                                                                //把接收33字節序列信息轉換成地址和數據代碼
  70. {
  71.         uchar i,j,k=1;                                                //指向33字節數組,跳過引導段計數
  72.         for(i=0;i<4;i++)                                        //處理四組數據
  73.         {
  74.                 for(j=1;j<=8;j++)                                //處理一組數據8字節
  75.                 {
  76.                         IRCODE[i]>>=1;                                //先假定當前位為“0”
  77.                         if(orders[k]>3)
  78.                                 IRCODE[i]|=0x80;                //大于1.5ms為“1”
  79.                         k++;
  80.                 }
  81.         }
  82.         datafinish=1;
  83. }

  84. void main()
  85. {
  86.         uchar i;
  87.         initial();                                                        //初始化
  88.         while(1)                                                                //等待中斷發生
  89.         {
  90.                 if(Updata ==1)
  91.                 {
  92.                         Updata = 0;
  93.                         for(i=0;i<4;i++)
  94.                         {
  95.                                 SBUF=IRCODE[i];     //將接收到的數據放入到發送寄存器
  96.                                 while(!TI);                         //等待發送數據完成
  97.                                 TI=0;                                                 //清除發送完成標志位
  98.                         }
  99.                 }
  100.                 if(overflag)                                        //數據接收完畢
  101.                 {
  102.                         process();                                        //處理數據,完成標志datafinish
  103.                         overflag=0;
  104.                 }
  105.                 if(datafinish)
  106.                 {
  107.                         datafinish=0;
  108.                         Updata = 1;
  109.                 }
  110.                
  111.         }
  112. }
  113. ……………………

  114. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
IrSend_UartSend_UartReceive.rar (150.92 KB, 下載次數: 64)




作者: Caropoint    時間: 2019-4-20 09:48
謝謝分享
作者: f2717851    時間: 2019-4-20 10:21
謝謝分享
作者: sccdcl    時間: 2019-4-20 11:47

謝謝分享
作者: ZMRGHY    時間: 2019-4-26 11:45
f2717851 發表于 2019-4-20 10:21
謝謝分享

不用謝
作者: ZMRGHY    時間: 2019-4-26 11:46
Caropoint 發表于 2019-4-20 09:48
謝謝分享

不用謝
作者: cb474265474265    時間: 2019-4-27 05:52
謝謝分享。
作者: jakinhu    時間: 2019-8-25 10:52
謝謝分享

作者: 單片機凡仔    時間: 2019-8-28 13:01
樓主能不能分享一下你的仿真





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1