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