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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 6276|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)紅外解碼-C語言和匯編

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70941 發(fā)表于 2015-3-21 05:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
             中斷加定時(shí)器---C語言版
              優(yōu)點(diǎn):極少的占用系統(tǒng)軟件資源(CPU),隨時(shí)都可以解碼,而不管系統(tǒng)此時(shí)運(yùn)行到何處。
      缺點(diǎn):占用系統(tǒng)兩個(gè)硬件資源,一個(gè)外部中斷和一個(gè)定時(shí)器。
/******************************************************
********六哥紅外解碼程序********************************
********************************************************/


#include"STC15Fxxxx.H"
///**************************************************
/////用戶配置區(qū):
#define  xi_tong_pl   12000000  ///晶振頻率設(shè)定  如你的系統(tǒng)晶振頻率是12MHz,則寫12000000   
#define  jan_zhi      P1        ///解碼輸出二進(jìn)制端口,解碼成功則從該端口輸出鍵值的二進(jìn)制
sbit     zhi_s    =   P5^5;     ///解碼成功標(biāo)志,解碼成功一次該端口取反一次
////外部中斷
#define  zd_rkdz      interrupt 0   ///中斷入口設(shè)置
#define  zd_cffs      IT0           ///中斷觸發(fā)方式設(shè)置
#define  zd_dk        EX0           ///中斷打開設(shè)置
////
#define  stc_dsqsz    AUXR &= 0x7F;//定時(shí)器時(shí)鐘12T模式,不需要可在AUXR....前加//
///**************************************************



/******************************************************************
*****本程序使用外部中斷加定時(shí)器來實(shí)現(xiàn)紅外解碼,占用系統(tǒng)軟件資********
*****源極少,硬件方面占用了一個(gè)外部中斷,定時(shí)器中斷還可以進(jìn)行********
*****一些簡(jiǎn)單的運(yùn)用,軟件部分可以做很多的動(dòng)作,就看你發(fā)揮了!********
******************************************************************/




#define shi_jian_   (xi_tong_pl/12000000)///定時(shí)器設(shè)置,請(qǐng)勿更改
unsigned char hwyhmh,hwyhml,hwjz,hwsj,hwjmws;///全局變量
bit   hwjmok,yxjm;///全局變量,紅外解碼OK,允許解碼
void main(void)
{
EA=1;            //總中斷打開

zd_cffs=1;           //外部中斷_邊沿觸發(fā)方式
zd_dk=1;           //外部中斷_打開

ET0=1;                 //定時(shí)器中斷打開
stc_dsqsz
TMOD &= 0xF0;                      //設(shè)置定時(shí)器模式
TMOD |= 0x01;                      //設(shè)置定時(shí)器

while(1)
     {if(hwjmok)
         {hwjmok=0;
          jan_zhi=hwjz;
          zhi_s=~zhi_s;
          }
      }
}

/*------------------------------------------------
                 定時(shí)器0中斷子程序
------------------------------------------------*/
void T0ZDCX(void) interrupt 1 using 3
{
yxjm=0;                //未收到重復(fù)碼清除解碼允許標(biāo)志
hwjz=0;
TR0=0;                 //關(guān)閉定時(shí)器
}

/*********************************************************
            中斷方式紅外接收程序
***********************************************************/
void ZDhwjsCX(void) zd_rkdz using 3
{
unsigned int a=TH0*256+TL0;

TL0=0;
TH0=0;
TR0=1;            ///開啟T0

if(a>shi_jian_*13000&&a<shi_jian_*14000)///if1分支2.判引導(dǎo)碼13-14ms
   {
    hwsj=0;
    hwjmws=32;
    yxjm=1;
    }

else if(yxjm)          ///if1分支1.已收到引導(dǎo)碼,允許解碼
   {

    if(a>shi_jian_*11000&&a<shi_jian_*12000&&hwjmws==0)///if2分支1。判重復(fù)碼11-12ms
      {
       hwjmok=1;
       }


    else               ///if2分支3。否則解碼,取位
      {
       hwjmws--;

////////////////////////////////////////////////////////
       if (a>shi_jian_*2000&&a<shi_jian_*2400)///        判1   2-2.4ms
         {
          hwsj>>=1;
          hwsj|=0x80;      
          }


       else if (a>shi_jian_*1000&&a<shi_jian_*1300)///   判0  1-1.3ms
          {
           hwsj>>=1;
           }
       else               
          {
           hwjmws=32;
           yxjm=0;           //清除允許解碼標(biāo)志
           TR0=0;            //關(guān)閉T0
           }
//////////////////////////////////////////////////////////
       }

       switch(hwjmws)
          {case 24:{
                    hwyhmh=hwsj;
                    hwsj=0;
                    }
                    break;

           case 16:{hwyhml=hwsj;
                    hwsj=0;}
                    break;

           case  8:{hwjz=hwsj;
                    hwsj=0;}
                    break;

           case  0:{if(hwjz==~hwsj)
                       {hwjmok=1;
                        TL0=shi_jian_*12000%256;
                        TH0=shi_jian_*12000/256;
                        }
                    }
                    break;

           default:;}      

    }
else;
}


