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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

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

* m7 `' j3 }. e% n5 i: M' F

1 d% o8 k% l! J# Z( v
. f2 i! ?) z, r+ f) k
注:4 W5 S0 i8 K" D. N6 g
每个EXP实验的文件夹下文件夹分别是P_ASM、P_EMULATOR_C,P_PROTEUS_C,P_EMULATOR_ASM。
0 ^( C! a6 I$ Z$ C- ]+ ?" jP_PROTEUS_ASM        为PROTEUS汇编实例工程- P  F% r$ v4 x( y- y2 K5 h
P_PROTEUS_C        为PROTEUS C51仿真实例工程
4 J4 ?' s4 Y* MP_EMULATOR_C        为硬件仿真器(可选配件)C51实例工程$ O4 e' P7 _$ m4 }/ f) w* `
P_EMULATOR_ASM        为硬件仿真器汇编实例工程
9 e1 d* ?: |, u. l2 U1 o/ t, L一般情况下P_PROTEUS_ASM,P_PROTEUS_C和P_EMULATOR_C和P_EMULATOR_ASM都支持ISP下载脱机运行2 Q7 G  w" c* ^1 m7 E5 Q
, }  u3 T% D+ B1 _7 Q
P_ISP_C,P_ISP_ASM为ISP下载脱机运行实例。比如看门狗实验,仿真器不支持,因为复位信号被仿真器接管,所以就只能做硬件脱机实验,通过ISP下载程序。  Z2 T9 y0 J% `0 o* L( ]% ^1 w
/ V+ {. E- x( [2 H; E/ b1 Z& l
如果文件夹带有(缺省)说明暂时没有提供此程序,可根据需要再添加。
! |2 y8 H0 z) ~& {9 H6 A1 g
) w' e: ?  G% W" ^

! Z# {5 _" B8 Q1 n" e1 v汇编和c的代码都有很全面.
5 C5 K0 j  ^4 M! D3 h
9 a4 i6 F+ g3 ]+ nc语言程序:
5 K. v8 J  \' Q# R0 ^
; n" s6 y5 P! `5 I4 t8 ?
/*************************************************  
2 n+ `! j8 \, `7 s) U  p, d% e*文件名称: main.c
5 w) K  Y) F' ?$ M5 L*作 者:   
/ @: Y+ Q5 N$ _6 V*版 本:    V1.00
. s) K+ e6 c* o, r: A*说 明:    红外遥控器解码实验3 V+ b; g6 G! h+ m
*修改记录:  % X1 A. g8 I& j/ W  ]+ C
--------------------------------------------------
7 o4 N6 Z. |" P$ N- B/ _*Descriptoon: + }3 s0 x: N& q5 A6 |1 Y# r1 A! h/ B
*接线说明:P32-红外接收,P25-RS,P26-RW,P27-EN,: g  `5 _7 k' _: }- H9 |  |
           P00~P07-DB0~DB7                 ( _3 ]6 @" \8 ~4 A, v
**************************************************/                         * |: J" r+ n& g; e3 c! J' o3 s5 |
( ~2 f+ R7 Z, v( B, y
#include <reg52.h>
( D5 ^4 R0 n/ y4 Q( }- N5 @
0 M6 F3 I8 m# |% o* Y#define uchar unsigned char3 l2 r# ?7 e1 K: W, m5 R. o
#define uint unsigned int
. Y$ H$ _, l7 H8 |9 Y. Y2 q//char code SST516[3] _at_ 0x003b;
) N+ }7 b0 J# X: G' q1 E#define c(x)(x*110592/120000) //晶振11.0592
7 ]* z, ]) j7 b$ u
5 a! A6 p, }+ ?  }0 Zuchar Lcd_Buf[4];             //显示数据缓冲区         
% }9 j3 D$ M; ]( Z6 c; `  X; z6 iunsigned char Ir_Buf[4];      //用于保存解码结果
# K3 {( n9 a' U3 s, b/ L0 t) zsbit Ir_Pin=P3^2;             //红外线数据接口  u7 Z7 F2 j9 V' e9 l% h
sbit rs=P2^0;                     //LCD数据命令端
" x/ j# Y- X) \; Dsbit rw=P2^1;                          //读写接口
, t$ d: V0 J  e: |0 osbit lcde=P2^2;                          //使能接口
' I# B1 M$ s+ O( V% K0 N" duchar code table[]=" WWW#WINDWAY$CN ";//LCD显示数据
" A9 r2 P" a2 l* P/ a, M1 e- J$ o* zuchar code table1[]="Wait for IR in..";, K* D" [: O; L% N" c* w. M+ m  ^
uchar code table2[]="  IR DATA...";
! \& u+ S% w% T4 G( N9 l' v1 H, V2 L3 x9 r& U
           unsigned char code Led_Tab[]={
' f7 G4 ~/ U3 A  s0 N/ T: ]; |        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,' A( h+ |, {* {) j
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码显示码0-F
, t. y, J. ~4 Gunsigned char code Led_Sel[]={0xf,0xf,0xb,0x7}; //数码管位选,屏蔽前两位
5 U$ B* \5 T! E) Funsigned char Led_Buf[4]; //显示缓冲区
- [% v  X2 N* ]0 d$ p/ `char Led_Index;           //定义位选         . u. i; `/ E$ g  k
unsigned char Ir_Buf[4];  //用于保存解码结果
. D. v3 |% Q* ^$ b7 a6 f- \; U7 P- f+ y4 X" |, E6 w
sbit LCD_E = P2^7;
+ U" w9 p8 u8 ]//========1MS延时====================================
0 {2 I; |" Y8 d2 v& F% p9 N& e) kvoid delay(uint z), i3 K# B4 w5 l2 Z3 p2 I
{
/ d) A4 O% Q2 k: t) {4 v, _        uint x,y;
2 A9 N* C: `7 P! w  E! D! o        for(x=z;x>0;x--)8 W4 }$ X: v- t) H9 ~* G
                for(y=113;y>0;y--);
0 R0 T4 v  f  u. N: U$ m9 i}1 c$ j. Q1 F6 S+ Z
//======LCD写命令=====
( a1 K, }- x+ R& E$ p0 H/ ]9 Dvoid write_com(uchar com)+ r/ c+ [; d1 T, |) S
{
) ]: j5 H- A- n, r: N  Q! a        rs=0;
6 i" J& K! O6 U7 ~        lcde=0;
( G. O3 j, B& Y; K4 T1 n        P0=com;
( y, e3 c  _9 {2 L        lcde=1;
" M+ Z% m8 @) |, ?        delay(1);//延时1MS跳过忙信号& Z$ u" B/ B9 w: Q" Y* C2 }
        lcde=0;
3 X# b& z) ^  E* h9 S        delay(1);
% i$ d  f: V8 D" u3 \: H4 U1 d}
2 J" k) g% k, |: c% P7 b//======LCD写数据=====================================
* U/ _3 {, h# ~% C* k! t: d; s) Rvoid write_date(uchar date)& U0 w; f0 E- x: f# x; @
{7 B) U8 G: _9 S% r& |7 \0 J: P
        rs=1;2 K$ V( M, }, H' v
        lcde=0;
; d8 I1 p$ r" C2 }8 G7 J5 L) t2 p9 K        P0=date;0 Z$ @9 c. B( d2 r. `' f7 d$ B
        lcde=1;/ J% @% B- _2 D/ _9 M4 ~
        delay(1);
6 Z/ n- y# Y. z, ?        lcde=0;% `7 W6 |/ j& z3 _
        delay(1);
- X; l) e9 |. ?}
4 B8 |2 T6 ^& l7 g8 L! p; z//=====初始化函数=====================================
6 b' ]7 z5 j2 a- R. Y: pvoid init()
* S0 ~5 t) b! j2 W& W3 b1 k' m* B; V: h( A{        
( A. F) c% ]& j# m7 G' o        uchar num;% [; Z7 [2 b( W/ y  ~
        rw=0;                //允许LCD写
