1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 單片機紅外遙控解碼ASM匯編程序 [打印本頁]

作者: liugengzhuang    時間: 2017-7-2 14:07
標題: 單片機紅外遙控解碼ASM匯編程序
51系列單片機做的紅外遙控解碼


單片機匯編語言源程序如下:
  1. /**紅外遙控解碼范例**/
  2. /**作者:田開坤**/
  3. /**較網上可以下載到的程序相比,本代碼考慮了解碼過程容易死機的問題,采取辦法解決了,可以解碼失敗,但決不死機**/

  4. DQ      equ     0ebh            ;P4.3定義接口,參考STC89C51數據手冊
  5. EX2     equ     0c2h            ;外部中斷2,參考STC89C51數據手冊
  6. SEG1    equ     0ffech          ;數碼管1(最右)
  7. SEG2    equ     0ffedh          ;數碼管2
  8. SEG3    equ     0ffeeh          ;數碼管3
  9. SEG4    equ     0ffefh          ;數碼管4(最左)
  10. BYT_DLY equ     5FH             ;延時函數參數變量
  11. DA_BUF  equ     40H             ;解碼出的數據緩沖區,包括41H


  12.                 ORG 0000h
  13.                 LJMP main

  14.                 ORG 003bh       ;外部中斷2入口地址,參考STC89C51數據手冊
  15.                 LJMP EINT3

  16.                 ORG 40h
  17. main:           MOV SP,#60h
  18.                 SETB EA
  19.                 SETB EX2
  20.                 SJMP [        DISCUZ_CODE_1        ]nbsp;         ;原地踏步,等中斷解碼


  21. //中斷接收解碼模塊

  22. EINT3:          CLR EA//關閉
  23.                 MOV R6,#10
  24. SB:             MOV BYT_DLY,#13 ;834uS
  25.                 ACALL DELAY     ;調用834微秒延時子程序
  26.                 JB DQ,EXIT      ;延時834微秒后判斷DQ腳是否出現高電平如果有就退出解碼程序
  27.                 DJNZ R6, SB     ;重復 10 次,目的是檢測在 9000 微秒內如果出現高電平就退出解碼程序
  28. ;-------------------------------;以上完成對遙控信號 起始碼 的 9000 微秒的初始低電平信號的識別!!!!!

  29.                 JNB DQ, [        DISCUZ_CODE_1        ]nbsp;      ;等待,避開 起始碼 低電平
  30.                 JB DQ,[        DISCUZ_CODE_1        ]nbsp;        ;避開結果碼


  31. /*;測試按鍵一次有多少位低電平,不同遙控器不一樣*/
  32. /*;電工電子中心投影遙控器只有32位,這對后邊程序參數設置關系重大
  33.                 CLR A
  34. ADDLOOP:        JNB DQ,$
  35.                 ADD A,#1
  36.                 MOV P1,A
  37.                 JB DQ,cADD
  38.                 sjmp $
  39. */

  40.                 MOV R7,#16      ;忽略前16位系統識別碼 (即地址碼)
  41. AAQQ:           JNB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;通過低電平段
  42.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代碼可以用本行替換,但這樣容易出現死機。
  43.                 MOV R6,#255
  44. CTN2:           JNB DQ,DER7     ;等待有效低電平到來,避開 結果碼 高電平
  45.                 MOV BYT_DLY,#3  ;42uS
  46.                 ACALL DELAY     ;調用42微秒延時子程序,延時太短,計數器R6不夠大,延時太長,會錯過最佳檢測點
  47.                 DJNZ R6,CTN2                     
  48.                 LJMP EXIT       ;防止死機
  49. DER7:           DJNZ R7,AAQQ

  50.                 MOV R1,#DA_BUF  ;設定1AH為起始RAM區
  51.                 MOV R2,#2       ;接收從DA_BUF到DA_BUF+1的2個內存,用于存放操作碼 (即數據碼) 和操作反碼
  52. PP:             MOV R3,#8       ;每組數據為8位
  53. JJJJ:           JNB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;等待通過數據碼的低電平信號,等高電平到來后出去;
  54.                 MOV BYT_DLY,#13 ;834uS
  55.                 ACALL DELAY     ;高電平開始后用840(560<t<1125,)微秒的時間尺去判斷信號此時的高低電平狀態
  56.                 MOV C,DQ        ;將DQ引腳此時的電平狀態0或1存入C中
  57.                 JNC UUU         ;如果為0就跳轉到UUU
  58.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代碼可以用本行替換,但這樣容易出現死機。
  59.                 MOV R6,#255
  60. CTN3:           JNB DQ,UUU      ;等待有效低電平到來,避開 結果碼 高電平
  61.                 MOV BYT_DLY,#3  ;42uS
  62.                 ACALL DELAY     ;調用840微秒延時子程序
  63.                 DJNZ R6,CTN3            
  64.                 LJMP EXIT       ;防止死機

  65. UUU:            MOV A,@R1       ;將R1中地址的給A
  66.                 RRC A           ;將C中的值0或1移入A中的最低位
  67.                 MOV @R1,A       ;將A中的數暫時存放在R1數值的內存中
  68.                 DJNZ R3,JJJJ    ;接收滿8位換一個內存

  69.                 INC R1          ;對R1中的值加1,換下一個RAM
  70.                 DJNZ R2,PP      ;接收完8位數據碼和8位數據反碼,存放在1AH/1BH中                          

  71.                 MOV A,DA_BUF
  72.                 CPL A           ;對1AH取反后和1BH比較
  73.                 CJNE A,DA_BUF+1,EXIT    ;如果不等表示接收數據發生錯誤,放棄
  74.                                 
  75.                 MOV R7,DA_BUF   ;將按鍵的鍵值通過數碼管顯示出來!
  76.                 ACALL DISP
  77.                 CLR P1.0        ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功               
  78.                 MOV BYT_DLY,#50
  79.                 ACALL DELAY
  80.                 SETB P1.0       ;蜂鳴器停止
  81. EXIT:           SETB EA
  82.                 reti


  83. ;-------------------------延時子程序---------------------------------
  84. ;晶振22.1184M

  85. DELAY:          PUSH    BYT_DLY
  86. DEL31:          PUSH    BYT_DLY
  87. DEL32:          DJNZ    BYT_DLY,DEL32
  88.                 POP     BYT_DLY
  89.                 DJNZ    BYT_DLY,DEL31
  90.                 POP     BYT_DLY
  91.                 DJNZ    BYT_DLY,DELAY
  92.                 RET

  93. //數碼管顯示,數據由R7傳入
  94. DISP:           mov dptr,#ledmap
  95.                 mov a,r7
  96.                 anl a,#0fh
  97.                 movc a,@a+dptr
  98.                 mov dptr,#SEG1
  99.                 cpl a
  100.                 movx @dptr,a

  101.                 mov dptr,#ledmap
  102.                 mov a,r7
  103.                 swap a                                 
  104.                 anl a,#0fh
  105.                 movc a,@a+dptr
  106.                 mov dptr,#SEG2
  107.                 cpl a
  108.                 movx @dptr,a

  109.                 mov dptr,#SEG3
  110.                 mov a,#0ffh
  111.                 movx @dptr,a
  112.                 mov dptr,#SEG4         
  113.                 movx @dptr,a  
  114.                 ret

  115. ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00

  116.                 END
復制代碼

所有資料51hei提供下載:
紅外遙控解碼ASM.7z (12.52 KB, 下載次數: 32)







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