中斷加定時(shí)器---匯編版;******************************************************
;********六哥紅外解碼程序********************************
;********************************************************/

;******************************************************************
;*****本程序使用外部中斷加定時(shí)器來實(shí)現(xiàn)紅外解碼,占用系統(tǒng)軟件資********
;*****源極少,硬件方面占用了一個(gè)外部中斷,定時(shí)器中斷還可以進(jìn)行********
;*****一些簡(jiǎn)單的運(yùn)用,軟件部分可以做很多的動(dòng)作,就看你發(fā)揮了!********
;******************************************************************/

hwyhmh   data   7fh
hwyhml   data   7eh
hwjz     data   7dh
hwsj     data   7ch
DSQ_ZDCS data   7bh
ZDCS     DATA   7AH

hwjmok   bit    20h.0
yxjm     bit    20h.1
hwjmwei  bit    20h.2
hwjmkg   BIT    20H.3
HWJST    BIT    P3.3

ORG 0000H
AJMP  MAIN
ORG 0013H
LJMP  WBZD1
ORG 000BH
LJMP  DSQ_0
ORG 0050H
MAIN:
SETB  EA
SETB  IT1
SETB  EX1
SETB  ET0
MOV   TMOD,#01H
CLR   hwjmkg
CLR   yxjm
CLR   hwjmok
HHHH:
JB    hwjmok,jm_cg  ;JBC:為1跳轉(zhuǎn)并把該位清零,為0則順序執(zhí)行
                     ;此部分可寫其他程序,不會(huì)影響接收
LJMP  HHHH
jm_cg:               ;這里寫解碼成功后的動(dòng)作
CLR   hwjmok
MOV   P1,hwjz
LJMP  HHHH
;==============================================
WBZD1:
INC   ZDCS
MOV   A,ZDCS
JNB   yxjm,ZD0_5    ;
CLR   TR0
MOV   TH0,#0FAH     ;設(shè)置定時(shí)1400us
MOV   TL0,#70H      ;
SETB  TR0           ;開定時(shí)器
XCH   A,hwsj
MOV   C,hwjmwei
CLR   hwjmwei
RRC   A
XCH   A,hwsj
CJNE  A,#10,ZD0_0   ;取出用戶碼高位
MOV   hwyhmh,hwsj
AJMP  ZD0_4
ZD0_0:
CJNE  A,#18,ZD0_1   ;取出用戶碼低位
MOV   hwyhml,hwsj
AJMP  ZD0_4
ZD0_1:
CJNE  A,#26,ZD0_2   ;取出鍵值
MOV   hwjz,hwsj
AJMP  ZD0_4
ZD0_2:
CJNE  A,#34,ZD0_4   ;取出鍵值反碼
MOV   A,hwsj
CPL   A   
CJNE  A,hwjz,ZD0_3  ;鍵值判斷
SETB  hwjmok        ;解碼正確,置位標(biāo)志位
ZD0_3:              ;解碼不成功
CLR   TR0           ;關(guān)閉定時(shí)器
CLR   hwjmkg        ;關(guān)閉解碼開關(guān)
CLR   yxjm          ;清除允許解碼標(biāo)志
MOV   ZDCS,#0       ;中斷次數(shù)清零
MOV   DSQ_ZDCS,#0   ;定時(shí)器中斷次數(shù)清零
ZD0_4:
RETI                ;中斷返回
ZD0_5:              ;開始接收引導(dǎo)碼
CJNE  A,#1,ZD0_3    ;
MOV   TH0,#0F2H     ;設(shè)置定時(shí)3.5ms
MOV   TL0,#54H      ;
SETB  TR0           ;開定時(shí)器
SETB  hwjmkg        ;開紅外解碼開關(guān)
AJMP  ZD0_4
DSQ_0:
JNB   hwjmkg,T0FH   ;
JNB   yxjm,DSQ_0_0  ;
SETB  hwjmwei
CLR   TR0
T0FH:
RETI
;==========引導(dǎo)碼判斷程序===============
DSQ_0_0:
MOV   TH0,#0F2H     ;設(shè)置定時(shí)3.5ms
MOV   TL0,#54H      ;
INC   DSQ_ZDCS      ;對(duì)T0中斷計(jì)數(shù)
MOV   A,DSQ_ZDCS
CJNE  A,#1,DSQ_0_1
JB    HWJST,JMCW    ;判低電平,9ms引導(dǎo)碼   
AJMP  T0FH
DSQ_0_1:
CJNE  A,#2,DSQ_0_2
JB    HWJST,JMCW    ;判低電平,9ms引導(dǎo)碼      
AJMP  T0FH
DSQ_0_2:
JNB   HWJST,JMCW    ;判高電平,4.5ms引導(dǎo)碼
SETB  yxjm          ;引導(dǎo)碼接收成功,允許解碼
CLR   hwjmwei       ;
CLR   TR0      
AJMP  T0FH
JMCW:               ;引導(dǎo)碼接收錯(cuò)誤,
CLR   TR0           ;關(guān)閉定時(shí)器
CLR   hwjmkg        ;關(guān)閉解碼開關(guān)
CLR   yxjm          ;清除允許解碼標(biāo)志
MOV   ZDCS,#0       ;中斷次數(shù)清零
MOV   DSQ_ZDCS,#0   ;定時(shí)器中斷次數(shù)清零
AJMP  T0FH
END

