|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有 * B' O, Z& u3 |8 R4 w( u4 p
5 J5 ?, |" N' M
( m3 R/ S l; ^0 E( @
注:
* x; Z u- A1 h; r' Z每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。4 z8 Q2 s: a8 N3 N$ f* M9 C
P_PROTEUS_ASM 为PROTEUS汇编实例工程
7 n- b$ z4 c M7 lP_PROTEUS_C 为PROTEUS C51仿真实例工程
0 f! n! ?: K. q. x* \8 FP_EMULATOR_C 为硬件仿真器(可选配件)C51实例工程! E8 h: u1 O" z$ ?
P_EMULATOR_ASM 为硬件仿真器汇编实例工程
& B/ ]0 N* p# ]7 ^; x3 G一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行
6 ?& K8 }8 e3 ^: q5 G" K/ |2 ^# U% m/ e5 V1 E9 Z8 `: a/ h
P_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。
9 c* f8 d0 [) w: K* d g5 Q2 T% S$ x* L' Y6 c
如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。; X1 a9 x6 `! b3 F, j. T" k* W
" }/ Q% s5 P- d& a4 n& Z/ T8 s( c9 C: ~0 H- g; Z! w
汇编和c的代码都有很全面.1 e) d5 X" Q6 u; L3 h
- G! u3 B3 m5 n& Ec语言程序:
~ d3 p& |+ A* C, \
! m3 f0 U8 M! m7 a7 X0 W& B. ^) R/************************************************* ' J3 @" e2 |: P0 ^4 y% G
*文件名称: main.c ) ]4 F2 ?: s# _0 E0 d) v2 ]
*作 者: 4 O7 t4 p) f9 [7 f* n2 I i& o
*版 本: V1.00- ^. v. z' H, P. p
*说 明: 红外遥控器解码实验
- Y# h1 n. f+ s" p*修改记录:
) s- D5 d2 v0 o: k--------------------------------------------------: |. u% E s; m3 U; [: b3 ?0 {4 c
*Descriptoon: 5 H" J! p, N. f/ O- V- k& ]' x
*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,0 i' b6 T+ e& q7 e: G
P00~P07-DB0~DB7
! q% n& K& ~: Q, [" |**************************************************/ 8 m% T8 d6 _$ ]: p5 E! f
( K$ G U/ j$ b1 i2 i \6 R#include <reg52.h>
. g7 I! o3 z Y. g; n$ v- i0 n- v1 w0 D- n' O0 |1 m
#define uchar unsigned char3 o* O' }* s, x5 F/ _& H
#define uint unsigned int
S) [5 U. V( n& j//char code SST516[3] _at_ 0x003b;
G% N/ q7 J5 k& F#define c(x)(x*110592/120000) //晶振11.0592
: j' z& w2 Y/ k9 B9 c' |( p1 Z0 ?7 y0 m( O+ x
uchar Lcd_Buf[4]; //显示数据缓冲区
2 v. e; p% Z" \0 V3 Q. n+ uunsigned char Ir_Buf[4]; //用于保存解码结果
& s+ h; E4 i5 Q$ {8 \ m% w1 osbit Ir_Pin=P3^2; //红外线数据接口. ?2 x/ x. k8 z L9 P
sbit rs=P2^0; //LCD数据命令端
6 m' B/ j1 x b; F) Jsbit rw=P2^1; //读写接口' B( K- o# X, r0 `8 ] v2 ~- I' r/ J
sbit lcde=P2^2; //使能接口
5 w8 C' g" G* ]2 zuchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据, ?9 _1 y/ Z1 K8 A( b
uchar code table1[]="Wait for IR in..";! D0 {9 Y5 N# b; T" s; ?4 ^
uchar code table2[]=" IR DATA...";
3 a {4 z, k* H1 ~$ Z& T3 l/ D- n3 Q. i9 X6 l: k9 j
unsigned char code Led_Tab[]={
6 ]% h4 K) o9 t; i/ K$ { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,
7 h6 N. O4 v" k& r& p) _8 E" z 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F
4 y- x* u" d/ junsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位$ E) P# i( N+ I# a& n
unsigned char Led_Buf[4]; //显示缓冲区
& ^; K( {3 E) Nchar Led_Index; //定义位选
" p5 V- V( f9 I5 ?# S4 _3 punsigned char Ir_Buf[4]; //用于保存解码结果7 O1 J3 _6 q, p
2 }6 M/ s( [$ o8 D1 V5 x0 b& ]7 Osbit LCD_E = P2^7;
5 d9 a7 S+ w+ L' K//========1MS延时====================================2 p6 i9 B6 z% F) c" `4 f
void delay(uint z)2 Q! s- Y0 ]$ y5 O+ u
{2 `& c9 A' ~( \; j. Q2 O! n, `1 o
uint x,y;
6 D* q: G* _* T; V+ J; B: r for(x=z;x>0;x--)% K) {" w: d4 I
for(y=113;y>0;y--);! b; N0 c$ }9 Q2 h. b1 Y
}/ ]5 S; p5 S7 \' K M/ g; {2 S
//======LCD写命令=====
, E' [2 G% j* ?1 i8 |void write_com(uchar com)
+ i) n# O; ~5 ~/ r+ s{
; r ?7 u8 n) ?8 }/ U# c rs=0;% o/ s# Y: m% ~5 T) R
lcde=0;
$ g. x1 Q( W& w9 X! |( l- d P0=com;
1 i: m' U" e6 [ lcde=1;& `5 f: n5 O, B
delay(1);//延时1MS跳过忙信号
, Z0 w+ N+ M" r7 w lcde=0;% q3 O+ C: u' j9 z' ~
delay(1);
- _, X6 _, A/ ^2 ~. A}0 Q0 e/ p5 \, o7 P
//======LCD写数据=====================================
6 h9 @0 ^" L. e* i! ~void write_date(uchar date)
4 w# W! z! d. z0 Y4 h- E{1 b; j! K, }: Q# v+ q$ z
rs=1;/ F$ Y7 s4 {/ `) \/ P
lcde=0;( f2 F/ H& z( n6 P) ?" R1 G
P0=date;
4 ^5 S H. e$ `% w' d4 Z lcde=1;
1 r# p) ]( R) q2 y* ^- R+ ] delay(1);
; F+ b: x& n) D2 u lcde=0;- P; L; ?: f. j% H0 Q
delay(1);
" K0 U. X) o2 U3 C- \2 G3 @' ^}' n- A) S3 {/ u: \; d* S- }
//=====初始化函数=====================================
% ? A1 q2 A ?0 U) P! Z% Ovoid init()
& g) R1 w" f1 h" Z" }% e{ ! ?8 m3 s. [6 d7 L
uchar num;& O3 `, t. k6 g% L% E9 b0 R
rw=0; //允许LCD写! N1 r* i$ k) r- W
lcde=0;! a# ] s8 q. A) `
write_com(0x38);//显示模式设置
7 Q, a8 v* _: X write_com(0x0c);//显示开及光标设置
0 u, s; ? a) s8 b8 a: s3 I write_com(0x06);//显示光标移动设置
5 B; _9 ?$ q, B* `5 {* a write_com(0x01);//清屏, T7 P3 `& T% Z9 t6 c6 M5 J$ [
write_com(0x80);//显示首地址
/ I- z6 k& X4 r% H' C2 N for(num=0;num<15;num++)//显示第一行6 ?7 X" E. I; g
{: \7 Y3 }; R; m+ N) s" ]2 Z
write_date(table[num]);2 b. J5 ]9 y' Q
delay(1);; u& A, w/ B; h8 @# s
}7 ]8 D, h; [7 O+ A
write_com(0x80+0x40);//显示第二行0 g% ^; h" s- @" j1 w5 b
for(num=0;num<16;num++)
( ~7 B# u9 w( z8 r {# x4 _* L: B* }
write_date(table1[num]);; I% [1 T! g0 O2 I( P
delay(1);; Q5 ?$ d( Q4 e3 o3 H. t! |
}
5 O" S6 t7 C! v( X+ K1 G TMOD=0x10; //设置定时器0、1工作模式为15 M. k; c V. @' b
}3 _" @' V+ O/ x+ q" [
//=====显示解码========================================% f$ [; H+ U) S9 {0 `7 }
void write_ir(uchar date): U9 } P9 z: @9 a2 t7 C0 {/ w% g% G
{8 o6 c: V1 i$ a ~" B4 {
uchar tmp, num,ff;
. e7 N7 d3 F/ Q7 p9 q& ?, K: n
& J1 X: b* A4 `8 I) r) W1 i) i if(ff==0)% h; J9 P/ ]) [1 A, [
{
, ~" D% t) r6 @' e ff++;, q* Z" L1 ]0 {" I( l
write_com(0x01);, Q! b) w' z, ^& `6 Q2 a& O
write_com(0x80);
3 }" y1 A( H4 E- D2 Y& w2 _/ }4 `( v for(num=0;num<12;num++)
% J* t2 y3 H6 ~$ O! Z) v, ] {3 K/ j( T2 D2 P% |
write_date(table2[num]);# K9 Z5 t$ Y% L( o, K7 o6 n
delay(1);
@& Q8 ]& d* N } . n1 V$ y" Q+ Y
}+ e* K0 Z4 [# F* D
! k S1 [6 I$ c% |) q9 W- ~7 f; t
write_com(0xC0+6);//定位在第二行第六位
* L) {. P$ m& b tmp = date>>4; // 高四位 5 \& M2 ]% o( a
write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);, e: [6 A2 d" I; d
write_com(0xC0+7);//定位第二行第七位 ) q+ |# q5 J0 f, V( j4 D% n0 q
tmp = date&0x0F; // 低四位
9 s% c, o& p/ Y- }& T8 r! J, P9 A' b7 l write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
2 T8 E: } R# f) a1 H' A
' C- C% A' s' f2 m9 B: z- d}" D( s' Z1 b7 R+ w; z7 Y
//======================================================: z) }7 W9 ]) [! ?6 E) m" @
//解码取回低电平6 N: d5 t3 R9 c- ~2 p" t( K
unsigned int Ir_Get_Low()! s" u( W, V+ m$ b
{
# W8 n$ Q4 P* E" s& i w6 I TL1=0;
8 m% \3 z) g% | TH1=0;( |! J& }: R. r
TR1=1;+ v5 e: L( K! T
while(!Ir_Pin && (TH1&0x80)==0); //等待低电平到来 ; Q; S& q4 P2 d+ u
TR1=0; : [+ }6 T: s1 X% u" g7 y
return TH1*256+TL1;//提取低电平时间间隔时长, E& |3 w4 l5 c& q) k1 w( L
}: j Y1 h8 E8 s3 R. g
//======================================================
( U* n1 t \: T0 \; [% b4 O//解码取回高电平========================================$ U# o9 h; F8 Q
unsigned int Ir_Get_High()
8 w7 x) r# E: ~' S9 {* \- t{- x$ |0 [7 X0 _$ ]4 T8 G( D
TL1=0;
) @; S, M0 m! A3 L/ c. E% c TH1=0;
" k* K6 }9 p E z; {6 \+ s% z TR1=1;% j! Z. B5 ~4 u! V
while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来
5 {! h5 t1 G" N Q: d2 t TR1=0;
5 A9 F) z- Q7 c/ W3 r. y& @ return TH1*256+TL1;//提取高电平时间间隔时长
3 F% C4 r# L/ V. ^$ l6 e" c! \}/ V. w. p4 X7 D
//======================================================1 w. ~; s: |$ a) } W0 H+ L! m0 _+ L
//======================================================
0 b. j0 L; W( B# l m5 @5 i% f6 ~7 B. t3 ~
void main()( z$ L. ]$ P. k8 ~
{
7 K; b5 k8 I! C unsigned int temp;
7 y% ?5 H- e4 }0 W char i,j;
# L' g: F+ y) E2 [/ k7 K init(); //初始化
5 Z/ s, ~8 j, j9 v& ?( _2 x: p//=====用do做循环,等待遥控按键=========================' e, S/ ~ N! ]& U3 ?
do{
" K& K% p: {. Z* J6 c% P2 y* arestart:3 a, r' B8 @; I0 U9 D7 v. v
while(Ir_Pin) ;//等待低电平
- [) A- H* \* E, v/ G b4 p5 [$ e! w' ?3 O" I, v, p
temp=Ir_Get_Low();//把低电平附给变量7 h$ n+ ?" M# @0 l
if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us
$ @2 b+ b- L; t7 E' Q temp=Ir_Get_High();//把高电平附给变量2 R' r5 u0 U- R- v- U
if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us, I' F3 N7 F4 B) e/ e0 ?9 J' F0 m% e8 c1 F
//连续读出32个字节
- ~( ~5 E1 ^7 b7 B6 c" Q for(i=0;i<4;i++) //4个字节8 L a: B7 b' ]
{2 \5 | J; z3 o' y3 N$ ]
for(j=0;j<8;j++) //每个字节8位
) y( [1 e& n e4 W1 ]3 r" o l# x {1 ~2 S+ _6 g' b5 X
temp=Ir_Get_Low();- A% m. h4 [: x& _
if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平# W/ ~8 p8 V8 Y8 b) i1 n( s+ s
temp=Ir_Get_High();
5 e1 q6 p8 i. _. \. D) | if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平- s1 \8 o' N# k u9 P: K, Q
Ir_Buf>>=1;//把电平移进数组
: o% S1 c% t, l- |4 L/ r, t! o- ~. s$ Z
8 R7 T, g, L; [, i6 o
…………限于本文篇幅 余下代码请从论坛下载附件…………
/ Q2 S0 D! R8 a5 V ]6 V" [+ @+ c
: t& N7 m4 r8 _! n7 v7 u汇编语言:; I" B' Q& d4 X; i6 W
; J) J9 \# k" L* U2 A
: F. c. R2 `* R* }1 u
;-----------------------------------------------
; H) o& M" h1 C8 a! \ IRCOM EQU 20H ;20H-23H IR使用6 N; ?' ?9 [3 S8 N6 T& ?+ ?6 W
X EQU 26H ;LCD 地址变量
4 d0 a+ H1 i8 n" n
% A; e0 x7 A3 V3 V5 p IRIN EQU P3.23 e: b0 {' r1 a8 I7 V* a
; BEEP EQU P3.72 o+ C7 ]' O# U+ ^0 j
; RELAY EQU P1.0' Y. N5 c- A3 Q" F( Y
. {. R0 p3 o. ]4 b, O/ C RS EQU P2.07 Z: @% @, G! ~! Q) `9 F
RW EQU P2.1
: C* w( X' ^+ C8 D9 X$ V EN EQU P2.2! q+ t/ T1 K( N o- g. R2 Z
;------------------------------------------------5 d; j) j: x- r- m; j; H
ORG 0000H v6 f+ a" Z4 W4 j6 L
JMP MAIN
T8 {3 I4 c. q4 \; v& h$ {;------------------------------------------------
1 O; g3 f, i/ c5 C" D ORG 0100H1 r" b) t; x1 S+ J+ R
MAIN:' f7 T9 R! T3 c0 k5 A; P
MOV SP,#40H
. _! ~! W ?5 `$ I! x MOV A,#00H* C% J, A# z1 Q3 R5 W# {) x3 C
MOV R0,#20H e! Y, p4 |2 H8 }
LOOP0: MOV @R0,A ;20H-26H清零3 p5 v7 y5 t5 Z. ?
INC R0
. {- K( N+ b, P$ D CJNE R0,#27H,LOOP0* |: P3 |! F- O. m7 O6 ~8 m
SETB IRIN6 r+ D& R2 I0 k, |* ?4 Q* ?
CALL SET_LCD- ?; K5 b! ?# v6 R) O
CALL MENU1% v1 g: R$ \: r
LOOP1:
! Z2 V! _: O. @$ y CALL IR_IN6 x: [# M, M, u" _; i5 H) {
CALL IR_SHOW- R- ?* q) x3 K2 x
0 J* a* \1 |$ f6 I7 Y; MOV A,22H+ w, H; N+ U* U+ y5 x
; CJNE A,#40H,LOOP2 ;K17键按下
4 t% q) f5 q- M" N; CLR RELAY ;继电器吸合
8 v- g' J' c& W5 k;LOOP2: CJNE A,#04H,LOOP3 ;K19键按下
* f. c! ` B: o; SETB RELAY ;继电器关闭
* E) [2 W) q1 r! B;LOOP3:
* N) d* \, E% T. A* f+ [2 }. e JMP LOOP1
|) z8 j1 j! b3 I3 d T7 h% {- X
;-----------------------------------------------------
y6 `" z7 z G$ J; LCD 初始化设置
+ }4 e4 _; G" `' b! Z;-----------------------------------------------------6 E0 x" H3 a# Q
SET_LCD:0 t. a7 {* X. b4 z( M- ]
CLR EN
# \. U* g7 }7 z9 ` CALL INIT_LCD ;初始化 LCD
( P* G1 i! U# \7 J) C& d' w8 @) D0 T CALL DELAY11 d' m2 l+ v5 M- h9 {
MOV DPTR,#INFO1 ;指针指到显示信息1
. {1 {, y4 ?0 s5 O0 M: G! n MOV A,#1 ;显示在第一行
2 T8 I. |$ Q3 _ CALL LCD_SHOW4 u- W+ s$ X: `1 j [1 ~
MOV DPTR,#INFO2 ;指针指到显示信息2
, X w; x+ {4 C) Z9 L) w MOV A,#2 ;显示在第二行
( `+ X( [7 U! Y CALL LCD_SHOW" M# p8 @6 m+ H6 u1 o# g! Q
RET
, \# {4 y" X, J$ R;-----------------------------------------------------
4 H4 v A' P0 @, g+ V; \1 tINIT_LCD: ;8位I/O控制 LCD 接口初始化+ v, x h$ R9 {
MOV A,#38H ;双列显示,字形5*7点阵9 B( v# x$ \+ q
CALL WCOM) g& t# a1 d$ L* g9 M
CALL DELAY1
. i$ C: y0 P5 P2 y MOV A,#38H ;双列显示,字形5*7点阵
* X! ^5 W# S4 d" R7 J+ J CALL WCOM
+ W, W& ~3 D2 r) i& C. W: q CALL DELAY1/ o! V1 L7 M2 }! I
MOV A,#38H ;双列显示,字形5*7点阵
8 E- k+ y6 F" I3 b5 U4 @ CALL WCOM
& J) {5 O# b" T I2 Q/ V/ e5 X# ?3 \ CALL DELAY1
' z6 u* F5 ^2 F) @) {0 P MOV A,#0CH ;开显示,关光标,6 g8 K6 b/ q% u, ]( v: i* Y
CALL WCOM( f/ I7 c5 h3 f7 b/ |; T0 m1 {
CALL DELAY1' w7 o9 T; S" _$ n& V' k) T3 Z) U
MOV A,#01H ;清除 LCD 显示屏5 G# I7 g# t9 a8 s
CALL WCOM
3 Y; O6 D6 ~! C- n+ q ? CALL DELAY1
2 F9 b5 D% H5 a1 @1 [; b V RET6 Y# L! }9 {& R2 c, ^* [4 I- a
;----------------------------------------------------) i: ?& s2 f! q: @' h/ x- A! J* d8 {2 v
LCD_SHOW: ;在LCD的第一行或第二行显示信息字符
, d& a' p7 @4 `* F3 U3 D+ o) F: c$ w, G7 m
CJNE A,#1,LINE2 ;判断是否为第一行
0 W7 P1 I8 @0 ?9 y, t$ S: x LINE1: MOV A,#80H ;设置 LCD 的第一行地址- j$ d m2 U+ g: X7 C( H
CALL WCOM ;写入命令% o' I0 D( I4 h) I5 Q6 C0 C
CALL CLR_LINE ;清除该行字符数据
( O" O' G+ d- S) U MOV A,#80H ;设置 LCD 的第一行地址
5 H5 y; |0 w) o# k/ X2 r. s CALL WCOM ;写入命令
; `: I! R% s) ?( P7 `( V JMP FILL7 }7 G+ _8 \. ~5 M! x
3 H1 m- }& x7 a( ^) X% o
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址' K7 i8 o) S. [) E+ @
CALL WCOM ;写入命令
7 l+ D6 l6 a- s3 h; J2 B CALL CLR_LINE ;清除该行字符数据
9 b! l" {4 d! h/ J% M MOV A,#0C0H ;设置 LCD 的第二行地址! p! N+ r- _2 f, b7 }
CALL WCOM9 u" m) ^3 ~* P; b6 g! m: F" O: Z
FILL: CLR A ;填入字符1 f# o: b, c' H
MOVC A,@A+DPTR ;由消息区取出字符
) P2 C; [( T5 N2 D1 W! K CJNE A,#0,LC1 ;判断是否为结束码- i8 w& _6 e1 f$ }
RET
, o3 j1 g5 | e; w! f5 |4 b LC1: CALL WDATA ;写入数据
0 A5 X0 M/ }+ ^ INC DPTR ;指针加1
9 V3 x/ o& S! ?; m( ^ JMP FILL ;继续填入字符
% x6 F" v: v6 i3 P/ S' l( D RET5 L/ R4 D0 i: t6 R& V6 d2 D
;---------------------------------------------------, P/ h. T8 [& H H
CLR_LINE: ;清除该行 LCD 的字符
G& u8 H4 V* m& D; ?) [9 C# W MOV R0,#24( d% F& L- _! l1 X
CL1: MOV A,#' '
2 H" Z% h1 h) |# u) S3 M n CALL WDATA/ T3 N& l* U* c- g8 i" Z Q
DJNZ R0,CL1
v' |/ h2 g& H% W* Z5 q3 G RET H5 G8 _$ {, Y) N3 I* E3 V
;----------------------------------------------------
* \3 ]7 P$ j7 wMENU1: ;LCD 显示工作菜单信息8 w- @' c) L, Y& ]( \+ |
MOV DPTR,#MENU23 f) `: h2 H$ p" g2 O) b5 G
MOV A,#1 ;在第一行显示信息
! {# {9 p# k( o3 l CALL LCD_SHOW
$ r+ o& \6 c5 S' Z8 G1 a2 P RET
& e, ^. B$ U) F$ ~( MMENU2: DB " REMOTE CONTROL ",0
9 d! U3 y( }' |/ a P: l;-----------------------------------------------------
% Q+ p/ ~2 L% e$ F: g$ @; ZINFO1: DB " ",0 ;LCD 第一行显示信息( }; s. f z+ M2 v2 @1 k. C. r
INFO2: DB " IR-CODE: --H ",0 ;LCD 第二行显示信息
% K! K P, h* a H7 l2 ?+ j;-----------------------------------------------------* m, G# Z# P9 m3 d8 ?" i; N
4 O! A+ g6 A1 `;-----------------------------------------------------
7 z& X- B0 e& B! {2 s; 写指令、数据使能子程序
! w9 j: p* S H6 P! y, ~, d;-----------------------------------------------------
/ G! z3 T3 ~* V5 V& OWCOM:
- X3 P- i- L# |! b) A* D MOV P0,A ;写指令使能
$ c0 e- W! {5 s2 g: v CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
9 H/ ], g! R) }! Z3 G' o: A CLR RW% G" z0 t( G! z; r, L- S# m
SETB EN: a0 h# }4 k( W) }
CALL DELAY0
, o7 G0 l% M9 h$ K CLR EN Q, W- |0 d3 ~* _
RET
; V P- }5 C3 E. \: ~. F. g. g' S6 `2 v
WDATA:9 N0 l* S2 D$ c2 R4 d, q; K9 E0 a
MOV P0,A ;写数据使能4 M. [5 l/ K5 }0 Y" H
SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲8 @$ C0 ]" ~( m! ^! ~+ a" w
CLR RW2 W# w! S5 W: s
SETB EN
6 R% ?9 _; z m) ?! W, E; P CALL DELAY0* W. ?: k" a3 ?: ?$ U
CLR EN
- Z) S) ?8 N. r { RET
" E& N" S* d, n( r+ x+ `4 H4 f, j: @6 B& d& p2 }
DELAY0: MOV R7,#250 ;延时500微秒
& U. q; l( x8 {6 w7 k0 L2 k1 R DJNZ R7,$
* Q/ z3 }/ G2 C7 @0 s, _ RET
4 V/ R- Z8 T( ?! K/ F;---------------------------------------------------1 I- M& W4 t1 i) p% Q, V0 x
;在 LCD 第二行显示字符
* z O. F' e+ h) d* C1 E;A=ASC DATA, B=LINE X POS9 i7 T* Z5 b' _* |1 b" R0 X
;---------------------------------------------------& |1 v- _# j4 }: |/ i9 K0 c5 B
LCDP2: ;在LCD的第二行显示字符- a- K. h3 n- Q8 V
PUSH ACC ;
$ b0 C3 @% `! ?7 N8 I+ c* S MOV A,B ;设置显示地址 I. T. { x- `9 ^% K+ p& C% o
ADD A,#0C0H ;设置LCD的第二行地址
6 k3 P* F. { [ |4 a; @ CALL WCOM ;写入命令
" g: D! y- F2 C! M6 [; u/ x POP ACC ;由堆栈取出A; v) W2 P8 C+ r
CALL WDATA ;写入数据' ]& n, o( ^5 E( C
RET
( \0 ], e3 R$ T5 D' C3 ]8 {! C& m;---------------------------------------------------
; `* @; N- H& n& H; IR 译码子程序
1 c! q: [" g1 `6 p;---------------------------------------------------3 i, k3 w3 q9 Q+ C& J, f
IR_IN: 7 j8 z* s: c+ A0 a. Q
MOV R0,#IRCOM/ I: R) ^6 j2 r1 M& L# S% c, n: {
I1: JNB IRIN,I2 ;等待 IR 信号出现* d+ N/ y4 X5 |0 d, h9 z
JMP I1" K8 Y0 l& q0 b* s% V
I2: MOV R4,#20# T: Q7 v# }; f) C7 a
I20: CALL DEL6 \, u3 ~. B; e; E& X1 a, m' Y
DJNZ R4,I20
( I- u8 y$ U U1 F9 z JB IRIN,I1 ;确认IR信号出现
" e$ c1 {; f( _* ^ I21: JB IRIN,I3 ;等 IR 变为高电平
$ e2 w' C# l( v# S* m0 c% z CALL DEL' ^6 ]3 M$ |' z" Z1 h
JMP I21' B# }' B. L$ b" `9 W2 X2 d, t- k
I3: MOV R3,#0 ;8位数清为0* m, M5 E p3 B+ D+ T7 o7 j
LL: JNB IRIN,I4 ;等 IR 变为低电平: ~7 @+ w V9 Y! q, d8 A$ I; Z
CALL DEL+ h1 ?9 W0 m: w3 R% o# z
JMP LL
) B$ |% R0 m$ B0 o I4: JB IRIN,I5 ;等 IR 变为高电平
! k& Y. \* {* F$ q CALL DEL
9 a- D. `) C+ M1 b: S: J* D/ k JMP I4
4 j$ m2 h' F- J5 q1 \ I5: MOV R2,#0 ;0.14ms 计数
, q, E5 W. l4 d9 F% V3 T L1: CALL DEL
8 \. t% \! J: G t' d6 T JB IRIN, N1 ;等 IR 变为高电平1 ^' a! E2 h0 g) S% t
;IR=0,检查R2中的计数值
4 {# e4 l: z1 ~) F- \ MOV A,#8
$ Y) p c6 a9 @" w CLR C9 y+ a5 O' l2 M
SUBB A,R2 ;判断高低位
* s, D$ r+ U# t ;IF C=0 BIT=0
: W0 }1 d/ V# Y! I2 Q MOV A,@R04 G( \% i. w- }3 Y( b
RRC A. W' w7 z5 ~4 g! b# x
MOV @R0,A ;处理完一位% E! p; d! Y% ~" V# \/ b
INC R34 ]8 R: z: I1 t) |; I
CJNE R3,#8,LL ;需处理完8位 . C V$ {( i" `3 S
MOV R3,#0
2 U: t7 k, A7 v& X- p9 b0 J. T INC R08 `+ G3 z" l: y/ p! [: z
CJNE R0,#24H,LL ;收集到4字节了2 @3 A( ~) l9 }' m
JMP OK
- S2 U! r, U) ^- d6 ~ N1: INC R2
. i7 O& I. |; j, I: | CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开
Z8 e4 B3 Z2 H1 Q+ N" ]! {1 C/ q OK: RET
+ r) N, G# M- G* q;--------------------------------------------------------------------5 m& L4 P) k, k' m* o; b
IR_SHOW:3 f7 z4 z E- O; a) s. t4 c
MOV A,22H3 v. N @% `! W. s* d0 r& C- [
CPL A ;将22H取反后和23H比较
- C* T, N- A( v& X3 z: X CJNE A,23H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。- q/ {& X: O% q* G
CALL CONV0 `# ?4 K$ D" C" I. i, k+ r
; CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
/ N& d- q1 K8 YIR_SHOW1: RET, H' @9 [/ B0 }; A" s: j6 G# I
;--------------------------------------------------------------------2 z$ f, s! i7 N1 O" K% I
;转换为 ASCII 码并显示
( T- z: @, O+ o;--------------------------------------------------------------------
: ^; f! A/ q% W! s7 Y/ kCONV:
7 m2 ~9 Z5 f& J MOV X,#11 ;设置显示起始位置
y2 A0 I( E, \1 C1 P, _ MOV A,22H7 {6 s0 u5 L! ^
ANL A,#0F0H ;取出高四位二进制数5 i7 g6 W: g2 \; w3 V0 ~" {0 @, c1 @
SWAP A ;高四位与低四位互换2 h% z/ U) C5 X& I& R& C2 \
PUSH ACC ;压入堆栈$ g: `2 H' y. w& A0 J9 G+ t
CLR C ;C=0/ M' @9 s. m4 B" T
SUBB A,#0AH ;减109 d R2 A6 \2 J
POP ACC ;弹出堆栈
$ C) n5 H& b/ `. F6 u JC ASCII0 ;该数小于10,转ASCII0
. k& a* M+ w" | ADD A,#07H ;大于10的数加上37H& P. U: t5 L8 K) @7 |
ASCII0: ADD A,#30H ;小于10的数加上30H* j/ R9 }+ M) F; \' B2 Z
MOV B,X
8 V* m- }1 g1 v0 v9 X2 V" ` CALL LCDP21 p; S9 r! Y& G) P& N) _: r* J
q" v4 l; x$ n MOV A,22H" i6 a6 Q% q+ U0 S s0 S
ANL A,#0FH ;取出低四位二进制数
& C0 E1 ^8 J" \# v$ H PUSH ACC( [* R L2 J' ^# [; F
CLR C* ~% @) p I5 G6 i+ j; w. p
SUBB A,#0AH ;减10
8 h( D0 t1 ^9 J" ^. d POP ACC
5 y( l. Q/ B+ e9 P U: @. Z: j JC ASCII1 ;该数小于10,转ASCII0% E4 _7 l& c& M, n8 q: C
ADD A,#07H ;大于10的数加上37H
d, @4 \/ s; j8 B& s4 qASCII1: ADD A,#30H ;小于10的数加上30H9 {. ~# G9 r) z5 U9 U# W
INC X
# k" D3 `- l0 h% G' ^& O" J) s MOV B,X
4 t2 [! e4 k* K, ?9 ~ CALL LCDP2
+ i, K* F$ E7 h) v. g) n- U% P RET
0 g4 f7 ]6 q! I" o;--------------------------------------------------------" Y. ]8 j# E2 t/ ~& \8 p
;蜂鸣器响一声子程序/ {3 z9 Q% u0 \* F9 q7 |( W
;--------------------------------------------------------
1 ^% e- {: n( j7 ^3 xBEEP_BL:
Y& c) C& O! z" x7 r' m! r2 ? MOV R6,#100
: J4 M+ O% N0 f* Z. T$ X0 X BL1: CALL DEX1+ c3 m) S* {% R% K
; CPL BEEP$ p& ^+ r. Y b! R* L
DJNZ R6,BL1. ~9 u) x Z8 W3 P! R) g. k
MOV R5,#25
0 g7 U0 S: m& |) R! P' O CALL DELAY! I, f& V, R- z6 t$ R. t
RET
- }5 T& s9 E8 q4 s" j; |! K! @8 c DEX1: MOV R7,#1803 J5 W5 B0 F$ U
DEX2: NOP% D1 N+ a* Z" f, n5 w2 r/ l( E
DJNZ R7,DEX2# v0 e; n) D% g9 C
RET) M3 \/ f* X/ x+ x' [
DELAY: ;延时R5×10MS
6 A* W! h3 K* h0 x. C MOV R6,#50
1 B2 t/ J- N' k5 T D1: MOV R7,#1003 C4 Z) V/ t8 q# p" ]4 S; u3 a
DJNZ R7,$
5 `5 u1 I& A1 I; }* M3 Z* U DJNZ R6,D18 E1 {& F4 B. O4 O5 e: G% Z
DJNZ R5,DELAY! K) W6 Z$ |- I0 n- |9 x4 J
/ ^: J5 V' k0 _$ W1 ~ }% ?" h
& f0 @9 X! j, V8 N, B…………限于本文篇幅 余下代码请从论坛下载附件…………4 h0 y- F. J3 U% J" D _. w4 @
& g& W' l* x, X
# x+ U' E5 J) w$ z$ z
, ~, w e. n. ^1 Z% W- P% f. ?& _) d: l/ S% Z( x
|
|