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