# A  C& T" c0 d, ]  H3 ^! y        lcde=0;* A3 D. R8 O$ f- S
        write_com(0x38);//显示模式设置                                                         
  Z0 N" l( I8 S, G        write_com(0x0c);//显示开及光标设置
) s3 J; _" P# y& |  F$ A        write_com(0x06);//显示光标移动设置+ |4 I5 a: B  O, W5 Y0 N5 @+ }
        write_com(0x01);//清屏9 r: H- T* O* i9 {5 x! p6 `& `6 D
        write_com(0x80);//显示首地址
1 z! B! u- @2 G( Q7 I/ g5 x        for(num=0;num<15;num++)//显示第一行) O, C% A6 E5 o- W* [% m
        {  @# o' R* O( z2 d
                write_date(table[num]);
. D! S3 _. d5 b* P                delay(1);; d: E9 |" ^$ |  a8 D
        }3 A7 i/ O/ h" w6 B! k) k! J( m
        write_com(0x80+0x40);//显示第二行
" O% s' K: j  L* m) Q) J        for(num=0;num<16;num++)
- p7 b* W8 U0 m        {
1 `1 t0 A6 J! @5 K0 ?3 ~                write_date(table1[num]);/ t4 Q& S* x5 Z) E7 M2 y
                delay(1);$ [; z  K; m: h6 B: s
        }
* s& y% V9 B) c& H        TMOD=0x10;                //设置定时器0、1工作模式为1
7 d5 u; e) ?9 u3 m$ O0 q}
$ Z+ C" N; d7 o9 w& q, q* J//=====显示解码========================================* q+ B5 t/ l1 @5 F& ~
void write_ir(uchar date)
$ O3 V! c, c& q* J{
7 Q' p, H4 v4 M' {5 {        uchar tmp, num,ff;          ) I8 \# m. e- i* _) x
+ `$ l4 U; @- P
        if(ff==0)
( a( V0 H+ v, n6 B2 s        {  c4 w& B5 {9 X1 m3 h4 \
                ff++;+ {- ~+ f- u* {, ?" V" y/ T
                write_com(0x01);
) h1 ^/ P) v% D/ R                write_com(0x80);
' _# _5 h& Q0 k, ]+ H+ J& V                for(num=0;num<12;num++)9 a2 R7 P( h4 Y: l
                {
2 |0 }6 D$ T) F$ [3 p' ]                        write_date(table2[num]);
- j& i) x7 Q' h6 s+ t, H/ J                        delay(1);" N' T/ b* q$ B; V. P
                }                 8 p8 z% c% g! v3 \8 I, b( q
        }
3 W, x$ e- Y( M9 w+ Z3 T) v# e) q1 G% i; l
        write_com(0xC0+6);//定位在第二行第六位
: v8 s# d" K. a' `* N        tmp = date>>4;                        // 高四位         0 o, q3 |& }9 y8 Q4 F
        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);
* L" l" e( y7 X. n        write_com(0xC0+7);//定位第二行第七位           . c5 P. X9 G8 k7 i! m$ Y  Z
        tmp = date&0x0F;                        // 低四位
% @" @5 ~5 Z0 N: s9 n6 I- ]        write_date(tmp > 9 ? 'A'+tmp-10 : '0'+tmp);         
* W: E( ?) M& r" B: Q3 `# B! ]: [8 h' @- I1 T8 k' S
}. [0 g* K5 E1 s( O( ?1 J4 V# T
//======================================================
* p- I: Z! w) a2 F$ @4 e6 R//解码取回低电平
; E* A$ T2 t9 e4 Q# K. yunsigned int Ir_Get_Low()
" I, g* M* R% I9 {0 `' ]; [{
  b, q1 w0 y$ c, X% x        TL1=0;- k2 p5 N) H4 m
        TH1=0;
# [! Z0 e* W8 S        TR1=1;
+ H: ^7 c+ x( g        while(!Ir_Pin && (TH1&0x80)==0);   //等待低电平到来              0 e" y0 U  b3 ~" P
        TR1=0;           
% T- q) l; ?0 _4 A+ r        return TH1*256+TL1;//提取低电平时间间隔时长
  y* O3 M% i4 t# W6 u* H. y! u+ h4 E; g# n}
" h4 }1 v# e+ B2 i//======================================================
6 s+ @) T5 ^6 @* q; [5 M, o8 {, F$ e//解码取回高电平========================================
! F2 L: q$ P; dunsigned int Ir_Get_High()3 V0 Y2 _/ |4 i8 ]- {; E
{
. J% w' z) w& S. R' m" ^        TL1=0;) a$ y1 K9 \, h$ d
        TH1=0;
* p; X: b, O3 a* V5 E: y! ?        TR1=1;
; @8 W0 f+ M* B9 Q! N4 T        while(Ir_Pin && (TH1&0x80)==0);//等待高电平到来0 P9 Z* [! C- ^- g
        TR1=0;
1 ?- R' F) k: h4 n. ]        return TH1*256+TL1;//提取高电平时间间隔时长- m( N* F. Q6 C  T  B6 S7 O
}3 u! p5 a7 s! R& M
//======================================================
9 l! Y1 h" T; x, G5 v; q//======================================================) h: e1 A, k# {% }( A( [' U

- e2 z0 u% O8 Q& P" @- Cvoid main()! W/ s9 G, M; v  H2 {# s7 u
{
- V+ q% D  X) X3 A- W) k" B        unsigned int temp;( L; Y: P) [5 R, F) b
        char i,j;
3 ^9 l% P8 ^8 W  F* y% s/ N; ^$ j        init();        //初始化4 q6 Q* _1 m! t. @& P' f9 p
//=====用do做循环,等待遥控按键=========================
7 V, O) M7 d" W. d, H7 W' D* r        do{2 i2 Y. r) l- n- V( U8 t% `
restart:
: T; ~) B' K: Y  V                while(Ir_Pin) ;//等待低电平7 W1 l6 @6 O. `! {! \! D+ V( d
( p) j' F- Q- J. o3 s) c8 R& h
                temp=Ir_Get_Low();//把低电平附给变量
! R0 g& m: f5 ?                if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平等待9000us
5 |; r/ n1 U) C/ f) w2 p                temp=Ir_Get_High();//把高电平附给变量( X- P! J/ f# g& `
                if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平等待4500us- @& H& f: a1 k! X8 G. w2 r, p# q
                //连续读出32个字节
