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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-11 08:19 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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