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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機紅外遙控器解碼實驗 C語言和匯編2個版本的程序都有

[復制鏈接]
跳轉到指定樓層
樓主
注:
每個EXP實驗的文件夾下文件夾分別是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。
P_PROTEUS_ASM        為PROTEUS匯編實例工程
P_PROTEUS_C        為PROTEUS C51仿真實例工程
P_EMULATOR_C        為硬件仿真器(可選配件)C51實例工程
P_EMULATOR_ASM        為硬件仿真器匯編實例工程
一般情況下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下載脫機運行

P_ISP_C,P_ISP_ASM為ISP下載脫機運行實例。比如看門狗實驗,仿真器不支持,因為復位信號被仿真器接管,所以就只能做硬件脫機實驗,通過ISP下載程序。

如果文件夾帶有(缺省)說明暫時沒有提供此程序,可根據需要再添加。
匯編和c的代碼都有很全面.

c語言程序:
  1. /*************************************************  
  2. *文件名稱: main.c
  3. *作 者:   
  4. *版 本:    V1.00
  5. *說 明:    紅外遙控器解碼實驗
  6. *修改記錄:  
  7. --------------------------------------------------
  8. *Descriptoon:
  9. *接線說明:P32-紅外接收,P25-RS,P26-RW,P27-EN,
  10.            P00~P07-DB0~DB7                 
  11. **************************************************/                        

  12. #include <reg52.h>

  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. //char code SST516[3] _at_ 0x003b;
  16. #define c(x)(x*110592/120000) //晶振11.0592

  17. uchar Lcd_Buf[4];             //顯示數據緩沖區         
  18. unsigned char Ir_Buf[4];      //用于保存解碼結果
  19. sbit Ir_Pin=P3^2;             //紅外線數據接口
  20. sbit rs=P2^0;                     //LCD數據命令端
  21. sbit rw=P2^1;                          //讀寫接口
  22. sbit lcde=P2^2;                          //使能接口
  23. uchar code table[]=" WWW#WINDWAY$CN ";//LCD顯示數據
  24. uchar code table1[]="Wait for IR in..";
  25. uchar code table2[]="  IR DATA...";
  26.                   
  27.            unsigned char code Led_Tab[]={
  28.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,
  29.         0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共陽極數碼顯示碼0-F
  30. unsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //數碼管位選,屏蔽前兩位
  31. unsigned char Led_Buf[4]; //顯示緩沖區
  32. char Led_Index;           //定義位選         
  33. unsigned char Ir_Buf[4];  //用于保存解碼結果

  34. sbit LCD_E = P2^7;
  35. //========1MS延時====================================
  36. void delay(uint z)
  37. {
  38.         uint x,y;
  39.         for(x=z;x>0;x--)
  40.                 for(y=113;y>0;y--);
  41. }
  42. //======LCD寫命令=====
  43. void write_com(uchar com)
  44. {
  45.         rs=0;
  46.         lcde=0;
  47.         P0=com;
  48.         lcde=1;
  49.         delay(1);//延時1MS跳過忙信號
  50.         lcde=0;
  51.         delay(1);
  52. }
  53. //======LCD寫數據=====================================
  54. void write_date(uchar date)
  55. {
  56.         rs=1;
  57.         lcde=0;
  58.         P0=date;
  59.         lcde=1;
  60.         delay(1);
  61.         lcde=0;
  62.         delay(1);
  63. }
  64. //=====初始化函數=====================================
  65. void init()
  66. {        
  67.         uchar num;
  68.         rw=0;                //允許LCD寫
  69.         lcde=0;
  70.         write_com(0x38);//顯示模式設置                                                         
  71.         write_com(0x0c);//顯示開及光標設置
  72.         write_com(0x06);//顯示光標移動設置
  73.         write_com(0x01);//清屏
  74.         write_com(0x80);//顯示首地址
  75.         for(num=0;num<15;num++)//顯示第一行
  76.         {
  77.                 write_date(table[num]);
  78.                 delay(1);
  79.         }
  80.         write_com(0x80+0x40);//顯示第二行
  81.         for(num=0;num<16;num++)
  82.         {
  83.                 write_date(table1[num]);
  84.                 delay(1);
  85.         }
  86.         TMOD=0x10;                //設置定時器0、1工作模式為1
  87. }
  88. //=====顯示解碼========================================
  89. void write_ir(uchar date)
  90. {
  91.         uchar tmp, num,ff;         

  92.         if(ff==0)
  93.         {
  94.                 ff++;
  95.                 write_com(0x01);
  96.                 write_com(0x80);
  97.                 for(num=0;num<12;num++)
  98.                 {
  99.                         write_date(table2[num]);
  100.                         delay(1);
  101.                 }                 
  102.         }
  103.         
  104.         write_com(0xC0+6);//定位在第二行第六位
  105.         tmp = date>>4;                        // 高四位         
  106.         write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
  107.         write_com(0xC0+7);//定位第二行第七位           
  108.         tmp = date&0x0F;                        // 低四位
  109.         write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);         

  110. }
  111. //======================================================
  112. //解碼取回低電平
  113. unsigned int Ir_Get_Low()
  114. {
  115.         TL1=0;
  116.         TH1=0;
  117.         TR1=1;
  118.         while(!Ir_Pin && (TH1&0x80)==0);   //等待低電平到來              
  119.         TR1=0;           
  120.         return TH1*256+TL1;//提取低電平時間間隔時長
  121. }
  122. //======================================================
  123. //解碼取回高電平========================================
  124. unsigned int Ir_Get_High()
  125. {
  126.         TL1=0;
  127.         TH1=0;
  128.         TR1=1;
  129.         while(Ir_Pin && (TH1&0x80)==0);//等待高電平到來
  130.         TR1=0;
  131.         return TH1*256+TL1;//提取高電平時間間隔時長
  132. }
  133. //======================================================
  134. //======================================================

  135. void main()
  136. {
  137.         unsigned int temp;
  138.         char i,j;
  139.         init();        //初始化
  140. //=====用do做循環,等待遙控按鍵=========================
  141.         do{
  142. restart:
  143.                 while(Ir_Pin) ;//等待低電平

  144.                 temp=Ir_Get_Low();//把低電平附給變量
  145.                 if(temp<c(8500) || temp>c(9500)) continue;//引導脈沖低電平等待9000us
  146.                 temp=Ir_Get_High();//把高電平附給變量
  147.                 if(temp<c(4000) || temp>c(5000)) continue;//引導脈沖高電平等待4500us
  148.                 //連續讀出32個字節
  149.                 for(i=0;i<4;i++) //4個字節
  150.                 {
  151.                         for(j=0;j<8;j++) //每個字節8位
  152.                         {
  153.                                 temp=Ir_Get_Low();
  154.                                 if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳過低電平
  155.                                 temp=Ir_Get_High();
  156.                                 if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳過高電平
  157.                                 Ir_Buf[i]>>=1;//把電平移進數組


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

匯編語言:


  1. ;-----------------------------------------------
  2.        IRCOM  EQU  20H       ;20H-23H IR使用
  3.         X     EQU  26H       ;LCD 地址變量

  4.        IRIN   EQU  P3.2
  5. ;       BEEP   EQU  P3.7
  6. ;       RELAY  EQU  P1.0
  7.       
  8.         RS    EQU  P2.0
  9.         RW    EQU  P2.1
  10.         EN    EQU  P2.2
  11. ;------------------------------------------------
  12.          ORG 0000H
  13.          JMP  MAIN
  14. ;------------------------------------------------
  15.           ORG 0100H
  16. MAIN:
  17.           MOV   SP,#40H
  18.           MOV   A,#00H
  19.           MOV   R0,#20H
  20. LOOP0:    MOV   @R0,A          ;20H-26H清零
  21.           INC   R0
  22.           CJNE  R0,#27H,LOOP0
  23.           SETB  IRIN
  24.           CALL  SET_LCD
  25.           CALL  MENU1
  26. LOOP1:
  27.           CALL  IR_IN
  28.           CALL  IR_SHOW

  29. ;          MOV  A,22H
  30. ;          CJNE  A,#40H,LOOP2    ;K17鍵按下
  31. ;          CLR   RELAY           ;繼電器吸合
  32. ;LOOP2:    CJNE  A,#04H,LOOP3    ;K19鍵按下
  33. ;          SETB  RELAY           ;繼電器關閉
  34. ;LOOP3:   
  35.            JMP   LOOP1
  36.          
  37. ;-----------------------------------------------------
  38. ;  LCD 初始化設置
  39. ;-----------------------------------------------------
  40. SET_LCD:
  41.           CLR  EN
  42.           CALL  INIT_LCD     ;初始化 LCD
  43.           CALL  DELAY1
  44.           MOV  DPTR,#INFO1   ;指針指到顯示信息1
  45.           MOV  A,#1          ;顯示在第一行
  46.           CALL  LCD_SHOW
  47.           MOV  DPTR,#INFO2   ;指針指到顯示信息2
  48.           MOV  A,#2          ;顯示在第二行
  49.           CALL  LCD_SHOW
  50.           RET
  51. ;-----------------------------------------------------
  52. INIT_LCD:                 ;8位I/O控制 LCD 接口初始化
  53.           MOV  A,#38H     ;雙列顯示,字形5*7點陣
  54.           CALL  WCOM
  55.           CALL  DELAY1
  56.           MOV  A,#38H     ;雙列顯示,字形5*7點陣
  57.           CALL  WCOM
  58.           CALL  DELAY1
  59.           MOV  A,#38H     ;雙列顯示,字形5*7點陣
  60.           CALL  WCOM
  61.           CALL  DELAY1
  62.           MOV  A,#0CH     ;開顯示,關光標,
  63.           CALL  WCOM
  64.           CALL  DELAY1
  65.           MOV  A,#01H     ;清除 LCD 顯示屏
  66.           CALL  WCOM
  67.           CALL  DELAY1
  68.           RET
  69. ;----------------------------------------------------
  70. LCD_SHOW:       ;在LCD的第一行或第二行顯示信息字符

  71.           CJNE  A,#1,LINE2  ;判斷是否為第一行
  72.   LINE1:  MOV  A,#80H       ;設置 LCD 的第一行地址
  73.           CALL  WCOM        ;寫入命令
  74.           CALL  CLR_LINE    ;清除該行字符數據
  75.           MOV  A,#80H       ;設置 LCD 的第一行地址
  76.           CALL  WCOM        ;寫入命令
  77.           JMP  FILL

  78.   LINE2:  MOV  A,#0C0H      ;設置 LCD 的第二行地址
  79.           CALL  WCOM        ;寫入命令
  80.           CALL  CLR_LINE    ;清除該行字符數據
  81.           MOV  A,#0C0H      ;設置 LCD 的第二行地址
  82.           CALL  WCOM
  83.   FILL:   CLR  A            ;填入字符
  84.           MOVC  A,@A+DPTR   ;由消息區取出字符
  85.           CJNE  A,#0,LC1    ;判斷是否為結束碼
  86.           RET
  87.   LC1:    CALL  WDATA       ;寫入數據
  88.           INC  DPTR         ;指針加1
  89.           JMP  FILL         ;繼續填入字符
  90.           RET
  91. ;---------------------------------------------------
  92. CLR_LINE:                  ;清除該行 LCD 的字符
  93.           MOV  R0,#24
  94.    CL1:   MOV  A,#' '
  95.           CALL  WDATA
  96.           DJNZ  R0,CL1
  97.           RET
  98. ;----------------------------------------------------
  99. MENU1:                      ;LCD 顯示工作菜單信息
  100.          MOV   DPTR,#MENU2
  101.          MOV   A,#1         ;在第一行顯示信息
  102.          CALL  LCD_SHOW
  103.          RET
  104. MENU2:  DB  " REMOTE CONTROL ",0
  105. ;-----------------------------------------------------
  106. INFO1:  DB  "                ",0  ;LCD 第一行顯示信息
  107. INFO2:  DB  "  IR-CODE: --H  ",0  ;LCD 第二行顯示信息
  108. ;-----------------------------------------------------

  109. ;-----------------------------------------------------
  110. ; 寫指令、數據使能子程序
  111. ;-----------------------------------------------------
  112. WCOM:
  113.           MOV  P0,A        ;寫指令使能
  114.           CLR RS           ;RS=L,RW=L,D0-D7=指令碼,E=高脈沖
  115.           CLR RW
  116.           SETB EN
  117.           CALL  DELAY0
  118.           CLR EN
  119.           RET
  120.                   
  121. WDATA:
  122.           MOV   P0,A      ;寫數據使能
  123.           SETB  RS        ;RS=H,RW=L,D0-D7=數據,E=高脈沖
  124.           CLR   RW
  125.           SETB  EN
  126.           CALL  DELAY0
  127.           CLR   EN
  128.           RET

  129. DELAY0:   MOV  R7,#250      ;延時500微秒
  130.           DJNZ  R7,$
  131.           RET
  132. ;---------------------------------------------------
  133. ;在 LCD 第二行顯示字符
  134. ;A=ASC DATA, B=LINE X POS
  135. ;---------------------------------------------------
  136. LCDP2:                    ;在LCD的第二行顯示字符
  137.          PUSH  ACC        ;
  138.          MOV  A,B         ;設置顯示地址
  139.          ADD  A,#0C0H     ;設置LCD的第二行地址
  140.          CALL  WCOM       ;寫入命令
  141.          POP  ACC         ;由堆棧取出A
  142.          CALL  WDATA      ;寫入數據
  143.          RET
  144. ;---------------------------------------------------
  145. ; IR 譯碼子程序
  146. ;---------------------------------------------------
  147. IR_IN:              
  148.           MOV   R0,#IRCOM
  149. I1:      JNB  IRIN,I2       ;等待 IR 信號出現
  150.           JMP  I1
  151. I2:      MOV  R4,#20
  152. I20:     CALL  DEL
  153.           DJNZ  R4,I20
  154.           JB  IRIN,I1        ;確認IR信號出現
  155. I21:     JB  IRIN,I3        ;等 IR 變為高電平
  156.           CALL  DEL
  157.           JMP  I21
  158. I3:      MOV  R3,#0         ;8位數清為0
  159. LL:      JNB  IRIN,I4       ;等 IR 變為低電平
  160.           CALL  DEL
  161.           JMP  LL
  162. I4:      JB  IRIN,I5        ;等 IR 變為高電平
  163.           CALL  DEL
  164.           JMP  I4
  165. I5:      MOV  R2,#0         ;0.14ms 計數
  166. L1:      CALL  DEL
  167.           JB  IRIN, N1       ;等 IR 變為高電平
  168.                              ;IR=0,檢查R2中的計數值
  169.           MOV  A,#8
  170.           CLR  C
  171.           SUBB  A,R2         ;判斷高低位
  172.                              ;IF C=0  BIT=0
  173.           MOV  A,@R0
  174.           RRC  A
  175.           MOV  @R0,A         ;處理完一位
  176.           INC  R3
  177.           CJNE  R3,#8,LL     ;需處理完8位  
  178.           MOV  R3,#0
  179.           INC  R0
  180.           CJNE  R0,#24H,LL   ;收集到4字節了
  181.           JMP  OK
  182. N1:      INC  R2
  183.           CJNE  R2,#30,L1    ;0.14ms 計數過長則時間到自動離開
  184. OK:      RET
  185. ;--------------------------------------------------------------------
  186. IR_SHOW:
  187.           MOV A,22H
  188.           CPL A                ;將22H取反后和23H比較
  189.           CJNE A,23H,IR_SHOW1  ;如果不等表示接收數據發生錯誤,放棄。
  190.           CALL   CONV
  191. ;          CALL  BEEP_BL        ;蜂鳴器鳴響表示解碼成功
  192. IR_SHOW1: RET
  193. ;--------------------------------------------------------------------
  194. ;轉換為 ASCII 碼并顯示
  195. ;--------------------------------------------------------------------
  196. CONV:
  197.           MOV   X,#11        ;設置顯示起始位置
  198.           MOV   A,22H
  199.           ANL   A,#0F0H      ;取出高四位二進制數
  200.           SWAP  A            ;高四位與低四位互換
  201.           PUSH  ACC          ;壓入堆棧
  202.           CLR   C            ;C=0
  203.           SUBB  A,#0AH       ;減10
  204.           POP   ACC          ;彈出堆棧
  205.           JC    ASCII0       ;該數小于10,轉ASCII0
  206.           ADD   A,#07H       ;大于10的數加上37H
  207. ASCII0:   ADD   A,#30H       ;小于10的數加上30H
  208.           MOV   B,X
  209.           CALL  LCDP2

  210.           MOV   A,22H
  211.           ANL   A,#0FH        ;取出低四位二進制數
  212.           PUSH  ACC
  213.           CLR   C
  214.           SUBB  A,#0AH        ;減10
  215.           POP   ACC
  216.           JC    ASCII1        ;該數小于10,轉ASCII0
  217.           ADD   A,#07H        ;大于10的數加上37H
  218. ASCII1:   ADD   A,#30H        ;小于10的數加上30H
  219.           INC   X
  220.           MOV   B,X
  221.           CALL  LCDP2
  222.           RET
  223. ;--------------------------------------------------------
  224. ;蜂鳴器響一聲子程序
  225. ;--------------------------------------------------------
  226. BEEP_BL:
  227.          MOV  R6,#100
  228.   BL1:   CALL  DEX1
  229. ;         CPL  BEEP
  230.          DJNZ  R6,BL1
  231.          MOV  R5,#25
  232.          CALL  DELAY
  233.          RET
  234. DEX1:   MOV  R7,#180
  235. DEX2:   NOP
  236.          DJNZ  R7,DEX2
  237.          RET
  238. DELAY:                    ;延時R5×10MS
  239.          MOV  R6,#50
  240.   D1:    MOV  R7,#100
  241.          DJNZ  R7,$
  242.          DJNZ  R6,D1
  243.          DJNZ  R5,DELAY


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

下載:
EXP19_紅外遙控器解碼實驗.zip (70.27 KB, 下載次數: 54)

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

使用道具 舉報

沙發
ID:436643 發表于 2018-11-30 16:34 | 只看該作者
新手看看程序
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产欧美一区 | 中文字幕第二区 | 我爱操 | 国产成人精品区一区二区不卡 | 欧美日韩国产中文 | 九九热这里只有精品在线观看 | 精品九九 | 性色视频在线观看 | 作爱视频免费看 | www.日本国产| 天天爽夜夜爽精品视频婷婷 | 国产成人精品一区二 | 欧美日韩在线视频观看 | 精品国产一区二区三区性色 | 九九久久这里只有精品 | 日韩午夜在线播放 | aaa级片| 97视频成人 | 中文字幕欧美一区 | 91亚洲精品久久久电影 | 国产91久久精品一区二区 | 超碰在线播 | 欧美一区免费 | 成人午夜精品 | 国产成人精品一区 | 九九久久精品 | 亚洲精品片| 天天av综合 | 国产精品久久久乱弄 | 日韩资源 | 欧美国产日韩在线观看 | 成人在线精品 | 成人av一区二区三区 | 国产精品一区二区三区四区 | 超碰人人人人 | 免费激情 | 亚洲啪啪一区 | 欧美v片 | 午夜精品在线 | 日韩欧美精品一区 | 色婷婷激情 |