' l1 `) D& L1 G( A1 M( W                for(i=0;i<4;i++) //4个字节
; N9 U7 `8 u7 Y; s7 n8 M2 n1 _3 Z5 H                {# a2 @4 [3 r1 d( {1 c
                        for(j=0;j<8;j++) //每个字节8位! ^4 e) q& D. X& }% g" T2 K
                        {& N2 B9 @: K. f1 A: u
                                temp=Ir_Get_Low();
/ X7 K4 o  o9 G7 q3 r, M; ]- s2 u% ]                                if(temp<c(200) || temp>c(800)) goto restart;//等待560us跳过低电平
, g: Y3 Y+ U& F1 z: R  {                                temp=Ir_Get_High();
- D% f. j2 }/ l( p( r; d* F  B/ ]                                if(temp<c(200) || temp>c(2000)) goto restart;//等待1000us跳过高电平# I- u/ K' C* F6 N! F6 d" y
                                Ir_Buf>>=1;//把电平移进数组2 W7 g9 ^5 Q% W* a( }
# J& W0 x. h; K, o0 l4 D
* \* N4 W$ J0 {! O1 ^
…………限于本文篇幅 余下代码请从论坛下载附件…………
* f5 B+ J5 {& J; y" S
  v* K0 Q  j8 n; x汇编语言:
5 A  ?3 R; J& Z% P+ O, S( s' c' D) n7 s  \

+ |/ h7 V& v) f; x7 _;-----------------------------------------------3 x0 R+ p2 C8 x8 F" u
       IRCOM  EQU  20H       ;20H-23H IR使用
, w. U0 c  a! N1 [5 _        X     EQU  26H       ;LCD 地址变量" C5 L; O" r; g  J) {
2 S! R; S) S/ |, i, m0 b6 a
       IRIN   EQU  P3.2# V& A- P6 W9 N6 C
;       BEEP   EQU  P3.7
( z% S) o& h1 Q1 Y8 l; Y/ @;       RELAY  EQU  P1.0# V0 N1 I% M& W  W

/ [- m& T/ w( o+ i8 I  {        RS    EQU  P2.09 G8 A# K/ S7 s
        RW    EQU  P2.1) Z, B- R+ D2 I# l; }& R3 W  `
        EN    EQU  P2.2; Z3 c. n2 u6 R0 y* L: C