純軟件解碼 --- 匯編版
利用程序判電平和時(shí)間進(jìn)行解碼,缺點(diǎn)是浪費(fèi)系統(tǒng)軟件資源;優(yōu)點(diǎn)是對(duì)系統(tǒng)硬件要求稍低
ORG   0000H
T0ZD    BIT   20H.2
XH      BIT   P3.3   ;紅外接收頭數(shù)據(jù)接口   
RS      BIT   P2.3
RW      BIT   P2.4
E       BIT   P2.5
BB      BIT   P3.6
ORG   0000H          ;
AJMP  MAIN
ORG   000BH           ;T0中斷入口
LJMP  T0ZDCX
ORG   0100H           ;主程序首地址
MAIN:
LCALL   CSH
MOV   DPTR,#TAB       ;總查表
SETB  EA              ;T0中斷設(shè)定
SETB  ET0
MOV   TMOD,#01H
DDXH:                   ;信號(hào)接收前準(zhǔn)備
SETB    P2.0            ;關(guān)信號(hào)指示燈
MOV     P0,#0FFH
CLR     TR0             ;關(guān)T0中斷
CLR     T0ZD           ;接收信號(hào)時(shí)間判斷
MOV     R5,#4           ;延時(shí)計(jì)數(shù)
MOV     TH0,#00H
MOV     TL0,#00H
;================解碼主要過程===========關(guān)鍵============================================================
JB      XH,$            ;等待電平變低,解碼從這開始
CLR     P2.0            ;開信號(hào)指示燈,表示正在接收信號(hào)
MOV     P0,#8EH         
SETB    TR0             ;開T0中斷
LCALL   YS3MS
JB      XH,DDXH         ;干擾檢測(cè)
LCALL   YS3MS
JB      XH,DDXH         ;干擾檢測(cè)
DD1:
JB      T0ZD,DDXH      ;是否超出接收允許時(shí)間
JNB     XH,DD1          ;等待電平變高
LCALL   YS3MS
JNB     XH,DDXH         ;干擾檢測(cè)  
DD2:
JB      T0ZD,DDXH      ;是否超出接收允許時(shí)間
JB      XH,DD2          ;等待電平變低
JSSJ:                   ;信號(hào)確認(rèn),開始接收數(shù)據(jù)
MOV     R0,#30H
ZJ:                     ;接收一個(gè)字節(jié)數(shù)據(jù)
MOV     R2,#8
WEI:                    ;位數(shù)據(jù),分辯0和1
JB      T0ZD,DDXH      ;是否超出接收允許時(shí)間
JNB     XH,WEI          ;等待電平變高
LCALL   YS845
MOV     C,XH            ;取位數(shù)據(jù)
RRC     A
DD3:
JB      T0ZD,DDXH      ;是否超出接收允許時(shí)間
JB      XH,DD3          ;等待電平變低,為1的高電平提供過度
DJNZ    R2,WEI          ;8位數(shù)據(jù)是否接收完
MOV     @R0,A
INC     R0
CJNE    R0,#34H,ZJ      ;四字節(jié)數(shù)據(jù)是否接收完
MOV     A,33H
CPL     A
CJNE    A,32H,DDXH      ;鍵值確認(rèn),解碼
MOV    R4,A            
;==========這里已經(jīng)取出鍵值,存在R4中==================================================
    MOV   R7,#100;
