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

51单片机的红外计算器程序源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机的红外计算器程序源码
2 c* j* Q- c* `. q% I7 g, V' Klcd1602和单片机接口自己在程序中看
1 F" @. O% Z/ \7 r$ X2 o单片机源程序如下:8 L5 J: D6 ^+ i* N% {$ X
9 U+ R& H3 P6 a2 F$ w
3 d" }+ J6 S* y& k, c( N' B7 C
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义, U- e9 e" m( p, F1 q. q& v
#include<intrins.h>1 |1 ?' |6 \3 g4 I' r* [! ^1 S
sbit RS = P1^7;   //定义端口
1 H5 h. s) \5 m) {& jsbit RW = P1^6;
/ N- j9 F/ I. esbit EN = P1^5;1 J+ L" [  ]6 ^4 m) x& Y
sbit datk=P1^2;
/ B) I  n( x7 \- V9 P. G8 o& P" Tsbit rest=P1^3;
7 {) V6 H; C7 U6 ?0 fsbit IR=P3^2;//中断0,红外接口                                                                                                                                                                                                                                                                                     //红外接口标志; ?: l! V  w% C
#define RS_CLR RS=0          //选择指令寄存器5 _. r9 \" C( h& e5 N( L$ \
#define RS_SET RS=1          //选择数据寄存器% A- m! x: H0 ~
#define RW_CLR RW=0          //把单片机数据写入lcd
* l8 j. v& B3 c, \( Q$ X1 |7 t3 J/ o#define RW_SET RW=1          // 把lcm的数据读出到单片机
! ]8 |9 X" V4 s7 V7 _4 ]! s#define EN_CLR EN=0          // 允许对lcm进行读写操作
0 |4 G2 j! S1 [; ~" y+ c  j) T0 F#define EN_SET EN=1          // 禁止对lcm进行读写操作! @7 ]% v, z' P/ u! E
#define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P2 替换  S  J# T. F( F, F6 u' P
/*------------------------------------------------) p, W6 B# [% ]" b% p
                全局变量声明4 I7 q# u+ G$ B2 n5 T/ U2 ?" S
------------------------------------------------*/4 }! }: q) B/ O7 W. B& U9 J0 L
unsigned int p=0,flag1,qingchu;+ h9 u- T$ o  {# `
static int a; //静态变量a* B% _+ T/ L' B0 X- ~8 p
unsigned char table1[4];! r/ U1 u0 R, ?) }  J
unsigned char  irtime;//红外用全局变量+ P" Q( u" S- a
6 r9 Q7 G% v8 [8 a. U
bit irpro_ok,irok;* h! G, G5 F% }$ X0 d6 m
unsigned char IRcord[4];     //四组数据,
( u5 w2 o1 k0 w* i' R0 Eunsigned char irdata[33];        //前导码加32位数据: r5 m- P3 y3 }/ q4 `
unsigned char dat[] ={'0','1','2','3','4','5','6','7','8','9'};
4 t& ^7 F2 W9 h- }+ v+ Q% ]1 o/*------------------------------------------------
6 ^# ]  H: y  v; ]0 j' h3 H; V                  函数声明
6 O9 k4 Z+ r! @& u% c6 S------------------------------------------------*/
- V+ I, X& X5 y% \/ O) y8 u* d1 a. R! `5 j1 I# x0 i% @
void Ir_work(void);          //红外键值散转函数& a8 i- S( W7 N+ y: e' z
void Ircordpro(void);  //红外码值处理! w8 _! J% ~' o, d3 w
void Delay10ms();                //延时函数
1 u5 H* d* m& H- Lvoid delay1ms(void);           //延时函数
9 b5 i# @- C) z, F4 evoid music(z);                        //语音函数6 {1 o! W* ?/ G+ H
/*------------------------------------------------
( Z" p) Z- m& f0 ^ uS延时函数,含有输入参数 unsigned char t,无返回值
  u. V% a7 k& v4 z1 {( Q$ e9 ~0 L7 s unsigned char 是定义无符号字符变量,其值的范围是. E( H3 m2 |1 }/ Q2 g
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
; p3 v+ q3 i8 L8 f" Y! ~5 ?" V 长度如下 T=tx2+5 uS
2 a1 h) f. I& K! D( ?& j------------------------------------------------*/
" ^) O6 b, ^. `1 P) W4 x- Fvoid DelayUs2x(unsigned char t)7 j5 f3 t' r! S8 V) C
{
9 d. }% W, D: C  X while(--t);
( P# o: N& [5 @: A+ c}
/ F( Q6 J$ r% k1 c4 b/*------------------------------------------------. I/ C/ I  b2 K4 g* D8 \* o
mS延时函数,含有输入参数 unsigned char t,无返回值* j, t  N6 T) g1 ?# Y
unsigned char 是定义无符号字符变量,其值的范围是& p2 k3 ]' x+ ?$ v' x" }- q
0~255 这里使用晶振12M,精确延时请使用汇编+ C& h: ~+ J6 T
------------------------------------------------*/! A. P' G+ Q8 i( e. h' B& K* E
void DelayMs(unsigned char t)
' p- H5 l" j! J  H8 }  N{) Q- i: ?: f" _" _* c4 ^$ `

- o9 H1 G; M& D, M2 N while(t--)
  U3 f, r6 h  G( \ {
1 r! x/ g6 k- X8 g* P     //大致延时1mS
! P, A9 t+ P# r: S, N! {3 ]4 j0 c     DelayUs2x(245);
% B) v5 P/ q. [& t         DelayUs2x(245);
& N, G3 |7 I9 L9 q! o$ e& q: m }
3 b& a! w& R/ V2 _9 @7 L) Y& W}
" n4 g9 p. ^: {, A( j7 I/*------------------------------------------------
; j- b/ \. |5 V0 Y' u; |6 g              判忙函数/ P7 _1 m) x  d/ m& X. d
------------------------------------------------*// R! O$ B1 j2 X! N; R
bit LCD_Check_Busy(void)
1 j1 X1 X: k1 `# h3 W {8 E- d+ c1 E6 w
DataPort= 0xFF;
& s( o9 g  E4 T  {% S! b* Q RS_CLR;     //选择指令寄存器
5 J! g5 h! M) a% V% k5 Z/ x& N RW_SET;         //把lcm的数据读出到单片机
  v8 Q% S! a, j1 W4 K" v, h EN_CLR;         //禁止对lcm进行读写操作 # v# k' V0 i; Y8 h% c' E, I3 {& y
_nop_();
4 W& d( Z2 |" I, e0 n7 I, B EN_SET;3 b# E# B. a$ A
return (bit)(DataPort & 0x80);
; F  L- f- e, F- Y9 X5 g* h  R }. [4 `* e6 x- X7 M9 M
/*------------------------------------------------
' e4 x2 r4 y' E6 r* V              写入命令函数
8 P; c, `0 W2 m% f, |5 t8 I/ `------------------------------------------------*/
; W: x0 l1 W! c void LCD_Write_Com(unsigned char com)
- L7 b0 l3 x1 V, w2 q! O4 U# D {
6 T- j7 T2 L4 R2 j, X while(LCD_Check_Busy()); //忙则等待
+ b  S+ B) t. D5 g. Q9 Z) l+ a RS_CLR;
, o( k: g2 _% Q RW_CLR;8 N4 F/ z/ ~+ _7 _" S
EN_SET;
, H7 Z7 v4 c  R# R9 a" ~2 E DataPort= com;5 i% f4 \6 I. J, g
_nop_();* C# d7 L3 d% E' L
EN_CLR;
" n) R! t3 W; O/ S8 @1 |3 w8 d }* W6 U1 }2 R, U, C: E+ I% E
/*------------------------------------------------. s+ ^) D$ U- A% a+ `, w1 W% F
              写入数据函数
$ T( k( y2 V' @+ D------------------------------------------------*/
0 p  B2 F5 c. v3 P6 B( M2 B# O# w void LCD_Write_Data(unsigned char Data)0 n1 Y: Y* g) s# _" X
{( h( o8 k/ i: I2 p
while(LCD_Check_Busy()); //忙则等待
! A% I# A6 H5 G0 \7 V% J RS_SET;
  p* o1 V) W2 {* x: X4 z( a RW_CLR;; a0 O6 n3 t& G& N  L. C
EN_SET;; c" @: B6 M- I- |
DataPort= Data;" c8 F" w$ y; Q7 ]
_nop_();% A1 ^) Z% G5 Q# f  M
EN_CLR;7 o2 Z; z/ ]4 s9 O
}- h% C* D9 a- f% s* M9 [
: [9 F+ D% Q8 I; p
/*------------------------------------------------
$ J6 j8 j7 v! t, n$ b                清屏函数+ Z4 l4 H+ l4 K0 `
------------------------------------------------*/
: d! k, _# c7 y5 y& ~ void LCD_Clear(void)( o& K8 m9 R. Q) N
{
% c" P4 S* d) N3 S$ V/ ~ LCD_Write_Com(0x01);
  @2 q- j6 U# K1 a DelayMs(5);
. {9 }, m. w* c, `: u9 d }6 u0 ~8 f1 u' v4 I: P* c

$ {9 V( I, R% E* S/*------------------------------------------------3 A# g% X( P1 `9 q2 }
              初始化函数& _7 I! @/ Z8 P6 ^
------------------------------------------------*/
! K! I, i6 D; o: e( j; t/ S6 n void LCD_Init(void)7 W+ f- B: i) A. {% K
{
  s& k7 E# B/ O   LCD_Write_Com(0x38);    /*显示模式设置*/
9 L: @, H& a. n+ N2 o2 W) p. J   DelayMs(5);9 Y+ [5 I3 [% r  V" M$ Q
   LCD_Write_Com(0x38);! r  S( K$ A) O$ R* N
   DelayMs(5);7 w5 ~* ]' ^! {! y7 T0 c
   LCD_Write_Com(0x38);
5 ^7 Z, H( Y4 U/ |+ O& C) y% S   DelayMs(5);! T4 S- H0 ?% j2 y9 c! B$ _
   LCD_Write_Com(0x38);
4 H4 h  T- B# T9 h% V- W& B   LCD_Write_Com(0x08);    /*显示关闭*/8 M" `7 x# E5 _: P7 p3 Q, W+ R2 o
   LCD_Write_Com(0x01);    /*显示清屏*/
  n. T4 [( z3 @, p: [   LCD_Write_Com(0x06);    /*显示光标移动设置*/
4 f$ ~2 B: q/ i; X$ @   DelayMs(5);
6 f* }$ T) {' `5 E* M' U   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
0 `( \0 F" j# x( }: d: \1 d   }
1 ?" d  ?/ r7 n
7 ]# A( s/ V& P/*------------------------------------------------
; i) F! l: q4 q- ^                  定时器0中断处理9 O. C& a# c& E
------------------------------------------------*/3 E8 y0 R' v6 @. o  r& S$ B. V1 |

; I3 S, X, \+ N$ U( ivoid tim0_isr (void) interrupt 1 using 1
" P& q; j, q8 p5 ?{. C# T, [4 r9 @; s6 w( D, X
  irtime++;  //用于计数2个下降沿之间的时间
# D6 S& y1 b8 t" R1 P3 s* G}
% q' a5 G0 P) T8 K# @6 [# C1 ]7 N/ j" T
/*------------------------------------------------, z1 P; g; r3 z) b4 L$ N" I% }
                  外部中断0中断处理# ]& o) }! T' \! e, X* V* x
------------------------------------------------*/- N" I! u& _; d: W
void EX0_ISR (void) interrupt 0 //外部中断0服务函数4 \% l9 }: W$ K/ B
{
! P  a/ c  Q4 }9 G6 L4 Q4 `. ?  static unsigned char  i;             //接收红外信号处理  Q6 n) ^* v& A! \* g' y, b
  static bit startflag;                //是否开始处理标志位( P4 a+ N6 [6 n6 S1 m+ Z( z" s
* t9 h5 i+ d) D' K! p
if(startflag); Q) j) C% f( D
   {
5 C# n5 ]% ?$ h3 n    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
. i* H! D1 O( u. W- F. l4 z                        i=0;9 d, G8 E! B2 @5 K' l! ^1 Q9 o/ z
                    irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1& w1 S% v5 A/ t, v! h. H" h' }
                    irtime=0;
' e+ k! V- q+ b$ b8 e7 H. x7 f                 i++;" s$ f/ ?3 q9 O
                            if(i==33)' S3 E# N0 Y  L$ [' C& _, r
                              {
7 h) N9 q, L. X) F) }9 `% Q% C                                   irok=1;
" t4 y9 a1 t6 M  T+ k1 J9 l# N                                 i=0;0 a' _3 F+ i9 n6 E; |+ V- \8 n$ {0 v
                                  }8 G$ c+ _; I' C
          }
5 j4 I  d( i  f2 V  A           else
6 g4 K. ^. p" o9 _; [; A                {
: y. q9 _7 e6 @9 s7 G5 D7 _                irtime=0;& b1 E( F8 k# M3 A. [
                startflag=1;
# k* w! E$ s" T  b. r                }7 I& X: T- z$ k) \; N; \& t! }
1 B# y, o5 ~, P. T& B# _. X2 {/ f3 j
}4 Z9 A) r. C  v+ g- S% Q
8 E6 G: X# T. M. p) d  R9 G
& M4 g( \# V/ }2 h2 ?# s
3 x) h8 y- T$ m' k; M
void music(int z)) s7 R! Y4 K: P) z$ o4 ~6 h/ d
{2 H- W# t2 n( N  k; h
rest=1;8 Y6 f9 P2 Q# Q3 D' P
delay1ms();
# M% s# {/ f9 U' x+ [3 x. O; Sdelay1ms();5 W- ?+ h$ w5 E
rest=0;$ C3 q9 y- M& {$ q* u/ h% K: Z7 K
delay1ms();9 i) V  D' `3 G; p) h# J
delay1ms();
. i/ y! `  P* [2 [  T, o5 O            //前面给语音复位,详情看语音资料
' j( W; j% R0 q( y- D1 Rwhile(z>0) //给b 个脉冲让语音播放b段语音
8 e3 H& J' f0 q/ x{. K" {( {" Y' Z8 Q% O1 `
datk=1;
. x3 ?* B- x7 f( J# fdelay1ms();
. ~5 K1 K1 P1 v: h% L" T) Adatk=0;7 w8 e+ @7 k0 j
delay1ms();1 w5 u. S8 y* X6 ^, i& A3 C! a0 }
z--;: R5 l4 S7 X* a) Y4 F' I
}         }& L  R, b$ m/ D+ w6 p
//************************************************************  }; J6 x4 z- t  z( a4 T( _5 q
void delay1ms()$ @) C5 z/ J: Q! T! v
{* R, c& {& R/ Y
         unsigned char iii, jjj;
5 l- J; k2 E. l4 [6 {, e; z
( A* Z$ B2 ]0 T. q  D4 C1 b        _nop_();4 G7 m- U6 F( x: l& o+ `
        iii = 2;( o' |& @5 c1 Z: D; {  }. J* Z
        jjj = 199;
& k( R8 m$ Y  B6 o1 S: S9 K        do# |0 d, r! x3 c" W+ Z2 h
        {
) R. H; f7 s% N* x8 R                while (--jjj);- K' {' G- g) z! |/ i9 k5 u5 u, ^
        } while (--iii);
; r1 C0 J# ~6 m( K8 H5 {) s}
7 s& B9 d1 x* N: k( Dvoid delay(void)   //误差 -0.000000000227us
: s" @( Z$ X* O$ x4 k7 t{
5 Q" f. d0 N0 l0 p    unsigned char a,b,c;* s. w7 g- \  f8 l6 T2 k
    for(c=13;c>0;c--)1 @) Q8 k/ m0 M) R# G) S' \
        for(b=247;b>0;b--)
+ |& b+ |7 F- B. |9 {            for(a=142;a>0;a--);3 Z$ }9 A0 `' ]/ F3 Y
    _nop_;  //if Keil,require use intrins.h7 A4 V* P, V3 ~* U1 p7 Q
}
! P0 i* Q" L- x
- m8 m+ H( `. I9 F& R- r" G) {2 h7 x* [
( J0 y9 A( ?5 m3 G$ T# m
/*------------------------------------------------
* J- W2 l( O- c2 s) E, j% H                定时器0初始化
( U# h. ?8 |0 |2 u1 X% Y9 s------------------------------------------------*/4 n6 [/ m5 R) B1 _% p4 e
void TIM0init(void)//定时器0初始化
: I4 g) d" H5 e7 K( }/ @3 j{
# U- n/ b; m5 d/ c3 s# S% ^( q, `% w
, N) b/ d( i! K# J& i% Y# U  H/ h  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
5 p, W4 H0 T0 B" ?, W/ @  TH0=0x00; //重载值
2 q  G% O/ _- b5 O6 ^! u: {  TL0=0x00; //初始化值  j- ~9 w+ w8 ]5 f! L: ^: ~9 i3 F
  ET0=1;    //开中断; j7 ]0 A$ N/ _1 s1 j% s
  TR0=1;
8 Z; j4 \6 i2 D9 ~6 y}        
) I) X! c( _( J6 i& A3 g/*------------------------------------------------
, W$ V% {% r; O! p5 X                  外部中断0初始化* I* R5 }: N/ A
------------------------------------------------*/
2 x+ |$ u. F1 B+ C. q8 B& S+ vvoid EX0init(void)
# Z& W& A: ]: x$ k) r( }8 f{
# V; |) X6 B5 t  y, Q2 K IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)6 i2 T- T5 b( S! L/ c9 q
EX0 = 1;   //使能外部中断
. ?7 g7 a" G7 S9 f9 Y EA = 1;    //开总中断9 p& j. n/ j$ @" }, z

5 t( p0 h) ~* L}
% @* `9 F6 [  [! U/*------------------------------------------------7 p4 l6 W+ X1 v; U
                  键值处理$ w2 A  |+ b" @% T
------------------------------------------------*/
$ l# c6 h* i3 g2 wint display(int j)9 ^( I: H5 j, }1 j
{8 K6 S, u3 Q! z% I4 q4 ^; J
        int k;$ Q% ^$ Z: f0 v7 a( i9 i
        switch(j)//判断第三个数码值1 C( L% Y1 e% c% U4 V' s
                 {
  Y* d0 q3 G8 X  K* v
' j  [$ ]- r) B* q/ A5 Y: j6 Q4 X                         case 0x16CD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0   1 X' `+ s4 e+ s
                         case 0x0cCD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 显示相应的按键值5 K6 I: G. l$ S9 k, ]
                         case 0x18CD_Write_Com(0x80+a);LCD_Write_Data('2');k=2; a++;break;//2
& O4 h: F: M- v$ S, i, C# j( a$ ]                         case 0x5e:LCD_Write_Com(0x80+a);LCD_Write_Data('3');k=3; a++;break;//36 X: B" t5 f6 r/ E# I0 A' O' m# s1 A
                         case 0x08:LCD_Write_Com(0x80+a);LCD_Write_Data('4');k=4; a++;break;//4         5 ^7 R4 [- @: ~
                         case 0x1c:LCD_Write_Com(0x80+a);LCD_Write_Data('5');k=5; a++;break;//5  # v1 h# R# }5 S
                         case 0x5a:LCD_Write_Com(0x80+a);LCD_Write_Data('6');k=6; a++;break;//6 显示相应的按键值, [. A( S. a9 I1 {- d4 A
                         case 0x42:LCD_Write_Com(0x80+a);LCD_Write_Data('7');k=7; a++;break;//7
% ^( m& r3 P4 O% c' Y. q/ N3 H0 q$ S                         case 0x52:LCD_Write_Com(0x80+a);LCD_Write_Data('8');k=8; a++;break;//8- B) j* {  C( c1 H- P
                         case 0x4a:LCD_Write_Com(0x80+a);LCD_Write_Data('9');k=9; a++;break;//9
) V, E& }, d( N" ~; L. ]% H           }
5 n0 e' m. P$ `) H& K# s  I. @! f, U0 [. F) Z
        return k;
9 q0 l3 K9 J. x9 K0 O9 s}
8 m' i% i, U$ c, [4 k! J) Q5 N9 u- O) n/ E+ r9 c8 p1 B0 {* @
void Ir_work(void)//红外键值散转程序* N+ h4 x1 y4 u. w/ g8 @8 F
{
7 C& R& `! k4 b% ^! \3 v) j' b- I# ?, J! o; @0 ?9 O4 G
         int k=0,flag1,count1,count2,count3,count4;$ k  J2 V, l- F0 z' q1 |
         int table1[6];
) o+ V1 ?! b6 N         int count;9 }7 f" z8 h7 e2 Y" @
         if(IRcord[2]!=0x09&&IRcord[2]!=0x44&&IRcord[2]!=0x15&&IRcord[2]!=0x40&&IRcord[2]!=0x43&&IRcord[2]!=0x07)1 u* b( p" ~2 r) W# E9 [6 V- G0 l' j
         {9 q% h6 f: t5 C( D+ R
         k=display(IRcord[2]);" `3 b- y' m, m5 x! h
         table1[p++]=k;+ ]/ e: j  E' p( n6 k2 {. G, ^1 u
         }( d  V/ W" p; |5 ?; p
        else  if(IRcord[2]==0x09||IRcord[2]==0x44||IRcord[2]==0x15||IRcord[2]==0x40)/ h* p0 N- p# L6 W) B4 [6 N/ e2 b
         {
( r# B7 {# P' S# j. e                 switch(IRcord[2])
" o; T' a1 e# P0 S8 ?/ r                {
9 V6 C' l$ q6 ]6 Z                          case 0x09:LCD_Write_Com(0x80+a);LCD_Write_Data('+');flag1=1;a++;break;//+  0 N: P6 X# @& B3 O9 |: O
                         case 0x15:LCD_Write_Com(0x80+a);LCD_Write_Data('-');flag1=2;a++;break;//-显示相应的按键值
3 N9 c& J% y* ^, c8 e0 ~                         case 0x44:LCD_Write_Com(0x80+a);LCD_Write_Data('*');flag1=3;a++;break;//*
" s8 z6 Q' _( \) C$ k$ @4 i                         case 0x40:LCD_Write_Com(0x80+a);LCD_Write_Data('/');flag1=4;a++;break;///
8 q9 {, t5 }7 ?- Y/ J- V! a( X                        //case  0x10:! C; H5 S* |+ v- K# O8 ]6 _
                }
& x1 [8 y; B: L( X; M/ P4 \         }! @5 B; w; x2 p5 e( U
        else if(IRcord[2]==0x07)
" b  m# b0 q1 V/ g0 |2 }) y4 w" R         {
- E4 n7 w! k. b5 E+ w1 ^- C! ^                         LCD_Write_Com(0x80+a);* V2 L, O$ J+ g
                        LCD_Write_Data('=');
; h; {  G" l! C: p# @* C$ }: `                         switch(flag1)2 a  H' o* D% j5 h
                        {- t" q7 l$ K/ x. f/ f. W  Z
                                case 1:        count=table1[0]*10+table1[1]+table1[2]*10+table1[3];
" _- p0 {$ P8 t: r6 h                                if(count<100)7 H" D- }. {) R, O
                                {
0 P1 |1 q3 _3 S- \( a( P, ?                                        count1=count/10;
. Z3 T2 g( p$ [5 S1 e# P7 a                                        count2=count%10;  . i5 Y' O0 s8 B. k7 e3 k
                                        LCD_Write_Com(0x80+a+1);1 }) T! q( r+ M) n+ B. m
                                        LCD_Write_Data(dat[count1]);
9 w6 x& G: J( [" c; o
% x$ w3 Y# t4 r                                        LCD_Write_Com(0x80+a+2);
& [4 Y9 J% a2 u$ M9 \' j) X3 k1 z                                        LCD_Write_Data(dat[count2]);
- D8 g" s% h1 r2 V! @6 B: R                                        delay();. Q& |" F: N, F1 b
                                        music(count1+1);+ Z7 Z! d) |/ L) t, n- T
                                        delay();
6 a$ B- }$ @9 J5 e! R3 V% X                                music(count2+1);6 s! ~9 e+ j0 n: t. P' v& k1 S
                                        delay();
7 o. B! {3 _" p  |                                }: j+ O* W8 c! B6 B- R9 l' I# U
                                else if(count>=100)
; j/ j% A& N3 X) M$ [% m$ j+ m- p                                {
0 }( Y/ H" F# j) z1 d8 x3 y                                        count1=count/100;         LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]); 5 I$ I, }6 H0 v+ @7 E& `8 t
                                        count2=count/10%10;         LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count2]);
) w$ G6 N! s: h5 o5 G5 s9 J8 ?* p: S                                        count3=count%10;         LCD_Write_Com(0x80+a+3);LCD_Write_Data(dat[count3]);$ f  M6 f  K3 z' q
                                        delay();! `# p* C1 F1 l, `
                                        music(count1+1);
4 H, c6 D2 _9 u$ @  Y7 Q                                        delay();1 K% o/ f0 j  k/ u( T
                                        music(count2+1);
4 B( a/ _5 _% D                                        delay();
0 E0 I5 q- y5 y: y5 E: I9 B/ `                                        music(count3+1);
+ s+ Q7 L$ q) x                                        delay();1 o" e4 ~2 c; R! e0 ^1 C
                                }- l( R' W0 |* @
                                                                break;* T* B/ y- b( b" q: S# s% C
                                case 2:          count=table1[0]*10+table1[1]-(table1[2]*10+table1[3]);
1 \2 ^8 g, F. k, `. I; U                                                count1=count/10;           LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);( L! C% l0 n1 G; `% b/ O# e# Q
                                                count2=count%10;        LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);) j% X& A; [7 N: P2 x
                                                music(count1+1);  S4 K- g6 L* I+ L
                                           delay();* P1 c) y  a# m0 P7 |
                                           music(count2+1);
% i7 C# S, D. ~! o                                           delay();
# w* q9 c0 L, G7 t                                                break;. {! U3 N5 i% J: x

  n: c9 J7 B; j3 d
# r& t- N# g& S* l/ H6 T) f+ c0 N                                case 3:count=(table1[0]*10+table1[1])*(table1[2]*10+table1[3]);8 w. y% A+ h- D! ]2 K# Z, z& k5 x) y
                                        if(count<10) { LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count]);}' [' q5 |: s4 H  O% {  V: s
                                        else if(count<100) * Z1 d6 n4 Q( |) C* G
                                        {, R% ?! c2 t/ P9 E# N- R1 n
                                                count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
* p" t& j; {, z2 h7 f; g$ B                                                count2=count%10;   LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
: B- T" ?9 }8 M                                            delay();, h) g4 D# J0 P3 t
                                                music(count1+1);6 R2 n: h" g9 z; I, B) \
                                            delay();
* `6 x( p+ D8 `/ N9 d7 w2 H                                                music(count2+1);
; {8 x. X- B* U7 e: W2 g                                            delay();
) G4 L( t* u, k. t                                        }/ `+ {) a) c. K6 g2 F

! E+ O+ g0 l- r- w( D4 O) S                                        else if(count<1000)2 B6 z. K$ f$ [( G7 p; A
                                        {! `. x3 q( L4 ]5 B
                                                count1=count/100;        LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);/ M! A* Q1 Y8 C6 p
                                                count2=count/10%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
7 O- x$ I8 V4 W+ k                                                count3=count%10;          LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);
8 g1 `) n- _7 f                                                delay();
5 t" m9 L, h( I: Q                                                music(count1+1);1 l9 C( c% T( J$ H) q4 `+ N; w
                                            delay();" l3 |% a" o+ v% G6 e8 K
                                                music(count2+1);$ T- Z- `. m8 [9 i, }& @
                                            delay();. ]( N7 V" t* a) j/ o! }
                                                music(count3+1);1 a$ V/ ^/ n. O* k
                                            delay();' F0 u. P% H6 i& E
                                        }
3 W0 q. s7 f2 I5 i* y                                        else   if(count<10000)
3 u* h) P7 k2 V! y, m6 n                                         {( ?) G" @% I9 u# X0 h
                                                  count1=count/1000;                   LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
  S% M0 Y" t5 Q! z9 Y& @8 l                                                count2=count/100%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);' D6 m: S9 _7 [. w$ K
                                                count3=count/10%10;                   LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);9 C% @7 {. X3 ~2 L' Y
                                                count4=count%10;                 LCD_Write_Com(0x80+a+4);        LCD_Write_Data(dat[count4]);  \( V4 G2 W+ l: g4 s9 G
                                            delay();2 W0 N$ w6 c9 k: v* T- Q1 d
                                                music(count1+1);+ o; J# ?) d. S$ M2 ~( g
                                            delay();
" M$ a( T$ O- I, Y4 b' E8 _7 R                                                music(count2+1);
; a/ y3 F7 e. x- _                                            delay();
" ^9 v* ^3 k# @                                                music(count3+1);
  J- t8 ]0 Y3 r* _; }% b( K                                            delay();7 y( w+ V  t5 J$ y% S8 Z
                                            music(count4+1);( }- Q& u2 ]* m$ @
                                            delay();
4 i" |5 a( D7 ~% H+ p                                         }" @& q# B* P7 L, `% @. o; G
                                                        break;
: j; e; {  k7 h9 e0 B+ Z                                case 4:                count=(table1[0]*10+table1[1])/(table1[2]*10+table1[3]);8 b' B+ V, F( l

7 w/ M8 r( C/ J; w7 M/ o6 U8 w- e- N# n
/ j3 z" L; |/ G0 \. e
                                 if(count<10)
" g2 S% \: v3 ^' F6 b, A+ e+ m                                                {                                                              
: E; T3 ^1 p4 O9 _8 l                                                  LCD_Write_Com(0x80+a+1);LCD_Write_Data('0');        //LCD_Write_Data(dat[count]);, g  `* e/ q1 K! ~
                                                  LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count]);* x- x) [2 d5 o' `2 ]* n; j4 p4 v
                                                  delay();
# B) f/ ?/ w* C4 [9 V: _                                                  music(1);: h) C, Y# y+ q9 V( a" O
                                              delay();& W/ l+ m6 t' B! }3 S2 I4 G
                                                  music(count+1);
5 `! N" o9 u/ h# ]3 H& A                                              delay();, P' R4 e2 l7 }: _
                                                }
% w) v! a" L7 {0 J                                                else  4 Q- J# A' H" M( B$ k1 V7 h/ }$ g; O
                                                {6 s6 C& t  X8 s
                                                        count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
0 P8 P$ e6 F1 L; i8 O                                                        count2=count%10;  LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
8 r- X2 F. ]6 N0 N7 D                                                        delay();
  i4 h9 u/ l; g# Q9 _                                                    music(count1+1);
# s7 h" H* y( j! P5 u                                                delay();$ M$ P: m3 W* l! Z8 q
                                                    music(count2+1);
7 [  A7 P. e7 _4 o* a1 q3 ~                                                delay();
. c7 `& l7 [% v* u' }                                                }           1 ^+ h' _. f: ?8 Z% u" i4 F
                                                break;* B( Y- J  h/ c$ ^& P
                        }- m( u3 n! _- |1 S; ^. b4 d+ P
                        flag1=0;. v* [& G' Q; C9 O' s
         }
) C( k7 O+ K9 a' p3 L: S         else , B. }/ J6 Z4 Q$ h+ e
         {
, i) G# L) z, x5 K% G2 d         if(IRcord[2]==0x43) ( k% g: P7 `7 p! Y( V
         {
3 d7 q& H+ M$ Y+ `/ p. J/ [                LCD_Write_Com(0x01);
9 P$ w# K0 g/ ]3 J) ^         qingchu=1;$ R: t; s  p' X
5 L, X" @; L7 G$ J& G
         }! q! J+ I& j8 y# W# p
}        
8 L& W# e1 f0 Z& L9 G8 i7 X  m. q
+ _. @" x( y6 i8 p; ]# v4 S
7 _5 K! u+ q# R% ^}: ?$ E' V5 j6 W6 d6 I  j
/*------------------------------------------------
0 P( b2 N" e4 Y# ?5 v                红外码值处理/ `$ P8 l# a8 u5 p; C1 f
------------------------------------------------*/+ S" J1 ?: {1 ~7 i5 o
void Ircordpro(void)//红外码值处理函数3 |0 j1 k' F. Z
{
& i; j+ k3 w: S- I$ B2 u5 B% u5 R# W  unsigned char i, j, k;7 P3 X2 e# ~- i8 n) N" }
  unsigned char cord,value;
% D8 j  V* |0 j! e# @% i$ k& J( |% t0 s# `" j8 t
  k=1;; B/ ~8 K( P2 |7 n- a
  for(i=0;i<4;i++)      //处理4个字节
! C  T! @! l$ N6 _     {
7 @9 G* i, N4 g      for(j=1;j<=8;j++) //处理1个字节8位
! @$ Q& z8 e2 m4 U! o1 n         {
5 U" [. I) R2 K3 q" W$ a4 Y          cord=irdata[k];
- r: x8 o4 u5 M6 C( O0 N9 A1 \/ v5 Y          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
' {3 J) T+ y, L( p5 W! O% f8 |             value|=0x80;- Z0 G3 G6 E9 e3 H
          if(j<8)
) n4 h7 J* @7 Y. N                    {+ a1 Q% N* n+ c- i" n; o% H2 j
                         value>>=1;
1 q  s/ K* }$ U                        }9 R! o- {; r7 k6 Q0 c
           k++;3 j$ j. i! w! F& g
         }
' E% m& ~" ~+ W4 r     IRcord=value;
, W; W' B  J5 @) N# u0 R' F     value=0;% y1 y& I' _5 p5 F4 U, ?  ^
     }/ F8 r+ |' m0 M2 h1 f
         irpro_ok=1;//处理完毕标志位置1
6 G- r5 n8 X2 s$ l; P4 o; b+ y( U}, w& }" {, a) q4 C

3 f% F& \) T8 u9 C  _# r/*------------------------------------------------0 J/ e3 u+ R' C5 s( t
                    主函数
5 b4 Q1 T+ A' m9 \! J------------------------------------------------*/
# ^0 E) N$ _6 F6 Y& Uvoid main(void)% C0 O& V8 K" q8 t( d0 z" z5 K+ b) i
{5 N. U) p: T2 p, I7 g
int m;
: Z$ l1 q0 V* N2 D EX0init(); //初始化外部中断
4 Y) h: Y! m1 \  K4 i3 t TIM0init();//初始化定时器* f! N# I  V) `  X) s
LCD_Init();
) F1 ]7 D  u0 P( B% l  r/ {8 K8 qLCD_Clear();//清??
" n1 D6 C/ s2 m& w' ?
7 I) g7 r; e  L7 U  I9 }7 r while(1)//主循环: e5 P8 m- F+ b  V. ]$ T- N
   {( H$ n/ z9 f$ v# g3 T1 u6 W
    while(irok==0);                        //如果接收好了进行红外处理
% y# `- `- y( M( b+ L                 irok=0 ;
& f! ^; |0 m5 {; h           Ircordpro();/ I6 w+ Y; g# F' Z( d1 c+ w& M
          while(irpro_ok==0);                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
4 `; N1 z. z- E# F; d: _                   irpro_ok=0;
1 d' E( P2 X5 S7 {! t" G( @           Ir_work();
! H6 d" I+ a' S0 Y/ C           if(qingchu==1)8 h/ |6 `" l! N7 R! X$ U4 B3 X
           {
& t) v) N" R+ F3 N                           qingchu=0;; o4 D$ K" |7 ]. e" g/ W
                        a=0;
. \# }% }+ e8 O/ Y/ k7 y                 LCD_Write_Com(0x01);; C/ @7 U% I0 t# n
                 LCD_Write_Com(0x80);
* w6 `+ d# U) `+ H                        p=0;
, X  T5 p/ i' Z3 `* y                 for(m=0;m<6;m++)
0 F% i- R4 M3 |+ T                         table1[m]=0;
  ~, p+ z; A/ w  V% x6 y           }
/ n; h) }5 s  s8 Q        }
5 M7 m" e* t. ]5 m        }
& S; A: c" a0 F' _, N, O' h
3 y9 H# W7 o# f8 y8 ^: a
7 x" z, _" g  G
游客,如果您要查看本帖隐藏内容请回复

, v7 K# }: k% d! X! u# c& x+ p. x% [7 j" ~  [) g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 07:13 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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