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