;------------------------------------------------- V2 k7 s- v8 \! `
         ORG 0000H* T$ I+ @, `" A! b; p0 z
         JMP  MAIN& t: G( `3 y: _( L  v! z& J
;------------------------------------------------# H- e9 k; I- L( F' r" O* k
          ORG 0100H
$ r/ I/ [5 ]6 u9 R/ ^5 x  PMAIN:5 U, R$ k0 `% E7 g4 o5 s# S2 Z
          MOV   SP,#40H4 a" e: B5 D2 \7 n7 N
          MOV   A,#00H
& J# k/ c  X3 M+ g0 K: C          MOV   R0,#20H
: \9 k/ ^. C) M3 q5 F* N; E; CLOOP0:    MOV   @R0,A          ;20H-26H清零
2 ?6 w& u! K0 m7 ~! p          INC   R0
7 d, T) X  [- \  f% u4 }          CJNE  R0,#27H,LOOP0  s; q1 g8 u- `! g* M
          SETB  IRIN) r7 z- }; q8 K
          CALL  SET_LCD! }' ^6 H! J. j
          CALL  MENU1
5 C  g" S9 ~7 r. o. Z4 k7 `LOOP1:1 }: v; |2 m2 g! w
          CALL  IR_IN4 x3 a6 O2 m5 T& ?
          CALL  IR_SHOW3 t1 h! i, ~$ ~# m: E5 f7 N9 U

( |+ l+ u. |9 s;          MOV  A,22H' {+ \- O, y0 C
;          CJNE  A,#40H,LOOP2    ;K17键按下$ k( ?& I% z" L: s6 H9 a
;          CLR   RELAY           ;继电器吸合
$ r& t6 D. u5 r;LOOP2:    CJNE  A,#04H,LOOP3    ;K19键按下
$ a. k: p1 x7 l. ~$ Z, Q;          SETB  RELAY           ;继电器关闭
$ v0 s- s- P, V3 @5 d  h;LOOP3:    ! r2 J4 p+ V5 R# [6 s: H) s: O
           JMP   LOOP1
& S" G( ^7 F% S2 J0 w$ k% j5 K
/ g+ o4 V2 y9 f# f9 d;-----------------------------------------------------
% R. M$ }, r/ V6 V! v7 j0 Q6 W;  LCD 初始化设置/ a+ V; x4 g! b) i2 o* E
;-----------------------------------------------------$ `8 d* A( E! d& V
SET_LCD:
' B$ U" _/ v/ a          CLR  EN1 g* b: y$ x" m- v6 P, w
          CALL  INIT_LCD     ;初始化 LCD1 A5 a3 {8 t: i3 f3 M
          CALL  DELAY14 `# e6 W/ l* v
          MOV  DPTR,#INFO1   ;指针指到显示信息1