TSY:MOV   R6,#255
    DJNZ  R6,$
    CPL   BB
    DJNZ  R7,TSY
MOV    A,#0CDH          ;鍵值高位輸出
LCALL  YJP_XZL
MOV    A,R4
MOV    B,#10H
DIV    AB
MOVC   A,@A+DPTR
LCALL  YJP_XSJ
MOV    A,#0CEH          ;鍵值低位輸出
LCALL  YJP_XZL
MOV    A,B
MOVC   A,@A+DPTR
LCALL  YJP_XSJ          ;
LCALL  DYBF             ;調(diào)用燈控制子程序
LJMP   DDXH             ;返還等待下一次信號(hào)   
YS845:                  ;延時(shí)845微秒
MOV   R7,#255
DJNZ  R7,$
MOV   R7,#165
DJNZ  R7,$
RET
YS3MS:                  ;延時(shí)3ms
MOV   R7,#8
DDD:
MOV   R6,#255
DJNZ  R6,$
DJNZ  R7,DDD
RET
T0ZDCX:                   ;T0中斷程序
MOV     TL0,#00H
MOV     TH0,#00H
DJNZ   R5,T0FH
SETB   T0ZD
T0FH:
RETI
;===============以下是多余部分===========================================================================
DYBF:
MOV    A,#0C0H          ;用號(hào)碼前高位輸出
LCALL  YJP_XZL
MOV    A,30H
MOV    B,#10H
DIV    AB
MOVC   A,@A+DPTR
LCALL  YJP_XSJ
MOV    A,#0C1H          ;用戶碼前低位輸出
LCALL  YJP_XZL
MOV    A,B
MOVC   A,@A+DPTR
LCALL  YJP_XSJ         
MOV    A,#0C4H          ;用戶碼后高位輸出
LCALL  YJP_XZL
MOV    A,31H
MOV    B,#10H
DIV    AB
MOVC   A,@A+DPTR
LCALL  YJP_XSJ
MOV    A,#0C5H          ;用戶碼后低位輸出
LCALL  YJP_XZL
MOV    A,B
MOVC   A,@A+DPTR
LCALL  YJP_XSJ
;============此處專門針對(duì)我的開發(fā)板和遙控,不是解碼的關(guān)鍵,只是一種應(yīng)用舉例
MOV     A,R4
CJNE    A,#0CH,BA1      ;是否1號(hào)鍵按下
CPL     P1.0            ;點(diǎn)亮1號(hào)燈
BA1:
CJNE    A,#18H,BA2      ;是否2號(hào)鍵按下
CPL     P1.1            ;點(diǎn)亮1號(hào)燈
BA2:
CJNE    A,#5EH,BA3      ;是否3號(hào)鍵按下
CPL     P1.2            ;點(diǎn)亮1號(hào)燈
BA3:
CJNE    A,#08H,BA4      ;是否4號(hào)鍵按下
CPL     P1.3            ;點(diǎn)亮1號(hào)燈
BA4:
CJNE    A,#1CH,BA5      ;是否5號(hào)鍵按下
CPL     P1.4            ;點(diǎn)亮1號(hào)燈
BA5:
CJNE    A,#5AH,BA6      ;是否6號(hào)鍵按下
CPL     P1.5            ;點(diǎn)亮1號(hào)燈
BA6:
CJNE    A,#42H,BA7      ;是否7號(hào)鍵按下
CPL     P1.6            ;點(diǎn)亮1號(hào)燈
BA7:
CJNE    A,#52H,BAB      ;是否8號(hào)鍵按下
CPL     P1.7            ;點(diǎn)亮1號(hào)燈
BAB:RET
CSH:
;=============液晶初始化===============
MOV  A, #00111000B    ;8位數(shù)據(jù),雙行顯示,5-7字型
LCALL  YJP_XZL        ;調(diào)用寫液晶指令
MOV  A, #00001100B    ;顯示屏開啟,光標(biāo)出現(xiàn)在地址計(jì)數(shù)器位置,光標(biāo)不閃爍
LCALL  YJP_XZL        ;調(diào)用寫液晶指令
MOV  A, #00000110B    ;光標(biāo)右移一格,AC值加一,字符全部不動(dòng)
LCALL  YJP_XZL        ;調(diào)用寫液晶指令
MOV  A,#81H     ;
LCALL YJP_XZL
MOV  A, #4CH          ;L的ASCII碼
LCALL YJP_XSJ
MOV  A,#83H     ;
LCALL YJP_XZL
MOV  A, #47H          ;G的ASCII碼
LCALL YJP_XSJ
MOV  A,#85H     ;
LCALL YJP_XZL
MOV  A, #58H          ;X的ASCII碼
LCALL YJP_XSJ
MOV  A,#88H           ;
LCALL YJP_XZL
MOV  A, #5AH          ;Z的ASCII碼
LCALL YJP_XSJ
MOV  A,#89H           ;
LCALL YJP_XZL
MOV  A, #68H          ;h的ASCII碼
LCALL YJP_XSJ
MOV  A,#8AH     ;
LCALL YJP_XZL
MOV  A, #69H          ;i的ASCII碼
LCALL YJP_XSJ
MOV  A,#8CH           ;
LCALL YJP_XZL
MOV  A, #5AH          ;Z的ASCII碼
LCALL YJP_XSJ
MOV  A,#8DH           ;
LCALL YJP_XZL
MOV  A, #61H          ;a的ASCII碼
LCALL YJP_XSJ
MOV  A,#8EH     ;
LCALL YJP_XZL
MOV  A, #6FH          ;o的ASCII碼
LCALL YJP_XSJ
MOV  A,#0C2H          ;
LCALL YJP_XZL
MOV  A, #48H          ;H的ASCII碼
LCALL YJP_XSJ
MOV  A,#0C6H          ;
LCALL YJP_XZL
MOV  A, #48H          ;H的ASCII碼
LCALL YJP_XSJ
MOV  A,#0CAH          ;
LCALL YJP_XZL
MOV  A, #4AH          ;J的ASCII碼
LCALL YJP_XSJ
MOV  A,#0CBH          ;
LCALL YJP_XZL
MOV  A, #5AH          ;Z的ASCII碼
LCALL YJP_XSJ
MOV  A,#0CCH          ;
LCALL YJP_XZL
MOV  A, #3AH          ;:的ASCII碼
LCALL YJP_XSJ
MOV  A,#0CFH          ;
LCALL YJP_XZL
MOV  A, #48H          ;H的ASCII碼
LCALL YJP_XSJ
RET
;=========寫指令到液晶=============
YJP_XZL:
LCALL  CHECK_BUSY;查詢忙碌狀態(tài)
CLR    E
CLR    RS
CLR    RW
SETB   E
MOV    P0,A;寫指令
CLR    E
RET
;==========寫數(shù)據(jù)到液晶==============
YJP_XSJ:
LCALL  CHECK_BUSY;查詢忙碌狀態(tài)
CLR    E
SETB   RS
CLR    RW
SETB   E
MOV    P0,A;寫數(shù)據(jù)
CLR    E
RET
;=========查詢忙碌標(biāo)志============
CHECK_BUSY:
PUSH   ACC
BUSY_LOOP:
CLR    E
SETB   RW
CLR    RS
SETB   E
MOV    A,P0;讀取狀態(tài)
JB     p0.7,BUSY_LOOP
POP    ACC
LCALL  DEL
RET
DEL: MOV R6,#5
L1:  MOV R7,#248
     DJNZ  R7,$
     DJNZ  R6,L1
     RET
