標(biāo)題: 51單片機(jī)紅外解碼-C語(yǔ)言和匯編 [打印本頁(yè)]
作者: dagu 時(shí)間: 2015-3-21 05:02
標(biāo)題: 51單片機(jī)紅外解碼-C語(yǔ)言和匯編
中斷加定時(shí)器---C語(yǔ)言版 優(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,則寫(xiě)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 ///中斷打開(kāi)設(shè)置
////
#define stc_dsqsz AUXR &= 0x7F;//定時(shí)器時(shí)鐘12T模式,不需要可在AUXR....前加//
///**************************************************
/******************************************************************
*****本程序使用外部中斷加定時(shí)器來(lái)實(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; //總中斷打開(kāi)
zd_cffs=1; //外部中斷_邊沿觸發(fā)方式
zd_dk=1; //外部中斷_打開(kāi)
ET0=1; //定時(shí)器中斷打開(kāi)
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; ///開(kāi)啟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í)器來(lái)實(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í)行
;此部分可寫(xiě)其他程序,不會(huì)影響接收
LJMP HHHH
jm_cg: ;這里寫(xiě)解碼成功后的動(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 ;開(kāi)定時(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)閉解碼開(kāi)關(guān)
CLR yxjm ;清除允許解碼標(biāo)志
MOV ZDCS,#0 ;中斷次數(shù)清零
MOV DSQ_ZDCS,#0 ;定時(shí)器中斷次數(shù)清零
ZD0_4:
RETI ;中斷返回
ZD0_5: ;開(kāi)始接收引導(dǎo)碼
CJNE A,#1,ZD0_3 ;
MOV TH0,#0F2H ;設(shè)置定時(shí)3.5ms
MOV TL0,#54H ;
SETB TR0 ;開(kāi)定時(shí)器
SETB hwjmkg ;開(kāi)紅外解碼開(kāi)關(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)閉解碼開(kāi)關(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ò)程===========關(guān)鍵============================================================
JB XH,$ ;等待電平變低,解碼從這開(kāi)始
CLR P2.0 ;開(kāi)信號(hào)指示燈,表示正在接收信號(hào)
MOV P0,#8EH
SETB TR0 ;開(kāi)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),開(kāi)始接收數(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的高電平提供過(guò)度
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
;============此處專門(mén)針對(duì)我的開(kāi)發(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)用寫(xiě)液晶指令
MOV A, #00001100B ;顯示屏開(kāi)啟,光標(biāo)出現(xiàn)在地址計(jì)數(shù)器位置,光標(biāo)不閃爍
LCALL YJP_XZL ;調(diào)用寫(xiě)液晶指令
MOV A, #00000110B ;光標(biāo)右移一格,AC值加一,字符全部不動(dòng)
LCALL YJP_XZL ;調(diào)用寫(xiě)液晶指令
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
;=========寫(xiě)指令到液晶=============
YJP_XZL:
LCALL CHECK_BUSY;查詢忙碌狀態(tài)
CLR E
CLR RS
CLR RW
SETB E
MOV P0,A;寫(xiě)指令
CLR E
RET
;==========寫(xiě)數(shù)據(jù)到液晶==============
YJP_XSJ:
LCALL CHECK_BUSY;查詢忙碌狀態(tài)
CLR E
SETB RS
CLR RW
SETB E
MOV P0,A;寫(xiě)數(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語(yǔ)言版
作者: taiwan3c 時(shí)間: 2017-10-5 12:51
學(xué)習(xí)學(xué)習(xí)
作者: 958842929qq 時(shí)間: 2017-10-5 17:57
學(xué)習(xí)學(xué)習(xí)。
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |