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