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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机的红外计算器程序源码
& d$ Y/ x8 g( E8 L. Blcd1602和单片机接口自己在程序中看
3 u; {* W$ T+ h单片机源程序如下:
$ L- Q0 ~; ~4 q2 Y
; L& |  W4 ^% ^' q, ]' o# M6 i
& V# F( l5 D) R! f: ^  ]; X
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义8 l, |3 u- d9 T# u. J, i9 {
#include<intrins.h>$ T5 w/ d2 F5 l# t% l4 G
sbit RS = P1^7;   //定义端口6 E6 p' d1 ~  v% Y) `7 D
sbit RW = P1^6;: s" c/ E# [6 ^5 G# n0 l' k. K" D1 B
sbit EN = P1^5;: I' d$ U8 ?8 \) F
sbit datk=P1^2;. @/ n% f/ n% o, e. g: y; [
sbit rest=P1^3;! S, n6 _3 J  f( D% J
sbit IR=P3^2;//中断0,红外接口                                                                                                                                                                                                                                                                                     //红外接口标志( Q* t# I. {) |: t% T% A
#define RS_CLR RS=0          //选择指令寄存器
2 X$ f' X3 ]; D#define RS_SET RS=1          //选择数据寄存器% S: {3 A7 U- b
#define RW_CLR RW=0          //把单片机数据写入lcd1 Y/ \1 B5 M2 V) n6 k
#define RW_SET RW=1          // 把lcm的数据读出到单片机" {3 g) F. o2 X7 \. Z# d8 e
#define EN_CLR EN=0          // 允许对lcm进行读写操作
7 o* P0 \- l  q& m, F) v8 ~2 t#define EN_SET EN=1          // 禁止对lcm进行读写操作
3 }- L8 o' A+ R9 h  j#define DataPort P2 //定义数据端口 程序中遇到DataPort 则用P2 替换
: U* `3 }5 r! Q+ G' U6 A6 M/*------------------------------------------------
) w0 q* U$ E  @! _% R                全局变量声明
+ D. U7 @6 v8 |2 M. |) A: |0 J------------------------------------------------*/
' I: `7 V! R* c; F6 I unsigned int p=0,flag1,qingchu;
. [1 B& f3 Q  s1 j static int a; //静态变量a
; F! [8 z4 G- iunsigned char table1[4];+ A' H+ R/ V6 p2 f0 O
unsigned char  irtime;//红外用全局变量
1 A5 z9 V0 r9 c6 \$ [" X2 V5 n5 Y" O) K) d. ^4 O
bit irpro_ok,irok;
7 I1 s8 t( G$ o+ K# Q5 ^8 sunsigned char IRcord[4];     //四组数据,
. H2 o$ M; C* l% z! _0 @8 J' W7 u+ {unsigned char irdata[33];        //前导码加32位数据
0 f7 g8 A% e1 Punsigned char dat[] ={'0','1','2','3','4','5','6','7','8','9'};, h4 d' v2 g4 N* b4 i2 {7 ^$ Z* v8 h
/*------------------------------------------------3 p  {7 [" o" Q, _8 {$ U, v
                  函数声明
2 X' i/ |0 z8 w- b$ d  H  d------------------------------------------------*/
8 X3 U) @+ Q  m' L
" Y: g( s/ G, N. v+ Ivoid Ir_work(void);          //红外键值散转函数
* \5 z7 t' ?3 x  A5 p' nvoid Ircordpro(void);  //红外码值处理
7 W9 ~% f2 U2 }2 v, L0 B+ b, |8 tvoid Delay10ms();                //延时函数
: P) [8 R* R0 p) C: C" Rvoid delay1ms(void);           //延时函数
2 a2 D+ u* [( f: W4 gvoid music(z);                        //语音函数
7 [% a: s' G. E$ R0 D/*------------------------------------------------" q' T# z) ^' d+ L; J
uS延时函数,含有输入参数 unsigned char t,无返回值
* D& y3 d2 C5 b7 K unsigned char 是定义无符号字符变量,其值的范围是
: a1 L! r' t5 l 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时  @5 P! d: F- ~( g9 h- G4 n
长度如下 T=tx2+5 uS
  w2 c+ c& M* J5 Z' ^8 J------------------------------------------------*/
7 F3 M+ ?! H+ Z  Gvoid DelayUs2x(unsigned char t)0 p: ^" M0 X# Z+ N: j! a
{
* L6 t0 Q$ g5 B" r' x while(--t);. P5 n8 E; M; \7 r$ ?
}/ k, E1 }) w! N0 S
/*------------------------------------------------) Y) ]8 ?6 N" C4 K
mS延时函数,含有输入参数 unsigned char t,无返回值
* P; R! `+ |# X unsigned char 是定义无符号字符变量,其值的范围是& ^. q2 L$ M9 @- F) k
0~255 这里使用晶振12M,精确延时请使用汇编' G7 p9 c& T; I: Y# F0 M- t4 X! v
------------------------------------------------*/
1 W3 o8 \0 }: r! y: Qvoid DelayMs(unsigned char t). Z$ s" {0 ~0 p9 c' ?
{+ R4 z9 U0 Z: t
0 o  i0 c! H7 _7 l8 h: E! b
while(t--)
3 M" V* k& d, g1 P2 G6 o& S {  h/ O6 F# U0 F/ q) z& E2 K% P
     //大致延时1mS
# s( z" L$ _9 j' S     DelayUs2x(245);
8 W# i9 g+ k1 s5 [8 u/ g         DelayUs2x(245);
& o9 O/ o. J- O& Z' n8 j. ^# z }
2 H! L8 R  F  G! t' p}
: O6 L  M- c8 v9 H5 F+ y/ z/*------------------------------------------------& h1 ~& u5 T1 m( g! [  Y+ Y5 m, p
              判忙函数
( e+ Y1 U' x6 u------------------------------------------------*/
# }! C$ u. f$ x/ { bit LCD_Check_Busy(void)
  u, A; Z. w# d- {9 K {
5 d8 h/ G) T9 m  y$ E7 y" A: b: n' _ DataPort= 0xFF;
& O; T4 S, c6 U& j7 X0 ^ RS_CLR;     //选择指令寄存器. ^8 P5 r" \+ T$ o! s% N' i
RW_SET;         //把lcm的数据读出到单片机
. Q4 \& e2 l0 a7 {7 K# w4 f EN_CLR;         //禁止对lcm进行读写操作 4 \7 C/ j* p9 ]) {) y) s( {" J
_nop_();
$ _! s2 Z9 C! q; i0 X9 w EN_SET;
! b! B8 Q" L* k6 w: _, K1 ~ return (bit)(DataPort & 0x80);
* g7 Z7 j- A! y1 X }
3 ?, A) H: |5 L! N0 k/*------------------------------------------------
% @2 @8 r, g$ o& [              写入命令函数
( S) @& n0 ]5 u------------------------------------------------*/
) A7 J8 E& {% r1 ^6 M- H# z void LCD_Write_Com(unsigned char com)
; `* q5 ]8 P5 K' u {+ j1 ]- L" V" ^) y" X3 `, i
while(LCD_Check_Busy()); //忙则等待; J% d+ K; Y+ w6 U
RS_CLR;
" Z! |' j) J7 }( n+ m. z) M! [- g RW_CLR;( O2 R- ?8 X" T, q( h" M3 ^; `
EN_SET;, M! g3 Z0 H' h2 O( r& P
DataPort= com;
8 x5 }* B5 `0 J: Z1 R& i _nop_();. i; r1 |& }8 A: b: _: @) D0 f: a
EN_CLR;
, Q( {+ d7 _1 N5 ~ }
! P. c3 r/ v' g& ~7 p/*------------------------------------------------
% \7 ^7 o4 R; D              写入数据函数7 o# k1 K# T- E5 B! N$ o" {) t3 O' ^
------------------------------------------------*/) l  ?& ^( u9 e# Z# z/ c
void LCD_Write_Data(unsigned char Data)
) v" U! k) E; L  O% d$ T6 E {( Z; D; K! M& m/ w' `
while(LCD_Check_Busy()); //忙则等待
. ?8 {" o6 U9 A. r; O  Q4 s+ } RS_SET;
/ |/ a3 b7 U" f9 ~$ n7 n7 V. L RW_CLR;- X- ]3 s4 ^! ^4 e7 A) M& O
EN_SET;
% l5 m! P1 E! R DataPort= Data;" D7 d! k0 C! n  b+ b
_nop_();
/ \2 V+ d/ h" g6 I' \" x EN_CLR;
$ \, w; e9 w9 s1 Q }" a) ]( p4 v3 I: c0 d( o

  b1 h* S0 i- V+ z( R) Z8 S/*------------------------------------------------9 G  o( ~4 E) _5 }
                清屏函数' ^3 `0 W9 ~, k
------------------------------------------------*/
  s) C; ]6 F& {# E# K) a void LCD_Clear(void)) k, f: w9 g. W6 E5 _/ S
{
- C. Y$ o2 E( g. i" h+ ? LCD_Write_Com(0x01);
& t( g9 {. V1 {' |3 ? DelayMs(5);1 Y2 f0 F2 u4 C
}
  B: H, h: |% i! U
6 m" u; l- v8 w& D( _) I: u' }/*------------------------------------------------5 a+ _+ D4 c5 }0 x7 q
              初始化函数
' X) F. e* I) T) h' u9 {$ p------------------------------------------------*/  Q3 m  U9 L: p/ N; v" B$ m+ i
void LCD_Init(void)
+ K& a% R1 ~8 X2 D) B {" \/ x& Y/ G( _9 R9 \
   LCD_Write_Com(0x38);    /*显示模式设置*/
& z( d3 K+ f1 D& I( z   DelayMs(5);
  M% e. `2 e% H. Y8 X& |9 c   LCD_Write_Com(0x38);1 W# e3 }5 t- s) A" X: Y6 R3 v
   DelayMs(5);
2 i& C" J" Y. W1 _$ e: Q   LCD_Write_Com(0x38);
. B( [1 ~" q) n0 t/ L5 M   DelayMs(5);  d6 f/ R# H8 y) \. E2 e  n5 @
   LCD_Write_Com(0x38);
, n- s: D7 [3 h7 r  i, c   LCD_Write_Com(0x08);    /*显示关闭*/: k" \) y/ W( V: \
   LCD_Write_Com(0x01);    /*显示清屏*/
# ]' W2 \+ F' H4 T3 n   LCD_Write_Com(0x06);    /*显示光标移动设置*/" z7 T! z2 X( m. V5 E3 K
   DelayMs(5);* Z% f; D# P+ V8 g
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
0 B  r4 z: o0 J6 |' y9 G* F, U   }6 r: Q6 T; t7 M% `3 j4 C

) ^: e6 g) l6 A4 K: r/*------------------------------------------------2 E: v' X2 J% D3 b/ d- x+ m, E
                  定时器0中断处理* y) b+ D4 @8 R- s# O* g- \; D
------------------------------------------------*/
/ U( \: _; t8 V' w
; X) N& V: A& O2 Zvoid tim0_isr (void) interrupt 1 using 14 ?- M3 G2 L- _: c
{
6 R, \: u. P& S2 f# }  irtime++;  //用于计数2个下降沿之间的时间7 O& f+ L4 t: f' N  {! \
}0 ^  D+ l# w( n2 X1 i  m5 x

+ O& W5 v5 e0 r& S2 f* P- }+ J/*------------------------------------------------
- z1 b& w( t% h                  外部中断0中断处理
' w/ Q$ V8 `: H- D------------------------------------------------*/
) x: ]- s6 S0 ?$ d4 [8 j" }" L  Kvoid EX0_ISR (void) interrupt 0 //外部中断0服务函数& j7 `2 K4 U) B
{
4 c" Q: d# J5 X- K: n  static unsigned char  i;             //接收红外信号处理
- F/ `0 c% c! F0 O4 ~1 R  static bit startflag;                //是否开始处理标志位7 R6 B& t9 m% h/ I; i& Q9 b
+ O  j' e/ t5 c; L0 Y. b( W
if(startflag)
$ q' E, ?% M9 E' u+ M1 \) X   {
1 ^( B$ I0 _- G6 X    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
4 V7 q( ~) p* B8 K/ W( Y) m                        i=0;
! w  z5 p* ]( Q* V: M. |                    irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是10 p8 C7 K: V5 k" U+ h. L
                    irtime=0;
3 p( K& R* |. M$ a$ w9 F/ I# Z                 i++;
. N# k+ z$ Z  j9 Q                            if(i==33)3 L" L7 s; F6 v
                              {
- m7 R4 w. E( U& I  ?+ }) M" k) w                                   irok=1;
4 k0 [/ v+ I+ N4 l8 D. T/ l( y- i  B                                 i=0;6 h; W8 n1 H0 t' \2 P6 j) N" S; F
                                  }: O- [+ ^8 P! l6 ~6 B3 d
          }
1 Z+ [# G$ k6 e  ?' g* y; r           else
# F( E# y9 D0 H, N                {
& E2 y, l9 ~1 h5 |- G; Q                irtime=0;2 D& L: {) x" E% w; a, z
                startflag=1;
2 a$ n3 S* ]8 Y# k                }
) E* t. W/ x' i/ ~+ w& Y% ^8 D6 `4 X
}
  F1 t! m/ M9 b, g1 Q
2 ^' u/ f( S- H2 q7 ?! g( J& M  N, r  I5 C

- X; p) ~6 \' k' ^void music(int z)
5 i1 q* s" C) K- _) a6 L% a1 ]2 B! M{
& c4 p3 B& l, X: E2 Z9 O( o1 x3 Srest=1;- U6 t% N& c$ O: J5 l' k
delay1ms();0 v/ ]1 [7 g4 r. u7 V
delay1ms();5 m" I& J5 k# @" D- H
rest=0;
+ B  H; r* A8 U& h! L2 M  \delay1ms();  ~4 i9 Q5 L  g2 z9 ^
delay1ms();/ p, A8 K$ t  }" B
            //前面给语音复位,详情看语音资料
5 Z5 b# D; L' Qwhile(z>0) //给b 个脉冲让语音播放b段语音6 h3 U! ~# U; O. l
{
/ s! q1 K4 ]: T/ G# }  n2 [datk=1;$ ?, J- G6 ?) E( a; H. ]7 j8 u0 |
delay1ms();
$ V1 D7 n4 E# ]datk=0;' U# S% _1 ?5 b; i' J) r) `
delay1ms();
" j3 o, X  ?3 N3 q, nz--;
& [0 x9 |# [$ Q" a5 F}         }3 F, V+ u. E* m8 W; B
//************************************************************
( z8 S9 Z4 B' A& A/ Y9 d; nvoid delay1ms()
( L- ^8 e- t4 m0 w( r9 V& ~{+ g) y- \- B) N5 K
         unsigned char iii, jjj;* n% j# B& p/ P6 v
6 \, _' N; G4 R+ |
        _nop_();
4 J6 d) l: t$ R        iii = 2;3 j2 \' e- B5 g8 n! i3 v" m1 {* I7 L$ l
        jjj = 199;# @% B2 Z5 m2 H, s  @
        do
1 I& a1 M  U; g- w/ v/ }2 D        {* T  {# b- w, G6 E  h5 @$ j
                while (--jjj);
& D, N$ A5 B2 z" y        } while (--iii);( p' H6 X, f2 F* {
}6 F# W$ P4 o! H  @5 M
void delay(void)   //误差 -0.000000000227us
7 D/ T5 g' a" R( O% ]/ J{5 Q) Q7 E3 H& t4 s! R+ K
    unsigned char a,b,c;
0 x" j5 j& P+ q$ {$ i4 J" V    for(c=13;c>0;c--)0 L. e! b9 w0 p, m: d* G
        for(b=247;b>0;b--)& r" Y4 k+ i8 t  N0 q$ u1 e9 Z6 P/ i
            for(a=142;a>0;a--);
) ?9 ~6 R) j9 A0 G) M' l9 w5 Y8 ?    _nop_;  //if Keil,require use intrins.h- A1 K5 s+ C+ W$ c) S
}3 b  n) ?: ~0 {, {; j: p$ B* @) S0 c

* p+ I0 R. Q1 b0 F# ^
% X: j1 T% j, N) z, }* r' P4 O6 y; C+ A- V( G
/*------------------------------------------------- v& ]4 c  [  |
                定时器0初始化
7 k+ E: |7 J  H/ e------------------------------------------------*/0 U! n0 Z9 N5 b& L
void TIM0init(void)//定时器0初始化
) A0 B) g& ~* I  c* E{4 Q9 y( W* Q, z- u% [

) I- V. }5 K! I/ Z  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值4 L# h) q) @7 T. t  ]3 f! y- |0 ]. |
  TH0=0x00; //重载值* v. K+ q, m: }; ^. c
  TL0=0x00; //初始化值( f/ {- g& |2 n6 ^# i2 f' e" W0 U: S
  ET0=1;    //开中断3 G" ^0 X, ^- i/ S: P8 _; m
  TR0=1;
: y( V8 C" [( D. c. M9 T  R}        
% H6 g* w' L6 c3 S1 l/ H/*------------------------------------------------
! q# c0 w* C. F/ v& I                  外部中断0初始化
* d9 K3 R% n# m  R' e/ S------------------------------------------------*/) L2 z- w, K/ i% ]9 ^& D' j
void EX0init(void)1 B% N6 _8 ?0 g, A* o/ f
{
/ B- _( v# d8 v, Y IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
2 Z* s5 v: F/ x, X' e3 I# ^ EX0 = 1;   //使能外部中断3 l" P, y8 D5 ~1 t5 r; Q
EA = 1;    //开总中断
. e1 h' u' x0 {/ X) E; N1 {) w6 d8 c( E+ B2 @" i
}
7 M' n, j& T# O6 B+ K4 I% I/*------------------------------------------------2 C! m6 ?. @0 }7 s9 q- t$ l# P: |5 ~
                  键值处理# m" h8 z: w6 k! T* ^
------------------------------------------------*/9 ^2 x9 V* u; R- w7 [, C8 K
int display(int j)
! V/ K6 [- \5 M+ o/ U9 c{" }! C7 [8 h' j7 u' N5 R/ J* J
        int k;
6 _+ |' R, y4 S' v        switch(j)//判断第三个数码值
: m7 Q+ ~/ e9 K. Z; y                 {
% p7 f8 O7 A2 a" ]' k' E  P0 r0 j9 G
. d& a8 V1 R  i5 H9 y$ Z                         case 0x16CD_Write_Com(0x80+a);LCD_Write_Data('0');k=0; a++; break;//0   
# V) W# b' \7 z. }7 j$ M* @/ B                         case 0x0cCD_Write_Com(0x80+a);LCD_Write_Data('1');k=1; a++; break;//1 显示相应的按键值
( E9 e* \9 _! v% \/ \7 W                         case 0x18CD_Write_Com(0x80+a);LCD_Write_Data('2');k=2; a++;break;//2% P- o0 Y1 [7 S& L# q+ l
                         case 0x5e:LCD_Write_Com(0x80+a);LCD_Write_Data('3');k=3; a++;break;//3
: w) |1 x0 E: V; ~2 e  ~                         case 0x08:LCD_Write_Com(0x80+a);LCD_Write_Data('4');k=4; a++;break;//4         * e5 U6 V" q, p+ u
                         case 0x1c:LCD_Write_Com(0x80+a);LCD_Write_Data('5');k=5; a++;break;//5  
% ~, P( n5 D- |" h& e                         case 0x5a:LCD_Write_Com(0x80+a);LCD_Write_Data('6');k=6; a++;break;//6 显示相应的按键值1 `' y/ W% R' N+ ]" l( @# s
                         case 0x42:LCD_Write_Com(0x80+a);LCD_Write_Data('7');k=7; a++;break;//7
5 U: |+ @! l. m- [# w  o1 b4 v                         case 0x52:LCD_Write_Com(0x80+a);LCD_Write_Data('8');k=8; a++;break;//8  D) |. `. P1 Z# i
                         case 0x4a:LCD_Write_Com(0x80+a);LCD_Write_Data('9');k=9; a++;break;//9! T+ t7 p. A0 p! I0 c9 S
           }
; n5 K" k9 y$ O) I' V. {4 B3 i/ b, S2 u' C8 a
        return k;
* r% d: i) v2 ?}- o/ D5 l& `! Q7 ^% L

: S8 i+ k) ?: Q! e+ b0 _& A2 gvoid Ir_work(void)//红外键值散转程序
/ P: Z6 q. o8 G1 {  e{! S  K( t2 G! E8 t# I% ]

) E6 E' I2 i* E% v/ r         int k=0,flag1,count1,count2,count3,count4;; o& }: a* i2 F7 Y
         int table1[6];/ E; s8 @6 D: ~4 _+ }& ?& U
         int count;/ Q+ l* c! A$ \) N& W
         if(IRcord[2]!=0x09&&IRcord[2]!=0x44&&IRcord[2]!=0x15&&IRcord[2]!=0x40&&IRcord[2]!=0x43&&IRcord[2]!=0x07): f' M  O0 M: T+ e
         {0 c3 x8 y; z1 }: j
         k=display(IRcord[2]);8 f) l8 B* B8 j/ C" ?5 Q( ^
         table1[p++]=k;( L! Z' D( L4 r. J0 ?" p
         }
$ d& I1 r- [( s8 a" P% ^2 H0 x        else  if(IRcord[2]==0x09||IRcord[2]==0x44||IRcord[2]==0x15||IRcord[2]==0x40)5 E& d$ l7 p  k  C& x+ U3 i  c
         {
- k- j5 b: A- w8 L, Y8 F                 switch(IRcord[2])
1 s0 T- t% l8 U5 r+ g  z2 ]" B                {
6 r: O6 Z' {! t1 `* v( h9 F                          case 0x09:LCD_Write_Com(0x80+a);LCD_Write_Data('+');flag1=1;a++;break;//+  
/ z& Z9 G, }: D+ P# h                         case 0x15:LCD_Write_Com(0x80+a);LCD_Write_Data('-');flag1=2;a++;break;//-显示相应的按键值8 f3 i: ?2 D- V# e& m$ R2 h
                         case 0x44:LCD_Write_Com(0x80+a);LCD_Write_Data('*');flag1=3;a++;break;//*
) z! X" r* T+ X                         case 0x40:LCD_Write_Com(0x80+a);LCD_Write_Data('/');flag1=4;a++;break;///
) g% @  y6 x1 u/ H- U' J; N( Z                        //case  0x10:
. b3 @( D0 @: l# ~* o                }7 V! V* D5 [3 L+ i
         }" y6 D! V! K7 w4 B6 i; N
        else if(IRcord[2]==0x07)* N1 a4 R9 t5 f$ o
         {) R: l4 x" x, P/ c, T3 e2 ]
                         LCD_Write_Com(0x80+a);
% v4 Q1 I; T3 \9 q                        LCD_Write_Data('=');
' c7 ]  |1 `2 ~  u                         switch(flag1); D$ A( {' Z: X0 b3 G' ~5 Z
                        {
; P9 i# m! N- O9 F8 S. @+ J                                case 1:        count=table1[0]*10+table1[1]+table1[2]*10+table1[3];1 [" N7 E3 J" J* O9 g
                                if(count<100)
0 G0 u1 D) c2 G9 b$ J+ ]                                {$ k$ ]3 v2 ~- ?- Z
                                        count1=count/10;
) G* H: K8 b( [                                        count2=count%10;  
1 F; [5 M+ |; M: n/ L. T                                        LCD_Write_Com(0x80+a+1);! F* E6 S/ m3 Y3 ?/ M1 g
                                        LCD_Write_Data(dat[count1]);
- B% i2 j7 x% A5 [, ?1 g3 Q# E' i2 ~) R8 P+ x
                                        LCD_Write_Com(0x80+a+2);1 G7 Q/ j& N3 a/ n$ e, z
                                        LCD_Write_Data(dat[count2]);/ e+ H  I  P- ?+ I
                                        delay();
( H0 Y$ x1 E# O' G, d  K& J6 [                                        music(count1+1);
% ^# l( P# ]9 h                                        delay();0 G3 @# P$ o2 `4 J' \
                                music(count2+1);* L; b+ _. v# I5 U% F* X, v1 b
                                        delay();: \6 D# \0 s/ P$ u& H
                                }- i/ X4 D3 |- H: n: [
                                else if(count>=100)9 y! T' n" P/ [9 g
                                {
* b+ r- \+ k; q0 M( e& n! E                                        count1=count/100;         LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);
& I! ], A9 O; l4 J& \                                        count2=count/10%10;         LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count2]);8 _  ]. l2 D8 F. x# D
                                        count3=count%10;         LCD_Write_Com(0x80+a+3);LCD_Write_Data(dat[count3]);
  }9 @: T0 P  W- ]. L                                        delay();
( q& Z$ [1 m. M# o4 _) E# C  v                                        music(count1+1);
: Z' w- H( a: f: u                                        delay();
6 O& z$ t; i/ h/ q/ n, p4 g& B: d                                        music(count2+1);* f! Q9 v% W* _6 A) @
                                        delay();
4 w) a( S8 N7 G: i) Y                                        music(count3+1);0 w) x+ m* f- o
                                        delay();
+ `6 e; V1 J! C2 v: c5 Y                                }8 K: M" U& L' s) t
                                                                break;+ W0 e: k4 S. g' V
                                case 2:          count=table1[0]*10+table1[1]-(table1[2]*10+table1[3]);
5 b* J9 h/ J% l0 v! G                                                count1=count/10;           LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count1]);0 p# h8 X1 l8 k$ c" U- v
                                                count2=count%10;        LCD_Write_Com(0x80+a+2); LCD_Write_Data(dat[count2]);
, l5 v% I, I  _2 y& r                                                music(count1+1);
  M! z) X. w7 `1 H6 @                                           delay();4 |( [1 _1 G% x: h; D
                                           music(count2+1);: {: A) ]8 G9 x
                                           delay();; W0 {& U( s$ e1 M4 x
                                                break;
- Q: ?# G. u. T) f3 `2 M0 Y, _2 @
5 Z7 G* W8 {2 f; l6 |3 i* ?4 G' o" }" q1 ?
                                case 3:count=(table1[0]*10+table1[1])*(table1[2]*10+table1[3]);
1 }- Y8 R0 z; s( @                                        if(count<10) { LCD_Write_Com(0x80+a+1);LCD_Write_Data(dat[count]);}
) G! A2 n' M" C% J+ b8 `# f                                        else if(count<100)
9 X/ `) R1 X2 ]1 V                                        {
2 h. l% J! |0 B% c% [) M                                                count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);5 a- e) q) O2 v9 d6 L# t
                                                count2=count%10;   LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
) W9 Y; W* u6 K: \! o0 S4 v                                            delay();) G2 b* O0 \; O. R% X! n, S
                                                music(count1+1);: n6 q$ V4 T9 S1 f! T% P9 F7 v6 b
                                            delay();
, X$ c' o4 k3 Z* B, o* }9 X                                                music(count2+1);" e. J8 n1 C, o
                                            delay();0 K: I, f6 v7 Q  P+ W7 j
                                        }
8 i, {. Z$ b: j3 @
6 k8 H. V# d: [0 q# F+ ]                                        else if(count<1000)
  w5 F# z6 V* {5 O, }( D4 Z  `, R( U                                        {' \5 B5 s/ f) U; P# p) `; s
                                                count1=count/100;        LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
, U7 |: n$ J, L7 j  o) G                                                count2=count/10%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);: {9 C" z5 T6 b; B+ G
                                                count3=count%10;          LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);' F" p  K) K: ~$ ], w& w! c$ z9 n
                                                delay();- |7 m; i- N, O! [7 U
                                                music(count1+1);! G. i- L2 u0 f' r! a# a+ K0 l
                                            delay();
3 |( I( k9 K/ P  n                                                music(count2+1);: v9 r, A% ~$ |0 u2 N
                                            delay();- W; t) Z( `( S  ]  X$ M2 |
                                                music(count3+1);  A' i1 F0 x6 A0 \
                                            delay();/ @% B0 z4 g4 ?9 m
                                        }
* y. S9 \- a9 u6 t2 }& j% C9 J                                        else   if(count<10000)& A) r- r: I+ @! ]: I
                                         {+ G# b2 m2 Y# z6 G1 s
                                                  count1=count/1000;                   LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);
9 k$ f4 t. k/ {$ q* ~                                                count2=count/100%10;          LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);
8 k* o( r* y" m                                                count3=count/10%10;                   LCD_Write_Com(0x80+a+3);        LCD_Write_Data(dat[count3]);
  G4 V  y% j  ]. e# h( B- e                                                count4=count%10;                 LCD_Write_Com(0x80+a+4);        LCD_Write_Data(dat[count4]);
0 l% f0 N1 Z3 @                                            delay();
, g+ m# o9 b" m                                                music(count1+1);
" d+ J3 ~, Q4 z8 v; u                                            delay();
1 P# f) ~4 P0 \! I5 C7 M1 }  x. r: v                                                music(count2+1);/ e6 C3 ~7 a7 C( W$ R$ h
                                            delay();! l; N/ ]4 E1 g. E( R& {3 `
                                                music(count3+1);
7 d1 n1 ^7 w$ F" _" g                                            delay();
/ t, S% {/ X  L* b* i; d                                            music(count4+1);% l% n7 n' ^) S* j
                                            delay();
) c4 ^  x/ E- p" R2 t                                         }; w) ?+ @1 _0 e
                                                        break;- ~- V8 T: j- v7 P6 }, J
                                case 4:                count=(table1[0]*10+table1[1])/(table1[2]*10+table1[3]);' D- |! a5 G% l2 K7 `% A/ s
$ Q  J( F- H4 D* d) L/ Y2 Q
* c: B9 ~6 ^) K( e( K& W0 k8 f1 O. t) q

7 w& g) [3 x. o0 e2 L3 A- e5 b0 B                                 if(count<10)
, r* s4 ?6 v/ Q7 }. r                                                {                                                              
( J8 |& l& a5 b+ _& e  a/ S                                                  LCD_Write_Com(0x80+a+1);LCD_Write_Data('0');        //LCD_Write_Data(dat[count]);
1 M$ \) \! d# I. _. J: S                                                  LCD_Write_Com(0x80+a+2);LCD_Write_Data(dat[count]);
5 r5 t- F5 B/ X! _0 H                                                  delay();
# K# x! a% Y, N0 f5 J                                                  music(1);
- H1 u4 R0 Q. m1 Z                                              delay();
, v3 v0 f* G8 ]% h6 g; t                                                  music(count+1);* a9 y% E& h, r; f2 D( ^! N
                                              delay();0 f4 r0 U: E; {) s6 c* A6 K3 D
                                                }- W/ T1 i; ?* K3 s: g
                                                else  
" ?+ j6 @+ u: f/ }+ J5 I# {# m                                                {& }% p" i: M) k! v, E
                                                        count1=count/10;  LCD_Write_Com(0x80+a+1);        LCD_Write_Data(dat[count1]);7 w4 A; z3 }+ `2 n
                                                        count2=count%10;  LCD_Write_Com(0x80+a+2);        LCD_Write_Data(dat[count2]);3 T! [6 G1 K* E0 Y1 x' Z. k
                                                        delay();4 c- o  V9 N1 p/ {& V2 s
                                                    music(count1+1);
% i# s# c) @2 S/ R" h4 V                                                delay();
: z1 `$ N% S8 ]7 R( _. ]! ~                                                    music(count2+1);$ @( S1 G9 x( Z; b# r  e
                                                delay();$ H; y' U4 c2 {4 w# k7 _' [
                                                }           % }, U3 ]7 h  \+ d
                                                break;. r/ k7 S8 ]* y2 B% S
                        }
) k+ y  b4 {' Q# X0 y7 i# i9 @4 x                        flag1=0;
( y. Q9 o1 ^2 _$ v' ]         }
& f5 b2 b! b0 w) P9 Y( m, V         else
' j# T2 U: y, z' E& e* M' c         {
/ G4 U" {8 C0 J8 {& l; H. t         if(IRcord[2]==0x43)
( s7 b$ `8 x1 A) K4 M1 w' K         {% ^) P3 j: k6 P; u; m
                LCD_Write_Com(0x01);
5 O5 B' X! a) C5 R         qingchu=1;
! K, J7 l2 f0 v8 Z( O: t0 ]2 [7 {1 Y, ^4 D3 ]; t) Q: f9 C9 L' w5 e3 W
         }4 G4 x& U) H7 t+ g/ O
}          [% v6 A/ K) K0 u: z1 I

7 P8 j0 Q! x. v. S6 i9 |# p) g( p5 K" b- n3 m
}8 h/ x! A2 \2 T6 e2 T: b6 A
/*------------------------------------------------
1 v( v, {% U, E# ^' t) Q, h* ^                红外码值处理. l: D1 v' R& K. {
------------------------------------------------*/% G0 {! m% M( N; v
void Ircordpro(void)//红外码值处理函数( o$ L( ?) g7 W. d0 q) S9 Y
{6 r$ s( a* s0 z) Z* J9 D
  unsigned char i, j, k;* z  H# i4 ^9 {0 w
  unsigned char cord,value;+ x' _3 H; a9 v5 h3 s# F) t6 P

3 Y" l- S; u1 Q0 e8 W, r  k=1;
. f7 G: S0 ~* C  for(i=0;i<4;i++)      //处理4个字节
; w: M: E8 C  Y" J5 f     {  G# h$ z2 Y/ p6 C, F
      for(j=1;j<=8;j++) //处理1个字节8位/ Q* b* I5 g2 d; O( R
         {: i! e# Z& v' r" G- z
          cord=irdata[k];7 h7 O. q1 P+ x+ I& J
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差( l& B+ ^4 x' f. P/ d! ~0 A
             value|=0x80;- n! j; w- d" e9 H# ?
          if(j<8)
9 X4 ^2 k* c5 g1 n7 ^                    {
9 f% T9 g2 y7 ]; b. w                         value>>=1;- J! d, m' h3 a& n! q; o
                        }
: c/ K" i! G& N  o" ]0 i           k++;# s/ q! h+ `. _) e+ U5 A6 a6 [
         }
7 Y9 S' I! Q" q' H     IRcord=value;
& B$ }" j8 O2 E  \" S6 @     value=0;# N; I5 ~7 X/ v' j1 u
     }# S8 j7 k! ^/ J3 c- b
         irpro_ok=1;//处理完毕标志位置1) m; o  r4 J3 ]( P4 e$ l# b; ^
}
3 z3 \* k( `( \! Q8 X# r3 U3 R8 Q6 U
% \! X9 k: c) K  B( V7 r/*------------------------------------------------4 ^3 A( H, w/ t
                    主函数' u3 W6 ~& n: n! P  w
------------------------------------------------*/! |) x* C6 m( N- A# A  g
void main(void)
5 @. R7 f& [: a* `9 E7 ?{6 |! h6 \. N1 M4 M1 x- K( L4 K' q
int m;' {% U. r+ J* z, \0 b* c8 c
EX0init(); //初始化外部中断$ Y( O7 I0 h- R$ m+ X  J; h. I
TIM0init();//初始化定时器! n/ r4 A2 h$ X5 X: F6 t# N
LCD_Init();
" B" b# u+ R$ P: _$ i+ B+ y# c- HLCD_Clear();//清??: |( n- `. U0 S
( ~$ ^9 J% t; w* y- \9 I
while(1)//主循环
; d! q6 v, e* B0 ^/ z6 _   {  m1 c. L4 ]9 U/ I! L  D- ^6 w# a; ^
    while(irok==0);                        //如果接收好了进行红外处理
6 B# a, E- {5 ?. k) Q                 irok=0 ;. w  u" n+ g4 v3 A' L$ m. C
           Ircordpro();! ^- j( q5 U; M, l& H1 q( [
          while(irpro_ok==0);                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
- j- [3 a4 [# v7 [8 U. ~* z                   irpro_ok=0;& U% Y. @7 Z0 K0 P
           Ir_work();+ [2 M' M1 g7 W. x- l7 f( |( T7 C
           if(qingchu==1)
0 W3 A) O3 \# ^# @7 @9 F9 r8 w: E) F           {7 V, }, j3 {: O" w/ P1 {
                           qingchu=0;
3 S9 Q8 d( ^  U& n/ l$ U  q; }( k                        a=0;# h- x- Q2 i) x! a- E0 R
                 LCD_Write_Com(0x01);9 ?0 @* ?# t3 T6 B- d
                 LCD_Write_Com(0x80);/ E: A7 K3 h9 O
                        p=0;9 Z( t9 ?1 |3 F7 B' ~6 s( A5 A9 s
                 for(m=0;m<6;m++)
/ ?$ I! P$ Z2 W$ z                         table1[m]=0;% v1 G2 O. s* H2 O- {
           }$ `0 ^' v# X( ?7 S! Y7 @; w: F
        }$ N% N( @* L( J9 h; b8 R: B
        }( _- v' S/ _- V& z, E0 C

3 D5 z8 w  b9 r# @7 S8 B/ A: ]6 J8 H- }" W" D4 X: C! {: G
游客,如果您要查看本帖隐藏内容请回复
! v; e; R- \2 ~5 \1 D. G  m

$ H9 w( Y! c2 E  F# F) P4 Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-19 14:58 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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