TAB:DB  30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
    DB  41H,42H,43H,44H,45H,46H
END  


定時(shí)器捕獲中斷法---c語言版


   



評(píng)分

參與人數(shù) 2黑幣 +10 收起 理由
fanks001 + 5 很給力!
958842929qq + 5 贊一個(gè)!51還是很經(jīng)典的。

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:67366 發(fā)表于 2017-10-5 12:51 | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:237377 發(fā)表于 2017-10-5 17:57 | 只看該作者
學(xué)習(xí)學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 好好的日com | 成人一级视频 | 久久一二三区 | 国产精品久久久久久久免费看 | 中文字幕不卡在线 | 91麻豆精品一区二区三区 | 成人免费毛片片v | 日韩欧美精品 | 亚洲免费在线视频 | 91亚洲国产成人精品性色 | 国产区在线 | 美女黄色大片 | 国产精品免费在线播放 | 色草在线 | 国内精品视频在线观看 | 香蕉在线观看 | 国产午夜免费视频 | 亚洲第一av| 久久久久国产一区二区三区 | 九九热精品在线观看 | 久久综合久色欧美综合狠狠 | 美日韩一区 | 成人高清免费 | 人与拘一级a毛片 | 亚洲一区在线看 | 欧美三级精品 | 一级毛片在线免费观看 | 97久久精品人人澡人人爽 | 日韩黄色网址 | 国产精品视频免费看 | 白白色免费视频 | 国产综合一区二区 | 激情五月婷婷综合 | 黄色片在线看 | 国产对白videos麻豆高潮 | 三级网站免费 | 免费一级黄色 | www.av在线播放 | 天天干天天拍 | 青青视频网 | 日本a级在线 |