. K7 ]: \) }1 m          MOV  A,#1          ;显示在第一行' w: c: _- {- ^1 l
          CALL  LCD_SHOW
$ B$ U  p" E6 B9 q& o3 P          MOV  DPTR,#INFO2   ;指针指到显示信息2) \# @2 H$ S) v+ i$ P7 e: p
          MOV  A,#2          ;显示在第二行, U% S0 l8 g# w) M! _3 ~
          CALL  LCD_SHOW3 `5 |( m% L! K, j
          RET
% t/ W# d$ Q" G- ^2 \1 E, Q;-----------------------------------------------------! h8 C9 e2 @* `4 n7 c& v2 M2 A; {% I
INIT_LCD:                 ;8位I/O控制 LCD 接口初始化0 _7 N8 W$ ~% A
          MOV  A,#38H     ;双列显示,字形5*7点阵, s4 M* s! ?% m3 E8 F. z# f$ y
          CALL  WCOM: h4 u8 l8 i$ x/ q& ^  B, C
          CALL  DELAY1" Y. @: P  C* I, N* s
          MOV  A,#38H     ;双列显示,字形5*7点阵
6 o9 v9 G$ |7 d% @$ w4 f          CALL  WCOM
! |9 n5 U1 @& H0 L          CALL  DELAY1
4 B! y( r8 \9 _, q5 O          MOV  A,#38H     ;双列显示,字形5*7点阵# D% u% ]5 S7 S, F  N8 e  f- t
          CALL  WCOM3 b9 U  M9 X/ B3 S4 w$ W
          CALL  DELAY1
2 D& ~2 P# L! K# y1 ^0 a          MOV  A,#0CH     ;开显示,关光标,. ?9 j' m  j) w0 k1 i3 r
          CALL  WCOM! j' V( V* X9 L$ p! H3 Y
          CALL  DELAY1
* L4 W9 B  ?* o          MOV  A,#01H     ;清除 LCD 显示屏2 C% L$ ?1 E. R9 i9 u3 y$ L
          CALL  WCOM' t( m$ R, u5 x$ p8 H5 e: u2 E
          CALL  DELAY1
, @; H+ X: [: x7 Q" m! ^          RET
5 O" q6 p7 I- n- B, L0 h;----------------------------------------------------
, H2 H( k/ ~3 Q' NLCD_SHOW:       ;在LCD的第一行或第二行显示信息字符4 j* Z) I* {! `* Y

# f3 q/ D8 {2 d# |! c6 `8 C* _4 N          CJNE  A,#1,LINE2  ;判断是否为第一行
: ]; ?  q2 m2 K4 d7 t  {  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址5 h- }9 }1 e; J" }
          CALL  WCOM        ;写入命令
( o  X$ I" _! i/ q! x) C, D& K9 P' u          CALL  CLR_LINE    ;清除该行字符数据
/ u  S# [* R" C1 O          MOV  A,#80H       ;设置 LCD 的第一行地址
/ g" u; k. T, {0 x          CALL  WCOM        ;写入命令8 W5 O* M% C* G4 b! n6 d
          JMP  FILL
& w! b( L9 l# q9 o) p7 ^0 r4 r2 y8 o
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
3 e% e' N9 P. p          CALL  WCOM        ;写入命令
: ?% \$ x# l  i+ p1 I4 Y1 M1 p          CALL  CLR_LINE    ;清除该行字符数据
* M0 I* Q& {& N1 W          MOV  A,#0C0H      ;设置 LCD 的第二行地址
7 A: v# N; t" {. N" w          CALL  WCOM
3 N+ v  M( x$ N) e9 A6 Y6 R  FILL:   CLR  A            ;填入字符
3 H* E5 o$ A4 `. f" c! T1 I4 @6 @          MOVC  A,@A+DPTR   ;由消息区取出字符! X$ ]% R" m# J% v
          CJNE  A,#0,LC1    ;判断是否为结束码
/ ?  M& M) g' Z          RET
/ C9 E+ k  Y9 M  LC1:    CALL  WDATA       ;写入数据7 W1 u4 e1 H9 ?
          INC  DPTR         ;指针加11 F% C' l, N) J% k
          JMP  FILL         ;继续填入字符
" ~' L* t: _( t$ o; r! Q5 B          RET" T/ T- _. P1 P: D# w+ I
;---------------------------------------------------
0 R. k( f( o, iCLR_LINE:                  ;清除该行 LCD 的字符2 T0 }, T# w8 ]$ M! l* B
          MOV  R0,#245 ?$ n! K/ f: T7 h3 F7 T( V
   CL1:   MOV  A,#' '* ]+ y  D" i/ ~) c! z) p7 h
          CALL  WDATA5 a6 ]0 E5 R# a
          DJNZ  R0,CL1
6 J9 p0 `0 b) S- b! L) f; s          RET5 I" u1 E8 n; x7 p, X
;----------------------------------------------------
- |% }6 t9 e; D5 t: z: S; Z4 mMENU1:                      ;LCD 显示工作菜单信息5 F! D6 z+ ?- B7 Z7 }
         MOV   DPTR,#MENU2
4 N. g9 p% J* f0 {- w) j         MOV   A,#1         ;在第一行显示信息( y5 }* b/ I4 j/ j6 \
         CALL  LCD_SHOW
0 \! S! J5 w1 B+ S( g2 h         RET: ^# |% V1 |4 q% u5 y" r
MENU2:  DB  " REMOTE CONTROL ",0
  U8 |' i% _. L* a  q0 K;-----------------------------------------------------$ G6 x+ C/ w$ _; U4 @9 m) _( p7 w
INFO1:  DB  "                ",0  ;LCD 第一行显示信息2 [" G5 u, G0 n7 T- T. M8 o
INFO2:  DB  "  IR-CODE: --H  ",0  ;LCD 第二行显示信息
) g& `. Q/ E- d: _! i+ @2 z;-----------------------------------------------------
" W/ G* Q. B1 j. F5 \! m3 e& O# F4 J8 L: C, X
;------------------------------------------------------ Y* z6 k5 k$ U
; 写指令、数据使能子程序; X7 s: T# E# z% J+ |
;-----------------------------------------------------
' C" {6 H8 T. I! rWCOM:
7 s" S* |3 ^2 p6 @& l8 U- n          MOV  P0,A        ;写指令使能) l! p& Q7 S7 }! N/ m% n, H- H
          CLR RS           ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
5 u5 a2 d- J& s9 P+ [          CLR RW
, D0 p9 d' i/ U& T( E          SETB EN; X9 h/ p, c4 M; ]: m2 k; g
          CALL  DELAY0; Q4 v+ Y. M; l5 _! U7 `
          CLR EN
7 Z8 J! g9 I% ?, r4 u4 K, o          RET
9 @' `0 R& ]1 N7 ^1 C/ W: S5 K; U( ^+ D' c) Y4 A3 R( q5 d
WDATA:) {9 T7 K5 A# |7 p' S2 J0 ~
          MOV   P0,A      ;写数据使能
9 y0 e. X! B, l  v          SETB  RS        ;RS=H,RW=L,D0-D7=数据,E=高脉冲
) V0 X1 ^6 P  J( V4 b' }          CLR   RW
1 _% |& E0 k( |2 I8 q. F9 ^          SETB  EN
9 Z5 @0 Q# z3 _& X5 k          CALL  DELAY0
/ O7 b( p! _; |/ |( x: K, i# D! S          CLR   EN  b1 R& V: m3 K
          RET
+ {, g- S1 ?, ~* \' z  {) e' C4 o! ~$ m
DELAY0:   MOV  R7,#250      ;延时500微秒
- i+ @, Q: Q* a' ^, e3 _+ G          DJNZ  R7,$4 w& ^" g# O1 V& y( Q: r
          RET; Z# C* I" c6 F5 i/ z9 \
;---------------------------------------------------- {4 R# X" f# E5 f
;在 LCD 第二行显示字符
6 A% [5 D2 R, t- `8 i- g# w. a8 y0 H;A=ASC DATA, B=LINE X POS. K! ]  {  V# s( U4 o" w) {
;---------------------------------------------------
& n- V! M5 Q7 C+ A& T+ F9 GLCDP2:                    ;在LCD的第二行显示字符
1 W6 W; }; ?' e  r$ Q( \! z         PUSH  ACC        ;
) s' x3 w3 t" l+ `3 K7 K         MOV  A,B         ;设置显示地址3 B3 }, }0 g& y: C: V
         ADD  A,#0C0H     ;设置LCD的第二行地址& g( x- X( h1 c* S7 i7 V8 K
         CALL  WCOM       ;写入命令
3 l& a# }$ W% _! x! h! z         POP  ACC         ;由堆栈取出A
" ^" b8 a2 H" h) d2 _& B         CALL  WDATA      ;写入数据
1 H8 E- |1 P/ p/ T2 j6 N8 n/ K* v         RET7 d3 f7 D5 b& Z: T5 l0 B
;---------------------------------------------------
$ v8 ]* }; A$ f) x0 c8 g0 Q' t2 b; IR 译码子程序
- u( d3 ^4 d4 Q) O7 d& s;---------------------------------------------------
. x) ]; B" L) eIR_IN:              / m; T' N7 }, s7 f7 t% t+ g. F
          MOV   R0,#IRCOM
1 m7 z2 [/ M6 z  E, N I1:      JNB  IRIN,I2       ;等待 IR 信号出现
3 a( P% {1 j8 H% ?4 K          JMP  I13 \& D4 `* A, c5 ?; D+ s$ Q) L
I2:      MOV  R4,#20
- D) q; f, G& Z7 C I20:     CALL  DEL4 ~1 f' m7 o/ J
          DJNZ  R4,I20
: t" ]  @! g$ k) J/ T8 S          JB  IRIN,I1        ;确认IR信号出现
# L; u$ u$ Q, v4 O2 M I21:     JB  IRIN,I3        ;等 IR 变为高电平
, n2 p- w2 ^& g! M& E/ c          CALL  DEL8 N/ ?) `* e- j% l
          JMP  I213 n7 `+ O. _8 x  l: P4 }2 [
I3:      MOV  R3,#0         ;8位数清为0. t: P7 K, J9 v1 }
LL:      JNB  IRIN,I4       ;等 IR 变为低电平
  A  c0 v1 j* v7 S          CALL  DEL- J, |7 N& L$ i: Q* A+ }& R
          JMP  LL: Z4 c+ r1 ]- K  Z& {
I4:      JB  IRIN,I5        ;等 IR 变为高电平
* y+ y8 c% h& v8 H) h$ R0 V# ?( A          CALL  DEL
/ @' V5 a, x% n4 V$ H7 i: c* a3 j" T          JMP  I4, \6 f& U6 ~+ X( Q7 `! _0 g' x% r
I5:      MOV  R2,#0         ;0.14ms 计数7 r3 I+ Q" ^8 ]: {+ \
L1:      CALL  DEL
) O9 a6 q9 v5 @. o6 u; \) i) r4 Z          JB  IRIN, N1       ;等 IR 变为高电平, K) V( x" |6 U1 X% o
                             ;IR=0,检查R2中的计数值 - g; f0 T( l9 U. e: j$ C
          MOV  A,#8& Z: u, r) b9 C
          CLR  C& N; s2 A: a- k
          SUBB  A,R2         ;判断高低位
8 p2 K- K4 m( b4 n/ T% j) X; Y- H0 b                             ;IF C=0  BIT=0
$ O6 `- ], j& ^! Z0 r          MOV  A,@R0! m8 E& M6 b2 n. k
          RRC  A
1 j/ a* ?; P' b9 J          MOV  @R0,A         ;处理完一位/ Q2 `# V; w: [1 ~/ t
          INC  R33 G& `' V8 b" \6 H4 Q, f% C
          CJNE  R3,#8,LL     ;需处理完8位  # c8 A* [/ M0 k& `3 d7 l; p& v  r
          MOV  R3,#0! y- {% E$ _' ^+ I
          INC  R0
  F3 c  V& I2 m1 c+ j6 H' L' f          CJNE  R0,#24H,LL   ;收集到4字节了' C+ R* I' I" z5 L: e6 f; A
          JMP  OK" n7 f; z1 l; j- E: e
N1:      INC  R2$ [1 I- ]% c* |* d2 w0 J9 K
          CJNE  R2,#30,L1    ;0.14ms 计数过长则时间到自动离开3 Q; q; s9 i0 E" O
OK:      RET; H9 c4 z. Y- ^. w4 `5 O0 Y; {
;--------------------------------------------------------------------. P7 e5 m! ^' l, f% q1 I2 J, w
IR_SHOW:6 j( b& N4 u7 |
          MOV A,22H( o8 W- g5 x/ b4 m" q$ G
          CPL A                ;将22H取反后和23H比较/ |4 l4 u3 b1 g) l
          CJNE A,23H,IR_SHOW1  ;如果不等表示接收数据发生错误,放弃。) q  R) T0 l, A' v- z% y( I, l
          CALL   CONV
6 M% u; Y# @" F, E;          CALL  BEEP_BL        ;蜂鸣器鸣响表示解码成功
! w4 _1 j3 U) e# eIR_SHOW1: RET
4 P& z4 z2 K1 Z& l0 N. t;--------------------------------------------------------------------
- g2 ?3 X# m. J' _9 v  x$ r4 I;转换为 ASCII 码并显示
: h- P7 y6 J# I9 V, }8 T;--------------------------------------------------------------------
" ]+ s" G* j5 M" Y# e  [; f& T6 q1 q# [9 L* qCONV:
) e" C/ m. Z6 U" w! ~+ }$ O          MOV   X,#11        ;设置显示起始位置
; k" u& O4 g; |0 R* \2 Z6 |2 R5 i          MOV   A,22H
8 @" r+ ?& O4 X          ANL   A,#0F0H      ;取出高四位二进制数
* b9 j& L( {  T7 i% o. L' |          SWAP  A            ;高四位与低四位互换
. r/ h! s) a: [( g! \: Z; r2 O          PUSH  ACC          ;压入堆栈, E4 c6 H7 ^0 j5 ^2 E5 E
          CLR   C            ;C=0
: c8 t+ M0 }9 g( S; N          SUBB  A,#0AH       ;减10
" e, J6 j, h* s) [- o- L# t          POP   ACC          ;弹出堆栈
0 v2 {  d/ a$ E          JC    ASCII0       ;该数小于10,转ASCII0
4 q$ @' I3 ~$ i" Q. T          ADD   A,#07H       ;大于10的数加上37H- w# H/ n; T) e/ R' m3 F" R0 V
ASCII0:   ADD   A,#30H       ;小于10的数加上30H) |3 j2 Z- M; o* ~& W
          MOV   B,X
0 O2 l, D) g6 v# Y3 x5 b% Q7 G          CALL  LCDP2
: [2 U" D7 E7 M% `1 h, F4 r3 A
# G# f8 i. G8 E# s) X1 r7 \* t          MOV   A,22H$ u! ?" N8 {3 x
          ANL   A,#0FH        ;取出低四位二进制数5 u7 n; X, r( f: `5 Q; s# S; f! c
          PUSH  ACC) M: {: n& E& A( y
          CLR   C* G4 D1 P9 m. }" K  u7 m7 x2 U
          SUBB  A,#0AH        ;减10, o$ y6 z. O1 v4 V
          POP   ACC
& b% x9 M9 {  l1 g6 ]' x+ |          JC    ASCII1        ;该数小于10,转ASCII0
5 {6 q: ?5 o3 ]% o& z          ADD   A,#07H        ;大于10的数加上37H
; q' n# P0 ^. \- [) Z% gASCII1:   ADD   A,#30H        ;小于10的数加上30H# l5 L- E- q5 C' f* [
          INC   X% c1 D! O& b4 H' t9 M
          MOV   B,X
; x0 K$ d" @! _5 z7 n5 O9 z          CALL  LCDP2
5 Y! j  d, j- H' E% U3 J2 r          RET( l" e1 p" \7 R* K) e. x% x
;--------------------------------------------------------
6 Z& M' Q* N! ~' F;蜂鸣器响一声子程序) w1 {# X7 n' ~; F: a
;--------------------------------------------------------2 F7 e7 d, U$ V  T
BEEP_BL:* J1 ~  u; p- F/ B$ R
         MOV  R6,#100$ }0 j0 ?& Q* P
  BL1:   CALL  DEX1
% |) L! \: `; j;         CPL  BEEP: b0 W5 d- `) l! Y
         DJNZ  R6,BL1, a. t$ x/ `1 `) A( U- F1 V
         MOV  R5,#25
8 r- R* O5 g# m+ r6 |7 u         CALL  DELAY
# {; m, F6 m9 b. @" @- L         RET
2 T/ F9 a0 M# M! p* E" x DEX1:   MOV  R7,#180+ \$ ]$ l; E8 {7 h$ \" y" R' |0 `# w
DEX2:   NOP% h0 O/ @0 C4 c* m3 B
         DJNZ  R7,DEX2
: V9 n  M0 g  f7 e  C1 k         RET2 F" o2 e( M" p) u: d8 \* D
DELAY:                    ;延时R5×10MS
# r# s) U( J) z2 S4 G* u" w2 \$ E) D5 _         MOV  R6,#50
: v5 ]% g: j9 l; @  V  D1:    MOV  R7,#100
9 r9 f+ k, z6 k% N" _/ c0 I8 G+ {         DJNZ  R7,$
1 S6 f0 Q0 B* b         DJNZ  R6,D1
5 [5 }0 s% X  C1 C, J2 L         DJNZ  R5,DELAY
; t* l3 l% R- n8 r
# A+ V+ a' V, O3 x
' V& w2 F/ E$ v6 q…………限于本文篇幅 余下代码请从论坛下载附件…………) p' R3 L7 `6 @5 x. Z; z
游客,如果您要查看本帖隐藏内容请回复
0 o. q- L. m# C! r" M

- [; x; H1 J& {- o* w

! E/ |) B" s; n5 w- J5 @' C8 m* G! {4 H' D

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 07:49 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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