找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4150|回复: 0
打印 上一主题 下一主题
收起左侧

红外遥控设置电子时钟带温度和闹钟单片机源码

[复制链接]
跳转到指定楼层
楼主

分享一个51单片机做的红外遥控电子时钟:



单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit fmq=P3^6; //蜂鸣器
  6. sbit key=P1^4; //闹钟鸣叫取消键
  7. bit irflag,alarmflag,clockflag; //irflag-红外解码成功标志 alarmflag-进入闹钟设置标志 clockflag-闹钟开关标志

  8. uchar ircode[4];//红外解码数据数组
  9. uchar code redcode[]="0123456789ABCDEF"; //红外解码数据使用的字符
  10. uchar code discode1[]={"DAY:"};
  11. uchar code discode2[]={"TIME:"};
  12. uchar code alarmcode1[]="SET ALARM TIME";
  13. uchar code alarmon[]="ON " ;
  14. uchar code alarmoff[]="OFF";

  15. uchar num; //记录按键次数的变量,用来判断是否输入了2个数字,如果输入了两个数字就移动光标到第一位
  16. uchar setflag=0; //时钟设置项变量,用来区分设置的是时钟的时 分 秒 日 月 年
  17. uchar hour,minute,h,l,i; //全局变量 DS1302时钟的小时,分钟数据,用来在定时器中和闹钟的数据比对判断是否闹铃时间已到,
  18. //h-调整时间数据时输入数据的高位 l-调整时间数据时输入数据的地位

  19. void delayms(uint xms) //普通延时
  20. {
  21.         uint m;
  22.         uchar n;
  23.         for(m=0;m<xms;m++)
  24.                 for(n=0;n<129;n++);
  25. }

  26. void delayus() //微秒级延时
  27. {
  28.         _nop_();
  29.         _nop_();
  30.         _nop_();
  31.         _nop_();
  32.         _nop_();
  33.         _nop_();
  34. }

  35. void delay882(void) //红外解码时延时800毫秒
  36. {
  37.     uchar a,b;
  38.     for(b=8;b>0;b--)
  39.         for(a=49;a>0;a--);
  40. }

  41. void delay1000(void) //红外解码时延时1000毫秒
  42. {
  43.     uchar a,b;
  44.     for(b=102;b>0;b--)
  45.         for(a=3;a>0;a--);
  46. }

  47. void delay2400(void) //红外解码时延时2400毫秒   
  48. {
  49.     uchar a,b;
  50.     for(b=96;b>0;b--)
  51.         for(a=10;a>0;a--);
  52. }



  53. void beep() //蜂鸣器鸣叫
  54. {
  55.         uchar n;
  56.         for(n=0;n<100;n++)
  57.         {
  58.                 fmq=0;
  59.                 delayms(1);
  60.                 fmq=1;
  61.                 delayms(1);
  62.         }
  63. }

  64. void ring() //闹铃响
  65. {
  66.         uchar n;
  67.         for(n=0;n<100;n++)
  68.         {
  69.                 fmq=0;
  70.                 delayms(1);
  71.                 fmq=1;
  72.                 delayms(1);
  73.                 fmq=0;
  74.                 delayms(5);
  75.                 fmq=1;
  76.                 delayms(5);
  77.         }
  78. }

  79. //DS1602液晶显示部分

  80. sbit rs=P2^0;
  81. sbit rw=P2^1;
  82. sbit e=P2^2;
  83. sbit bf=P0^7;

  84. bit ds1602state() //取液晶的忙碌状态
  85. {
  86.         bit flg;
  87.         rs=0;
  88.         rw=1;
  89.         e=1;
  90.         delayus();
  91.         flg=bf;
  92.         delayus();
  93.         e=0;
  94.         return flg;       
  95. }

  96. void ds1602order(uchar dat) //写入液晶的命令
  97. {
  98.         while(ds1602state());
  99.         rs=0;
  100.         rw=0;
  101.         e=0;
  102.         delayus();
  103.         P0=dat;
  104.         delayus();
  105.         e=1;
  106.         delayus();
  107.         e=0;
  108. }

  109. void ds1602data(uchar dat) //写入液晶的数据
  110. {
  111.         while(ds1602state());
  112.         rs=1;
  113.         rw=0;
  114.         e=0;
  115.         delayus();
  116.         P0=dat;
  117.         delayus();
  118.         e=1;
  119.         delayus();
  120.         e=0;
  121. }

  122. void ds1602address(uchar dat) //写入液晶的地址
  123. {
  124.         ds1602order(0x80|dat);
  125. }

  126. void ds1602init() //液晶初始化
  127. {
  128.         delayms(15);
  129.         ds1602order(0x38);
  130.         delayms(5);
  131.         ds1602order(0x0c);
  132.         delayms(5);
  133.         ds1602order(0x06);
  134.         delayms(5);
  135.         ds1602order(0x01);
  136.         delayms(5);
  137. }

  138. //DS18B20程序

  139. sbit dq=P3^3;
  140. uchar wendu; //DS18B20温度保存变量

  141. bit ds18b20init() //DS18B20初始化
  142. {
  143.         bit flg;
  144.         uchar n;
  145.         dq=1;
  146.         for(n=0;n<2;n++);
  147.         dq=0;
  148.         for(n=0;n<200;n++);
  149.         dq=1;
  150.         for(n=0;n<10;n++);
  151.         flg=dq;
  152.         for(n=0;n<100;n++);
  153.         return flg;

  154. }

  155. void ds18b20write(uchar dat) //DS18B20写入数据
  156. {
  157.         uchar n,m;
  158.         for(n=0;n<8;n++)
  159.         {
  160.                 dq=1;
  161.                 _nop_();
  162.                 dq=0;
  163.                 _nop_();
  164.                 dq=dat&0x01;
  165.                 for(m=0;m<30;m++);
  166.                 dq=1;
  167.                 for(m=0;m<2;m++);
  168.                 dat>>=1;
  169.         }
  170. }

  171. uchar ds18b20read() //DS18B20读出数据
  172. {
  173.         uchar n,m,dat;
  174.         for(n=0;n<8;n++)
  175.         {
  176.                 dq=1;
  177.                 _nop_();
  178.                 dq=0;
  179.                 _nop_();
  180.                 dq=1;
  181.                 for(m=0;m<2;m++);
  182.                 dat=dat>>1;
  183.                 if(dq==1)
  184.                         dat|=0x80;
  185.                 dq=1;
  186.                 for(m=0;m<2;m++);               
  187.         }
  188.         return dat;
  189. }

  190. void ds18b20wendu() //DS18B20温度转换 没有对负温度进行相关的判断和操作
  191. {
  192.         uchar wenduh,wendul;
  193.         ds18b20init();
  194.         ds18b20write(0xcc);
  195.         ds18b20write(0x44);

  196.         ds18b20init();
  197.         ds18b20write(0xcc);
  198.         ds18b20write(0xbe);
  199.         wendul=ds18b20read();
  200.         wenduh=ds18b20read();
  201.         wendu=(wendul>>4)|(wenduh<<4);
  202. }

  203. //DS1302时钟程序

  204. sbit scl=P1^0;
  205. sbit sd=P1^1;
  206. sbit rst=P1^2;

  207. uchar code discode3[]={"0123456789"}; //DS1302时钟显示使用的字符数据

  208. void ds1302write(uchar dat) //DS1302写数据
  209. {
  210.         uchar n;
  211.         scl=0;
  212.         for(n=0;n<8;n++)
  213.         {
  214.                 sd=dat&0x01;
  215.                 delayus();
  216.                 scl=1;
  217.                 delayus();
  218.                 scl=0;
  219.                 delayus();
  220.                 dat>>=1;
  221.         }
  222. }

  223. uchar ds1302read() //DS1302读数据
  224. {
  225.         uchar dat,n;
  226.         for(n=0;n<8;n++)
  227.         {
  228.                 dat>>=1;
  229.                 if(sd==1)
  230.                         dat|=0x80;
  231.                 scl=1;
  232.                 delayus();
  233.                 scl=0;
  234.                 delayus();
  235.         }
  236.         return dat;
  237. }

  238. void ds1302writedata(uchar add,uchar dat) //DS1302写入指定地址数据
  239. {
  240.         rst=0;
  241.         scl=0;
  242.         rst=1;

  243.         ds1302write(add);
  244.         ds1302write(dat);

  245.         scl=1;
  246.         rst=0;
  247. }

  248. uchar ds1302readdata(uchar add) //DS1302读出指定地址数据
  249. {
  250.         uchar dat;
  251.         rst=0;
  252.         scl=0;
  253.         rst=1;

  254.         ds1302write(add);
  255.         dat=ds1302read();

  256.         scl=1;
  257.         rst=0;
  258.         return dat;       
  259. }

  260. void ds1302init() //DS1302写入初始数据
  261. {
  262.         if(ds1302readdata(0x81)&0x80)
  263.         {
  264.                 ds1302writedata(0x8e,0x00);
  265.                 ds1302writedata(0x80,0x00);
  266.                 ds1302writedata(0x82,0x25);
  267.                 ds1302writedata(0x84,0x12);
  268.                 ds1302writedata(0x86,0x02);
  269.                 ds1302writedata(0x88,0x04);
  270.                 ds1302writedata(0x8a,0x02);
  271.                 ds1302writedata(0x8c,0x13);
  272.                 ds1302writedata(0x8e,0x80);
  273.                 ds1302writedata(0x90,0xa5);
  274.         }
  275. }

  276. void ds1302disp() //DS1302时钟数据显示
  277. {
  278.         uchar secondh,secondl,minuteh,minutel,hourh,hourl,dayh,dayl,monthh,monthl,week,yearh,yearl; //时钟数据的相关高位和地位
  279.         hour=ds1302readdata(0x85);
  280.         minute=ds1302readdata(0x83);
  281.         secondh=ds1302readdata(0x81)>>4; //DS1302秒数据的高位
  282.         secondl=ds1302readdata(0x81)&0x0f; //DS1302秒数据的低位
  283.         minuteh=minute>>4;
  284.         minutel=minute&0x0f;
  285.         hourh=hour>>4;
  286.         hourl=hour&0x0f;
  287.         dayh=ds1302readdata(0x87)>>4;
  288.         dayl=ds1302readdata(0x87)&0x0f;
  289.         monthh=ds1302readdata(0x89)>>4;
  290.         monthl=ds1302readdata(0x89)&0x0f;
  291.         yearh=ds1302readdata(0x8d)>>4;
  292.         yearl=ds1302readdata(0x8d)&0x0f;
  293.         week=ds1302readdata(0x8b)&0x0f;
  294.         ds1602address(0x04);
  295.         ds1602data('2');
  296.         ds1602data('0');
  297.         ds1602data(discode3[yearh]);
  298.         ds1602data(discode3[yearl]);
  299.         ds1602data('-');
  300.         ds1602data(discode3[monthh]);
  301.         ds1602data(discode3[monthl]);
  302.         ds1602data('-');
  303.         ds1602data(discode3[dayh]);
  304.         ds1602data(discode3[dayl]);
  305.         ds1602data(' ');
  306.         ds1602data(discode3[week]);
  307.         ds1602address(0x45);
  308.         ds1602data(discode3[hourh]);
  309.         ds1602data(discode3[hourl]);
  310.         ds1602data(':');
  311.         ds1602data(discode3[minuteh]);
  312.         ds1602data(discode3[minutel]);
  313.         ds1602data(':');
  314.         ds1602data(discode3[secondh]);
  315.         ds1602data(discode3[secondl]);
  316.         ds1602data(' ');
  317.         ds1602data(discode3[wendu/10]);
  318.         ds1602data(discode3[wendu%10]);       
  319. }

  320. //24c08读写程序

  321. sbit  sclk=P3^4;
  322. sbit sda=P3^5;
  323. uchar alarmcode[4]; //24c08中保存的闹钟数据,alarmcode[0]-闹钟数据的小时 alarmcode[1]-闹钟数据的分钟 alarmcode[2]-闹钟数据的秒
  324. //alarmcode[3]-闹钟开关标志 (0为闹钟关闭,1为闹钟开启)
  325. void iic24c08start() //24c08启动
  326. {
  327.         sda=1;
  328.         sclk=1;
  329.         delayus();
  330.         sda=0;
  331.         sclk=0;
  332.         delayus();
  333. }

  334. void iic24c08stop() //24c08停止
  335. {
  336.         sda=0;
  337.         sclk=1;
  338.         delayus();
  339.         sda=1;
  340.         delayus();
  341. }

  342. void iic24c08answer() //24c08应答
  343. {
  344.         uchar n;
  345.         sclk=1;
  346.         delayus();
  347.         while((sda==1)&&(n<255))
  348.         n++;
  349.         sclk=0;
  350.         delayus();

  351. }

  352. void iic24c08write(uchar dat) //24c08写数据
  353. {
  354.         uchar n;
  355.         for(n=0;n<8;n++)
  356.         {
  357.                 sda=dat&0x80;
  358.                 delayus();
  359.                 sclk=1;
  360.                 delayus();
  361.                 sclk=0;
  362.                 delayus();
  363.                 dat<<=1;
  364.         }
  365. }

  366. uchar iic24c08read() //24c08读数据
  367. {
  368.         uchar n,dat;
  369.         for(n=0;n<8;n++)
  370.         {
  371.                 sclk=1;
  372.                 dat<<=1;
  373.                 if(sda==1)
  374.                 dat|=0x01;
  375.                 delayus();
  376.                 sclk=1;
  377.                 delayus();
  378.                 sclk=0;
  379.                 delayus();
  380.         }
  381.         return dat;
  382. }

  383. void iic24c08writeadd(uchar add,uchar dat) //24c08写指定地址数据
  384. {
  385.         iic24c08start();
  386.         iic24c08write(0xa0);
  387.         iic24c08answer();
  388.         iic24c08write(add);
  389.         iic24c08answer();
  390.         iic24c08write(dat);
  391.         iic24c08answer();
  392.         iic24c08stop();
  393.         delayms(15);
  394. }

  395. uchar iic24c08readadd(uchar add) //24c08读指定地址数据
  396. {
  397.         uchar dat;
  398.         iic24c08start();
  399.         iic24c08write(0xa0);
  400.         iic24c08answer();
  401.         iic24c08write(add);
  402.         iic24c08answer();

  403.         iic24c08start();
  404.         iic24c08write(0xa1);
  405.         iic24c08answer();
  406.         dat=iic24c08read();
  407.         iic24c08stop();
  408.         return dat;       
  409. }

  410. //红外解码程序

  411. sbit ir=P3^2;

  412. void decode()
  413. {
  414.         uchar u,m;
  415. while(ir==0);
  416.   delay2400();
  417.   if(ir==1)                               //延时2.4ms后如果是高电平则是新码
  418.   {
  419.      delay2400();                            //延时4.8ms避开4.5ms的高电平
  420.          for(u=0;u<4;u++)
  421.          {
  422.                 for(m=0;m<8;m++)
  423.                    {
  424.                    while(ir==0);                       //等待地址码第1位高电平到来
  425.                    delay882();                         //延时882ms判断此时引脚电平
  426.                    if(ir==0)
  427.                    {      
  428.                           ircode[u]>>=1;
  429.                           ircode[u]=ircode[u]&0x7f;                          
  430.                    }
  431.                    else if(ir==1)
  432.                    {
  433.                           delay1000();
  434.                           ircode[u]>>=1;
  435.                           ircode[u]=ircode[u]|0x80;
  436.                    }
  437.                 }                                    //1位数据接收结束
  438.              }                                       //32位二进制码接收结束
  439.    }        

  440.                 if(ircode[2]==~ircode[3])
  441.                 {        irflag=1;
  442.                
  443.                 }


  444. }

  445. //外部中断0和定时器0初始化

  446. void timeinit()  
  447. {
  448.         EA=1;
  449.         EX0=1;
  450.         IT0=1;
  451.         ET0=1;
  452.         TMOD=0X01;
  453.         TH0=(65536-50000)/256;
  454.         TL0=(65536-50000)%256;
  455.         TR0=0;
  456. }

  457. void main()
  458. {
  459.         uchar n; //计数次数变量       
  460.         timeinit();
  461.         ds1602init();
  462.         ds1602address(0x00);
  463.         while(discode1[n]!='\0') //在DS1602写入字符 DATE
  464.         {
  465.                 ds1602data(discode1[n]);
  466.                 n++;       
  467.         }
  468.         n=0;
  469.         ds1602address(0x40);
  470.         while(discode2[n]!='\0') //在DS1602写入字符 TIME
  471.         {
  472.                 ds1602data(discode2[n]);
  473.                 n++;
  474.         }       
  475.         ds1302init();
  476.         n=0;
  477.         for(n=0;n<4;n++)
  478.         {
  479.                 alarmcode[n]=iic24c08readadd(n);
  480.         }
  481.         clockflag=(bit)alarmcode[3];
  482.         if(clockflag)
  483.         {
  484.                 TR0=1;
  485.         }

  486.         while(1)
  487.         {
  488.                 if(setflag==0&&alarmflag==0)
  489.                 {
  490.                         ds18b20wendu();
  491.                         ds1302disp();
  492.                 }
  493.                 if(irflag==1) //红外解码成功后通过switch函数匹配红外码对应的操作
  494.                 {
  495.                         switch(ircode[2])
  496.                         {
  497.                                         case 0x45: //设置时钟的年 光标在年数据第一位上闪烁
  498.                                                 if(alarmflag==0) //如果已经进入了闹钟设置界面,按此红外码无效
  499.                                                 {
  500.                                                         num=0;
  501.                                                         ds1602order(0x0f);
  502.                                                         delayms(5);
  503.                                                         ds1602address(0x06);
  504.                                                         delayms(5);
  505.                                                         setflag=1;
  506.                                                         h=ds1302readdata(0x8d)>>4;
  507.                                                         l=ds1302readdata(0x8d)&0x0f;
  508.                                                         beep();
  509.                                                 }
  510.                                                 break;
  511.                                         case 0x46: //设置时钟的月 光标在月数据第一位上闪烁
  512.                                                         if(alarmflag==0)
  513.                                                 {
  514.                                                         num=0;
  515.                                                         ds1602order(0x0f);
  516.                                                         delayms(5);
  517.                                                         ds1602address(0x09);
  518.                                                         delayms(5);
  519.                                                         setflag=2;
  520.                                                         h=ds1302readdata(0x89)>>4;
  521.                                                         l=ds1302readdata(0x89)&0x0f;
  522.                                                         beep();
  523.                                                 }
  524.                                                 break;
  525.                                 case 0x47: //设置时钟的日 光标在日数据第一位上闪烁
  526.                                                         if(alarmflag==0)
  527.                                                 {
  528.                                                         num=0;
  529.                                                         ds1602order(0x0f);
  530.                                                         delayms(5);
  531.                                                         ds1602address(0x0c);
  532.                                                         delayms(5);
  533.                                                         setflag=3;
  534.                                                         h=ds1302readdata(0x87)>>4;
  535.                                                         l=ds1302readdata(0x87)&0x0f;
  536.                                                         beep();
  537.                                                 }
  538.                                                 break;

  539.                                 case 0x44://设置时钟的星期 光标在星期数据第一位上闪烁
  540.                                                         if(alarmflag==0)
  541.                                                 {
  542.                                                         num=0;
  543.                                                         ds1602order(0x0f);
  544.                                                         delayms(5);
  545.                                                         ds1602address(0x0f);
  546.                                                         delayms(5);
  547.                                                         setflag=4;
  548.                                                         h=ds1302readdata(0x8b)>>4;
  549.                                                         l=ds1302readdata(0x8b)&0x0f;
  550.                                                         beep();
  551.                                                 }
  552.                                                 break;

  553.                                 case 0x40: //设置时钟的小时 光标在小时数据第一位上闪烁
  554.                                                 num=0;
  555.                                                 ds1602order(0x0f);
  556.                                                 delayms(5);
  557.                                                 ds1602address(0x45);
  558.                                                 if(alarmflag==0) //设置时钟小时数据 (alarmflag=1时表示已经进入闹钟设置界面)
  559.                                                 {
  560.                                                         setflag=5;
  561.                                                         h=ds1302readdata(0x85)>>4;
  562.                                                         l=ds1302readdata(0x85)&0x0f;
  563.                                                         beep();
  564.                                                 }
  565.                                                 else //设置闹钟小时
  566.                                                 {
  567.                                                         setflag=8;
  568.                                                         h=alarmcode[0]>>4;
  569.                                                         l=alarmcode[0]&0x0f;
  570.                                                         beep();
  571.                                                 }

  572.                                                 break;
  573.                                 case 0x43: //设置时钟的分 光标在分数据第一位上闪烁
  574.                                                
  575.                                                 num=0;
  576.                                                 ds1602order(0x0f);
  577.                                                 delayms(5);
  578.                                                 ds1602address(0x48);
  579.                                                 delayms(5);
  580.                                                 if(alarmflag==0)
  581.                                                 {
  582.                                                         setflag=6;
  583.                                                         h=ds1302readdata(0x83)>>4;
  584.                                                         l=ds1302readdata(0x83)&0x0f;
  585.                                                         beep();
  586.                                                 }
  587.                                                 else
  588.                                                 {
  589.                                                         setflag=9;
  590.                                                         h=alarmcode[1]>>4;
  591.                                                         l=alarmcode[1]&0x0f;
  592.                                                         beep();
  593.                                                 }

  594.                                                 break;
  595.                                 case 0x07: //设置时钟的秒 光标在秒数据第一位上闪烁
  596.                                                 num=0;
  597.                                                 ds1602order(0x0f);
  598.                                                 delayms(5);
  599.                                                 ds1602address(0x4b);
  600.                                                 delayms(5);
  601.                                                 if(alarmflag==0)
  602.                                                 {
  603.                                                         setflag=7;
  604.                                                         h=ds1302readdata(0x81)>>4;
  605.                                                         l=ds1302readdata(0x81)&0x0f;
  606.                                                         beep();
  607.                                                 }
  608.                                                 else
  609.                                                 {
  610.                                                         setflag=10;
  611.                                                         h=alarmcode[2]>>4;
  612.                                                         l=alarmcode[2]&0x0f;
  613.                                                         beep();
  614.                                                 }

  615.                                                 break;       
  616.                                 case 0x19: //进入闹钟设置界面
  617.                                         alarmflag=1;
  618.                                         setflag=0;
  619.                                         for(n=0;n<4;n++) //从24c08中读取闹钟数据以便在下面显示
  620.                                         {
  621.                                                 alarmcode[n]=iic24c08readadd(n);
  622.                                         }
  623.                                         clockflag=(bit)alarmcode[3];
  624.                                         beep();
  625.                                         ds1602order(0x01);
  626.                                         delayms(5);
  627.                                         ds1602order(0xc);
  628.                                         ds1602address(0x01);
  629.                                         n=0;
  630.                                         while(alarmcode1[n]!='\0') //在DS1602显示字符SET ALARM TIME
  631.                                         {
  632.                                                 ds1602data(alarmcode1[n]);
  633.                                                 n++;
  634.                                         }
  635.                                         n=0;
  636.                                         if(alarmcode[3]==0) //根据24c08中闹钟开关数据显示相应的字符ON OFF
  637.                                         {
  638.                                                 ds1602address(0x41);
  639.                                                 while(alarmoff[n]!='\0')
  640.                                                 {
  641.                                                 ds1602data(alarmoff[n]);
  642.                                                 n++;
  643.                                                 }
  644.                                         }
  645.                                         else
  646.                                         {
  647.                                                 ds1602address(0x41);
  648.                                                 while(alarmon[n]!='\0')
  649.                                                 {
  650.                                                 ds1602data(alarmon[n]);
  651.                                                 n++;
  652.                                                 }

  653.                                         }
  654.                                         ds1602address(0x45);
  655.                                         ds1602data(discode3[alarmcode[0]>>4]);
  656.                                         ds1602data(discode3[alarmcode[0]&0x0f]);
  657.                                         ds1602data(':');
  658.                                         ds1602data(discode3[alarmcode[1]>>4]);
  659.                                         ds1602data(discode3[alarmcode[1]&0x0f]);
  660.                                         ds1602data(':');
  661.                                         ds1602data(discode3[alarmcode[2]>>4]);       
  662.                                         ds1602data(discode3[alarmcode[2]&0x0f]);
  663.                                         ds1602address(0x40);
  664.                                         break;
  665.                                 case 0x0d: //闹钟开关设置
  666.                                         if(alarmflag==1)
  667.                                         {
  668.                                                 beep();
  669.                                                 ds1602order(0x0c);
  670.                                                 clockflag=~clockflag;
  671.                                                 if(clockflag==0)
  672.                                                 {                                                       
  673.                                                         ds1602address(0x41);
  674.                                                         n=0;
  675.                                                         while(alarmoff[n]!='\0')       
  676.                                                         {
  677.                                                                 ds1602data(alarmoff[n]);
  678.                                                                 n++;
  679.                                                         }
  680.                                                         iic24c08writeadd(0x03,0x00);
  681.                                                         TR0=0;
  682.                                                 }
  683.                                                 else
  684.                                                 {
  685.                                                                 ds1602address(0x41);
  686.                                                                 n=0;
  687.                                                                 while(alarmon[n]!='\0')       
  688.                                                                 {
  689.                                                                         ds1602data(alarmon[n]);
  690.                                                                         n++;
  691.                                                                 }
  692.                                                                 iic24c08writeadd(0x03,0x01);
  693.                                                                 TR0=1;
  694.                                                                 for(n=0;n<4;n++)
  695.                                                                 {
  696.                                                                         alarmcode[n]=iic24c08readadd(n);
  697.                                                                 }
  698.                                                 }
  699.                                        
  700.                                         }
  701.                                         break;
  702.                                 case 0x16: //输入字符0
  703.                                         if(setflag!=0)
  704.                                         {       
  705.                                                 num++; //输入次数加1
  706.                                                 ds1602data('0');
  707.                                                 switch(num) //匹配输入次数
  708.                                                 {
  709.                                                         case 1: h=0; break; //高位数据
  710.                                                         case 2: num=0; l=0; ds1602order(0x10);delayms(5);  ds1602order(0x10); delayms(5);break; //低位数据
  711.                                                 }                                       
  712.                                                 beep();
  713.                                         }

  714.                                 break;

  715.                                 case 0x0c:
  716.                                         if(setflag!=0)
  717.                                         {
  718.                                                 num++;
  719.                                                 ds1602data('1');
  720.                                                 switch(num)
  721.                                                 {
  722.                                                         case 1: h=1; break;
  723.                                                         case 2: num=0;l=1;ds1602order(0x10);delayms(5);  ds1602order(0x10);delayms(5); break;
  724.                                                 }                                       
  725.                                                 beep();
  726.                                        
  727.                                         }
  728.                                 break;

  729.                                 case 0x18:
  730.                                         if(setflag!=0)
  731.                                         {
  732.                                                 num++;
  733.                                                 ds1602data('2');
  734.                                                 switch(num)
  735.                                                 {
  736.                                                         case 1: h=2; break;
  737.                                                         case 2: num=0; l=2;ds1602order(0x10);delayms(5);  ds1602order(0x10);delayms(5); break;
  738.                                                 }                                       
  739.                                                 beep();
  740.                                         }
  741.                                 break;
  742.                        
  743.                                 case 0X5E:
  744.                                         if(setflag!=0)
  745.                                         {
  746.                                                 num++;
  747.                                                 ds1602data('3');
  748.                                                 switch(num)
  749.                                                 {
  750.                                                         case 1: h=3; break;
  751.                                                         case 2: num=0; l=3;ds1602order(0x10); delayms(5); ds1602order(0x10); delayms(5);break;
  752.                                                 }                                       
  753.                                                 beep();
  754.                                         }
  755.                                 break;
  756.                        
  757.                                 case 0X08:
  758.                                         if(setflag!=0)
  759.                                         {
  760.                                                 num++;
  761.                                                 ds1602data('4');
  762.                                        
  763.                                                 switch(num)
  764.                                                 {
  765.                                                         case 1: h=4; break;
  766.                                                         case 2: num=0; l=4; ds1602order(0x10);delayms(5);  ds1602order(0x10);delayms(5); break;
  767.                                                 }                                       
  768.                                                 beep();
  769.                                         }
  770.                                 break;
  771.                
  772.                                 case 0X1C:
  773.                                         if(setflag!=0)
  774.                                         {
  775.                                                 num++;       
  776.                                                 ds1602data('5');
  777.                                                 switch(num)
  778.                                                 {
  779.                                                         case 1: h=5; break;
  780.                                                         case 2: num=0; l=5; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
  781.                                                 }                                       
  782.                                                 beep();
  783.                                         }
  784.                                 break;
  785.                        
  786.                                 case 0X5A:
  787.                                         if(setflag!=0)
  788.                                         {
  789.                                                 num++;       
  790.                                                 ds1602data('6');
  791.                                                
  792.                                                 switch(num)
  793.                                                 {
  794.                                                         case 1: h=6; break;
  795.                                                         case 2: num=0; l=6; ds1602order(0x10); delayms(5); ds1602order(0x10); delayms(5);break;
  796.                                                 }                                       
  797.                                                 beep();
  798.                                         }
  799.                                 break;
  800.                        
  801.                                 case 0X42:
  802.                                         if(setflag!=0)
  803.                                         {
  804.                                                 num++;       
  805.                                                 ds1602data('7');
  806.                                                        
  807.                                                 switch(num)
  808.                                                 {
  809.                                                         case 1: h=7; break;
  810.                                                         case 2: num=0; l=7; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
  811.                                                 }                                       
  812.                                                 beep();
  813.                                         }
  814.                                 break;
  815.                        
  816.                                 case 0X52:
  817.                                         if(setflag!=0)
  818.                                         {
  819.                                                 num++;       
  820.                                                 ds1602data('8');
  821.                                                        
  822.                                                 switch(num)
  823.                                                 {
  824.                                                         case 1: h=8; break;
  825.                                                         case 2: num=0; l=8; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
  826.                                                 }                                       
  827.                                                 beep();
  828.                                         }
  829.                                 break;
  830.                        
  831.                                 case 0X4A:
  832.                                         if(setflag!=0)
  833.                                         {
  834.                                                 num++;               
  835.                                                 ds1602data('9');
  836.                                                
  837.                                                 switch(num)
  838.                                                 {
  839.                                                         case 1: h=9; break;
  840.                                                         case 2: num=0; l=9; ds1602order(0x10);delayms(5);  ds1602order(0x10); delayms(5);break;
  841.                                                 }                                       
  842.                                                 beep();
  843.                                         }
  844.                                 break;
  845.                                 case 0X15: //取消返回码
  846.                                         setflag=0;
  847.                                         irflag=0;
  848.                                         if(alarmflag==1) //如果进入过闹钟设置界面,需要重新写入DS1302的初始字符数据
  849.                                         {
  850.                                                 alarmflag=0;
  851.                                                 n=0;
  852.                                                 ds1602address(0x00);
  853.                                                 while(discode1[n]!='\0')
  854.                                                 {
  855.                                                         ds1602data(discode1[n]);
  856.                                                         n++;       
  857.                                                 }
  858.                                                 n=0;
  859.                                                 ds1602address(0x40);
  860.                                                 while(discode2[n]!='\0')
  861.                                                 {
  862.                                                         ds1602data(discode2[n]);
  863.                                                         n++;
  864.                                                 }       

  865.                                         }
  866.                                         beep();
  867. ……………………

  868. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
红外遥控设置电子时钟带温度和闹钟.rar (57.67 KB, 下载次数: 44)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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