找回密码
 注册
关于网站域名变更的通知
查看: 803|回复: 2
打印 上一主题 下一主题

单片机红外遥控器解码实验 C语言和汇编2个版本的程序都有

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-27 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2018-11-27 10:10 | 只看该作者
厉害了 学习一下

该用户从未签到

3#
发表于 2019-1-24 15:54 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 06:18 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表