找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多功能单片机电子万年历程序

[复制链接]
跳转到指定楼层
楼主
功能:阳历+阴历+星期+闹钟+多点温度无线传输+红外+掉电走时



单片机源程序如下:
  1. #include <reg52.h>
  2. #include "12864B.h"
  3. #include "ds1302.h"
  4. #include "DS18B20.h"
  5. #include"NRF2401.h"
  6. #include "delay.h"
  7. #include "clock.h"
  8. #include "ziku.h"
  9. #include "gongli.h"

  10. extern uchar week_value[2];
  11. extern char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  12. extern unsigned char hi_sec,hi_min,hi_hour,hi_day,hi_month;
  13. extern unsigned char clock_shi,clock_fen,clock_miao,clock_month,clock_day;        //闹钟秒,分,时到日,月,年位闪的计数
  14. extern bit flag2;
  15. extern CLOCKTIME clock_time;

  16. unsigned char count,count1,temp,flag,up_flag,down_flag,shi,fen,miao,week,day,month,year;
  17. unsigned char IrValue[6];
  18. unsigned char Time;

  19. bit done,flag1,flag2;

  20. SYSTEMTIME CurrentTime;

  21. sbit clock_Set=P2^3;
  22. sbit  Set = P2^4;          //功能按键
  23. sbit   Up = P2^2;     //加法按钮
  24. sbit Down = P2^0;     //减法按钮
  25. sbit  Out = P2^1;     //立刻跳出调整模式按钮
  26. sbit Beep = P1^5;          //蜂鸣器
  27. sbit IRIN = P3^2;          //红外

  28. void Setkey();

  29. void timer0_1()
  30. {        
  31.         TMOD=0x01;                                         //设置定时器0为工作方式1
  32.         TH0 = (65536 - 45872)/256;         //装初值
  33.         TL0 = (65536 - 45872)%256;
  34.         EA=1;                                                 //开总中断
  35.         ET0=1;                                 //开定时器0中断
  36.         TR0=1;                                                 //启动定时器0        
  37. }

  38. void show_time()   //液晶显示程序
  39. {
  40.   DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
  41.   TimeToStr(&CurrentTime);       //时间数据转换液晶字符
  42.   DateToStr(&CurrentTime);       //日期数据转换液晶字符

  43.   LCD12864_SetWindow(2,0);                 //设置显示坐标
  44.   Print(CurrentTime.TimeString); //显示时间

  45.   LCD12864_SetWindow(0,1);
  46.   Print(CurrentTime.DateString); //显示日期

  47.   LCD12864_SetWindow(2,7);               
  48.   change();                                                 //显示星期几

  49.   lcm_w_nl();                                         //农历显示
  50.                                              
  51.   Delay10ms(5);                 //扫描延时
  52. }

  53. void outkey()     //跳出调整模式,返回默认显示
  54. {
  55.         uchar Second;
  56.         if(Out==0)         
  57.           {
  58.                   mdelay(8);
  59.                 if(Out==0)
  60.                 {
  61.                         if(flag1==0)
  62.                         {
  63.                                 count=0;
  64.                                 flag1=0;
  65.                                 hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  66.                                 Second=Read1302(DS1302_SECOND);
  67.                             Write1302(0x8e,0x00); //写入允许
  68.                                 Write1302(0x80,Second&0x7f);  //启动计时
  69.                                 Write1302(0x8E,0x80);          //禁止写入
  70.                                 done=0;
  71.                         }
  72.                         else
  73.                         {
  74.                                 count1=0;flag2=0;flag1=0;done=0;
  75.                                 hi_sec=0,hi_min=0,hi_hour=0,hi_day=0,hi_month=0;
  76.                                 LCD12864_WriteCmd(0x30);
  77.                                 LCD12864_WriteCmd(0x01);  //清屏命令
  78.                                 LCD12864_WriteCmd(0x34);  //扩展模式命令,关显示

  79.                                 gui_line(72,32,72,48);         //内部线框
  80.                                 gui_line(0,15,127,15);
  81.                                 gui_line(0,32,127,32);
  82.                                 gui_line(0,48,127,48);
  83.                                 gui_line(62,48,62,63);
  84.                         
  85.                                 gui_line(0,0,127,0);        //四周线框
  86.                                 gui_line(0,1,0,63);
  87.                                 gui_line(0,63,127,63);
  88.                                 gui_line(127,0,127,63);

  89.                                 GUI_Put_Area(81,33,&uMod[0][0],16,14,0);        //固定显示“星”
  90.                                 GUI_Put_Area(96,33,&uMod[1][0],16,14,0);        //固定显示“期”
  91.                                 GUI_Put_Area(3,18,&uMod[2][0],16,12,0);         //固定显示“农”
  92.                                 GUI_Put_Area(19,18,&uMod[3][0],16,12,0);        //固定显示“历”

  93.                                 LCD12864_WriteCmd(0x36);   //开显示
  94.                                 LCD12864_WriteCmd(0x30);   //基本模式命令
  95.                         }                                   
  96.                 }
  97.                 while(Out==0);
  98.           }
  99. }

  100. void Upkey()        //升序按键
  101. {           
  102.         if(Up==0)
  103.         {
  104.                 mdelay(8);
  105.                 if(Up==0)
  106.                 {        
  107.                         if(flag1==0)
  108.                         {           
  109.                                 switch(count)
  110.                                 {
  111.                                         case 1:
  112.                                 DS1302_change(0x81,&miao);        //读取DS1302秒地址的数据给miao
  113.                                                 miao=miao+1;                                                         
  114.                                                 if(miao>=60)     
  115.                                                         miao=0;
  116.                                                 down_flag=1;        
  117.                                                 break;
  118.                                         case 2:
  119.                                     DS1302_change(0x83,&fen);        //读取DS1302分地址的数据给fen
  120.                                                 fen=fen+1;                                                           
  121.                                                 if(fen>=60)     
  122.                                                         fen=0;
  123.                                                 down_flag=1;        
  124.                                                 break;
  125.                                         case 3:
  126.                                     DS1302_change(0x85,&shi);
  127.                                                 shi=shi+1;                                                           
  128.                                                 if(shi>=24)     
  129.                                                         shi=0;
  130.                                                 down_flag=1;        
  131.                                                 break;
  132.                                 
  133.                                         case 4:
  134.                                     DS1302_change(0x87,&day);
  135.                                                 DS1302_change(0x89,&month);
  136.                                                 day=day+1;                                                           
  137.                                                 if(day==31&&((month==4)||(month==6)||(month==9)||(month==11)))     
  138.                                                         day=1;
  139.                                                 if(day==30&&(month==2))
  140.                                                         day=1;
  141.                                                 if(day==32&&((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)))
  142.                                                         day=1;
  143.                                                 down_flag=1;        
  144.                                                 break;
  145.                                         case 5:
  146.                                     DS1302_change(0x89,&month);
  147.                                                 month=month+1;                                                         
  148.                                                 if(month==13)     
  149.                                                         month=1;
  150.                                                 down_flag=1;
  151.                                                 break;
  152.                                         case 6:
  153.                                     DS1302_change(0x8d,&year);
  154.                                                 year=year+1;                                                         
  155.                                                 if(year==100)     
  156.                                                         year=0;
  157.                                                 down_flag=1;        
  158.                                                 break;
  159.                                         default:        break;
  160.                                 }
  161.                         }
  162.                         else
  163.                         {
  164.                                 switch(count1)
  165.                                 {
  166.                                         case 1:
  167.                                                 clock_miao=clock_miao+1;        //闹钟的秒加1                                                  
  168.                                                 if(clock_miao>=60)     
  169.                                                         clock_miao=0;
  170.                                                 break;
  171.                                         case 2:
  172.                                                 clock_fen=clock_fen+1;                                                           
  173.                                                 if(clock_fen>=60)     
  174.                                                         clock_fen=0;
  175.                                                 break;
  176.                                         case 3:
  177.                                                 clock_shi=clock_shi+1;                                                           
  178.                                                 if(clock_shi>=24)     
  179.                                                         clock_shi=0;
  180.                                                 break;
  181.                                         case 4:
  182.                                                 clock_day=clock_day+1;                                                           
  183.                                                 if(clock_day==31&&((clock_month==4)||(clock_month==6)||(clock_month==9)||(clock_month==11)))     
  184.                                                         clock_day=1;
  185.                                                 if(clock_day==30&&(clock_month==2))
  186.                                                         clock_day=1;
  187.                                                 if(clock_day==32&&((clock_month==1)||(clock_month==3)||(clock_month==5)||(clock_month==7)||(clock_month==8)||(clock_month==10)||(clock_month==12)))
  188.                                                         clock_day=1;
  189.                                                 break;
  190.                                         case 5:
  191.                                                 clock_month=clock_month+1;                                                         
  192.                                                 if(clock_month==13)     
  193.                                                         clock_month=1;
  194.                                                 break;
  195.                                         default:        break;
  196.                                 }
  197.                         }
  198.                 }
  199.                 while(Up==0);               
  200.         }
  201. }

  202. void Downkey()        //降序按键
  203. {            
  204.         if(Down==0)
  205.         {
  206.                 mdelay(8);
  207.                 if(Down==0)
  208.                 {
  209.                         if(flag1==0)
  210.                         {
  211.                                 switch(count)
  212.                                 {
  213.                                         case 1:
  214.                                 DS1302_change(0x81,&miao);
  215.                                                 miao=miao-1;                                                         
  216.                                                 if(miao==-1)     
  217.                                                         miao=59;
  218.                                                 down_flag=1;        
  219.                                                 break;
  220.                                         case 2:
  221.                                     DS1302_change(0x83,&fen);
  222.                                                 fen=fen-1;                                                           
  223.                                                 if(fen==-1)     
  224.                                                         fen=59;
  225.                                                 down_flag=1;        
  226.                                                 break;
  227.                                         case 3:
  228.                                     DS1302_change(0x85,&shi);
  229.                                                 shi=shi-1;                                                           
  230.                                                 if(shi==-1)     
  231.                                                         shi=23;
  232.                                                 down_flag=1;        
  233.                                                 break;
  234.                                        
  235.                                         case 4:
  236.                                     DS1302_change(0x87,&day);
  237.                                                 DS1302_change(0x89,&month);
  238.                                                 day=day-1;                                                           
  239.                                                 if(day==0&&((month==4)||(month==6)||(month==9)||(month==11)))     
  240.                                                         day=30;
  241.                                                 if(day==0&&(month==2))
  242.                                                         day=29;
  243.                                                 if(day==0&&((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)))
  244.                                                         day=31;
  245.                                                 down_flag=1;        
  246.                                                 break;
  247.                                         case 5:
  248.                                     DS1302_change(0x89,&month);
  249.                                                 month=month-1;                                                         
  250.                                                 if(month==0)     
  251.                                                         month=12;
  252.                                                 down_flag=1;
  253.                                                 break;
  254.                                         case 6:
  255.                                     DS1302_change(0x8d,&year);
  256.                                                 year=year-1;                                                         
  257.                                                 if(year==-1)     
  258.                                                         year=99;
  259.                                                 down_flag=1;        
  260.                                                 break;
  261.                                         default:        break;
  262.                                 }
  263.                         }
  264.                         else
  265.                         {
  266.                                 switch(count1)
  267.                                 {
  268.                                         case 1:
  269.                                                 clock_miao=clock_miao-1;        //闹钟秒减1                                                  
  270.                                                 if(clock_miao==-1)     
  271.                                                         clock_miao=59;        
  272.                                                 break;
  273.                                         case 2:
  274.                                                 clock_fen=clock_fen-1;                                                           
  275.                                                 if(clock_fen==-1)     
  276.                                                         clock_fen=59;
  277.                                                 break;
  278.                                         case 3:
  279.                                                 clock_shi=clock_shi-1;                                                           
  280.                                                 if(clock_shi==-1)     
  281.                                                         clock_shi=23;
  282.                                                 break;        
  283.                                         case 4:
  284.                                                 clock_day=clock_day-1;                                                           
  285.                                                 if(clock_day==0&&((clock_month==4)||(clock_month==6)||(clock_month==9)||(clock_month==11)))     
  286.                                                         clock_day=30;
  287.                                                 if(clock_day==0&&(clock_month==2))
  288.                                                         clock_day=29;
  289.                                                 if(clock_day==0&&((clock_month==1)||(clock_month==3)||(clock_month==5)||(clock_month==7)||(clock_month==8)||(clock_month==10)||(clock_month==12)))
  290.                                                         clock_day=31;
  291.                                                 break;
  292.                                         case 5:
  293.                                                 clock_month=clock_month-1;                                                         
  294.                                                 if(clock_month==0)     
  295.                                                         clock_month=12;
  296.                                                 break;
  297.                                         default:        break;
  298.                                 }
  299.                         }
  300.                 }                        
  301.                 while(Down==0);                           
  302.         }
  303. }

  304. void keydone()        //按键功能执行
  305. {  
  306.         if(flag1==0)
  307.         {
  308.                 uchar Second;
  309.                 if(flag==0)    //关闭时钟,停止计时
  310.             {
  311.                         DS1302_SetProtect(0); //写入允许
  312.                 temp=Read1302(0x81);  //将秒地址的数据读出来
  313.                 Write1302(0x80,temp|0x80); //停止计时,秒寄存器最高位为1时停止计时
  314.                     DS1302_SetProtect(1); //禁止写入
  315.                 flag=1;
  316.             }
  317.             Setkey();                //扫描模式切换按键
  318.                 switch(count)
  319.                 {
  320.                         case 1:           //count=1,调整秒
  321.                                 do                                                
  322.                                 {
  323.                             outkey();                           //扫描跳出按钮
  324.                                         Upkey();                //扫描加按钮
  325.                                         Downkey();              //扫描减按钮
  326.                                         if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
  327.                                         {
  328.                                                 DS1302_SetProtect(0);         //写入允许
  329.                                                 DS1302_SetTime1(DS1302_SECOND,miao); //将新的时间写入
  330.                                                 DS1302_SetProtect(1);        //禁止写入
  331.                                                 up_flag=0;
  332.                                                 down_flag=0;
  333.                                         }
  334.                                         hide_sec++;          //位闪计数
  335.                                         if(hide_sec>3)
  336.                                                 hide_sec=0;
  337.                             show_time();    //液晶显示数据
  338.                                 }
  339.                                 while(count==2);   //count=2,调整分
  340.                                 break;  
  341.                         case 2:
  342.                                 do                                                
  343.                                 {
  344.                                         hide_sec=0;
  345.                                         outkey();
  346.                                         Upkey();
  347.                                         Downkey();
  348.                                         if(up_flag==1||down_flag==1)
  349.                                         {
  350.                                                 DS1302_SetProtect(0);         //写入允许
  351.                                                 DS1302_SetTime(DS1302_MINUTE,fen);
  352.                                                 DS1302_SetProtect(1);        //禁止写入
  353.                                                 up_flag=0;
  354.                                                 down_flag=0;
  355.                                         }
  356.                                         hide_min++;
  357.                                         if(hide_min>3)
  358.                                                 hide_min=0;
  359.                             show_time();
  360.                                 }
  361.                                 while(count==3);          //count=3,调整小时
  362.                                 break;
  363.                         case 3:
  364.                                 do                                                
  365.                                 {
  366.                                         hide_min=0;
  367.                                         outkey();
  368.                                         Upkey();
  369.                                         Downkey();
  370.                                         if(up_flag==1||down_flag==1)
  371.                                         {
  372.                                                 DS1302_SetProtect(0);         //写入允许
  373.                                                 DS1302_SetTime(DS1302_HOUR,shi);
  374.                                                 DS1302_SetProtect(1);        //禁止写入
  375.                                                 up_flag=0;
  376.                                                 down_flag=0;
  377.                                         }
  378.                                         hide_hour++;
  379.                                         if(hide_hour>3)
  380.                                                 hide_hour=0;
  381.                             show_time();  
  382.                                 }
  383.                                 while(count==4);
  384.                                 break;
  385.                         case 4:
  386.                                   do                                                //count=5,调整日
  387.                                 {
  388.                                         hide_week=0;
  389.                                         outkey();
  390.                                         Upkey();
  391.                                         Downkey();
  392.                                         if(up_flag==1||down_flag==1)
  393.                                         {
  394.                                                 DS1302_SetProtect(0);         //写入允许
  395.                                                 DS1302_SetTime(DS1302_DAY,day);
  396.                                                 DS1302_SetProtect(1);        //写入禁止
  397.                                                 up_flag=0;
  398.                                                 down_flag=0;
  399.                                         }
  400.                                         hide_day++;
  401.                                         if(hide_day>3)
  402.                                                 hide_day=0;
  403.                             show_time();
  404.                                 }
  405.                                 while(count==6);        //count=6,调整月
  406.                                 break;
  407.                         case 5:
  408.                                 do                                                
  409.                                 {
  410.                             hide_day=0;
  411.                                         outkey();
  412.                                         Upkey();
  413.                                         Downkey();
  414.                                         if(up_flag==1||down_flag==1)
  415.                                         {
  416.                                                 DS1302_SetProtect(0);         //写入允许
  417.                                                 DS1302_SetTime(DS1302_MONTH,month);
  418.                                                 DS1302_SetProtect(1);        //禁止写入
  419.                                                 up_flag=0;
  420.                                                 down_flag=0;
  421.                                         }
  422.                                         hide_month++;
  423.                                         if(hide_month>3)
  424.                                                 hide_month=0;
  425.                             show_time();
  426.                                 }
  427.                                 while(count==7);  //count=7,调整年
  428.                                 break;
  429.                    case 6:
  430.                                 do                                                
  431.                                 {
  432.                             hide_month=0;
  433.                                         outkey();
  434.                                         Upkey();
  435.                                         Downkey();
  436.                                         if(up_flag==1||down_flag==1)
  437.                                         {
  438.                                                 DS1302_SetProtect(0);         //写入允许
  439.                                                 DS1302_SetTime(DS1302_YEAR,year);
  440.                                                 DS1302_SetProtect(1);
  441.                                                 up_flag=0;
  442.                                                 down_flag=0;
  443.                                         }
  444.                                         hide_year++;
  445.                                         if(hide_year>3)
  446.                                                 hide_year=0;
  447.                             show_time();
  448.                                 }
  449.                                 while(count==8);   //count8, 跳出调整模式,
  450.                                 break;
  451.                    case 7:
  452.                                 count=0;hide_year=0;  //返回默认显示状态
  453.                             DS1302_SetProtect(0);         //写入允许
  454.                                 Second=Read1302(0x81);        //读取秒地址的最新数据
  455.                             Write1302(0x80,Second&0x7f);   //开始计时
  456.                             DS1302_SetProtect(1);         //写入禁止
  457.                                 done=0;
  458.                                 flag1=0;flag2=0;
  459.                                 break;
  460.                   default:  break;
  461.                 }
  462.         }
  463.         else
  464.         {
  465.             Setkey();                //扫描模式切换按键
  466.                 switch(count1)
  467.                 {
  468.                         case 1:           //count=1,调整秒
  469.                                 do                                                
  470.                                 {
  471.                                 outkey();                   //扫描跳出按钮
  472.                                         Upkey();           //扫描加按钮
  473.                                         Downkey();         //扫描减按钮
  474.                                         hi_sec++;          //位闪计数
  475.                                         if(hi_sec>3)
  476.                                                 hi_sec=0;
  477.                             clock_dispaly();  //液晶显示数据
  478.                                 }
  479.                                 while(count1==2);
  480.                                 break;  
  481.                         case 2:          //count=2,调整分
  482.                                 do                        
  483.                                 {
  484.                                         hi_sec=0;
  485.                                         outkey();
  486.                                         Upkey();
  487.                                         Downkey();
  488.                                         hi_min++;
  489.                                         if(hi_min>3)
  490.                                                 hi_min=0;
  491.                             clock_dispaly();
  492.                                 }
  493.                                 while(count==3);
  494.                                 break;
  495.                         case 3:           //count=3,调整小时
  496.                                 do                                                
  497.                                 {
  498.                                         hi_min=0;
  499.                                         outkey();
  500.                                         Upkey();
  501.                                         Downkey();
  502.                                         hi_hour++;
  503.                                         if(hi_hour>3)
  504.                                                 hi_hour=0;
  505.                             clock_dispaly();  
  506.                                 }
  507.                                 while(count==4);
  508.                                 break;
  509.                            
  510.                         case 4:                //count=4,调整日
  511.                                   do                                                
  512.                                 {
  513.                                         hi_hour=0;
  514.                                         outkey();
  515.                                         Upkey();
  516.                                         Downkey();
  517.                                         hi_day++;
  518.                                         if(hi_day>3)
  519.                                                 hi_day=0;
  520.                                 clock_dispaly();
  521.                                 }
  522.                                 while(count==5);
  523.                                 break;
  524.                         case 5:                //count=5,调整月
  525.                                 do                                                
  526.                                 {
  527.                             hi_day=0;
  528.                                         outkey();
  529.                                         Upkey();
  530.                                         Downkey();
  531.                                         hi_month++;
  532.                                         if(hi_month>3)
  533.                                                 hi_month=0;
  534.                             clock_dispaly();
  535.                                 }
  536.                                 while(count==6);
  537.                                 break;
  538.                         case 6:    //count=6,退出调整模式
  539.                                 count1=0;
  540.                                 hi_month=0;
  541.                                 flag1=0,flag2=0;
  542.                                 done=0;
  543.                                        
  544.                                 LCD12864_WriteCmd(0x01); //清屏命令
  545.                                 LCD12864_WriteCmd(0x34); //扩展模式指令,关闭显示
  546.                                 LCD12864_ClearScreen();          //清除绘图
  547.                                 gui_line(72,32,72,48);         //内部线框
  548.                                 gui_line(0,15,127,15);
  549.                                 gui_line(0,32,127,32);
  550.                                 gui_line(0,48,127,48);
  551.                                 gui_line(62,48,62,63);
  552.                                 
  553.                                 gui_line(0,0,127,0);        //四周线框
  554.                                 gui_line(0,1,0,63);
  555.                                 gui_line(0,63,127,63);
  556.                                 gui_line(127,0,127,63);

  557.                                 GUI_Put_Area(81,33,&uMod[0][0],16,14,0);        //固定显示“星”
  558.                                 GUI_Put_Area(96,33,&uMod[1][0],16,14,0);        //固定显示“期”
  559.                                 GUI_Put_Area(3,18,&uMod[2][0],16,12,0);         //固定显示“农”
  560.                                 GUI_Put_Area(19,18,&uMod[3][0],16,12,0);        //固定显示“历”

  561.                                 LCD12864_WriteCmd(0x36);        //开显示
  562.                                 LCD12864_WriteCmd(0x30);        //基本指令         
  563.                                 break;         
  564.                         default:        break;
  565.                 }
  566.         }
  567. }

  568. void Setkey()        //模式选择按键
  569. {
  570.         if(Set==0)          //时间调整模式
  571.         {
  572.             mdelay(8);
  573.                 if(Set==0)
  574.                 {
  575.                        count=count+1;         //Setkey按一次,count就加1
  576.                         done=1;                         //进入调整模式
  577.                         flag=0;        
  578.             }
  579.                 while(Set==0);
  580.         }
  581.         else if(clock_Set==0)         //闹钟设置模式
  582.         {
  583.                 mdelay(8);
  584.                 if(clock_Set==0)
  585.                 {         
  586.                         if(flag2==0)
  587.                         {
  588.                                 flag2=~flag2;
  589.                                 LCD12864_WriteCmd(0x01);        //清屏        
  590.                         }
  591.                         flag1=1;
  592.                         count1=count1+1;
  593.                         done=1;
  594.             }
  595.                 while(clock_Set==0);
  596.         }
  597.         else  ;
  598. }

  599. void clock_than(SYSTEMTIME *time , CLOCKTIME *Time)          //闹钟函数,响铃5秒
  600. {
  601.         if((Time->Sec<=time->Second)&&(Time->Sec+5>=time->Second)&&(Time->Min==time->Minute)&&(Time->Hou==time->Hour)&&(Time->tian==time->Day)&&(Time->yue==time->Month))        
  602.         {
  603.                 Beep= 0;   //响
  604.         }
  605.         else
  606.         {
  607.                 Beep= 1;  //不响
  608.         }
  609. }

  610. void init()           //初始化函数
  611. {
  612.         uchar Second;
  613.         Out=1;
  614.         Set=1;
  615.         Down=1;
  616.         Up=1;
  617.         Beep=1;
  618.         clock_Set=1;
  619.         up_flag=0;
  620.         down_flag=0;
  621.         done=0;         
  622.     flag=0;
  623.         flag1=0,flag2=0;
  624.         count=0,count1=0;
  625.         hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  626.         hi_sec=0,hi_min=0,hi_hour=0,hi_day=0,hi_month=0;
  627.         shi=0,fen=0,miao=0,week=0,day=0,year=0,month=0;
  628.         clock_shi=0,clock_fen=0,clock_miao=0,clock_month=10,clock_day=7;
  629.         
  630.         IrValue[2]=0;
  631.                
  632.         IT0=1;        //下降沿触发
  633.         EX0=1;        //打开中断0允许
  634.         EA=1;        //打开总中断
  635.         IRIN=1;        //初始化红外数据端口
  636.                   
  637.         LCD12864_Init();    //液晶初始化
  638.         DS18B20_init();                //温度传感器初始化函数
  639.         NRF24L01Int();                //无线模块初始化函数
  640.         
  641.         gui_line(72,32,72,48);         //内部线框
  642.         gui_line(0,15,127,15);
  643.         gui_line(0,32,127,32);
  644.         gui_line(0,48,127,48);
  645.         gui_line(62,48,62,63);

  646.         gui_line(0,0,127,0);        //四周线框
  647.         gui_line(0,1,0,63);
  648.         gui_line(0,63,127,63);
  649.         gui_line(127,0,127,63);

  650.         GUI_Put_Area(81,33,&uMod[0][0],16,14,0);        //固定显示“星”
  651.         GUI_Put_Area(96,33,&uMod[1][0],16,14,0);        //固定显示“期”
  652.         GUI_Put_Area(3,18,&uMod[2][0],16,12,0);         //固定显示“农”
  653.         GUI_Put_Area(19,18,&uMod[3][0],16,12,0);        //固定显示“历”

  654.         LCD12864_WriteCmd(0x32);         //绘图显示开
  655.         LCD12864_WriteCmd(0x30);         //基本指令

  656.         DS1302_SetProtect(0);         //写入允许
  657.         Second=Read1302(0x81);
  658.         Write1302(0x80,Second&0x7f);   //开始计时
  659.         DS1302_SetProtect(1);         //写入禁止

  660.         timer0_1();          //定时器初始化
  661.         //Initial_DS1302(); //时钟芯片初始化,第一次使用DS1302时可以初始化一下,以后就不用了        
  662. }

  663. void main()
  664. {
  665.         init();
  666.         while(1){        
  667.         }
  668. }

  669. void T0_time() interrupt 1           //定时器0
  670. {
  671.         uchar i;
  672.         TH0 = (65536 - 45872)/256;
  673.         TL0 = (65536 - 45872)%256;
  674.         i++;
  675.         if(i==5)        //0.25秒
  676.         {
  677.                 i=0;
  678.                 if(done==1)
  679.                 {         
  680.                         keydone();    //进入调整模式
  681.                 }
  682.                 if(done==0)
  683.                 {  
  684.                     if(flag1==0)
  685.                                 show_time();    //时间显示
  686.                           else
  687.                                 clock_();        //闹钟显示                                
  688.                         clock_than(&CurrentTime ,&clock_time);        //比较闹钟时间和实时时间         
  689.                  }
  690.                 DS18B20_get();        //得到温度
  691.                 NRF_rx();                //无线接收温度
  692.                 Setkey();                //扫描设置按键
  693.         }        
  694. }

  695. void ReadIr() interrupt 0         //外部中断0,红外数据接收
  696. {
  697.         unsigned char j,k;
  698.         unsigned int err;
  699.         uchar Second;
  700.         Time=0;                                         
  701.         DelayMs(70);

  702.         if(IRIN==0)                //确认是否真的接收到正确的信号
  703.         {                 
  704.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  705.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  706.                 侯,程序死在这里*/        
  707.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  708.                 {                        
  709.                         DelayMs(1);
  710.                         err--;
  711.                 }
  712.                 if(IRIN==1)                        //如果正确等到9ms低电平
  713.                 {
  714.                         err=500;
  715.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  716.                         {
  717.                                 DelayMs(1);
  718.                                 err--;
  719.                         }
  720.                         for(k=0;k<4;k++)                //共有4组数据
  721.                         {                                
  722.                                 for(j=0;j<8;j++)        //接收一组数据
  723.                                 {
  724.                                         err=60;               
  725.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  726.                                         {
  727.                                                 DelayMs(1);
  728.                                                 err--;
  729.                                         }
  730.                                         err=500;
  731.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  732.                                         {
  733.                                                 DelayMs(1);//0.14ms
  734.                                                 Time++;
  735.                                                 err--;
  736.                                                 if(Time>30)
  737.                                                 {
  738.                                                         EX0=1;
  739.                                                         return;
  740.                                                 }
  741.                                         }
  742.                                         IrValue[k]>>=1;         //k表示第几组数据
  743.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  744.                                         {
  745.                                                 IrValue[k]|=0x80;
  746.                                         }
  747.                                         Time=0;                //用完时间要重新赋值                                                        
  748.                                 }
  749.                         }
  750.                 }
  751.                 if(IrValue[2]!=~IrValue[3])         
  752.                 {
  753.                         return;
  754.                 }
  755.                 if((IrValue[2]==0x0c))         //按键1
  756.                 {
  757.                         done=1;                         //进入调整模式
  758.                         flag=0;
  759.                         count=count+1;         //Setkey按一次,count就加1        
  760.                 }
  761.                 if((IrValue[2]==0x18))         //按键2
  762.                 {
  763.                         if(flag2==0)
  764.                         {
  765.                                 flag2=~flag2;
  766.                                 LCD12864_WriteCmd(0x01);        
  767.                         }
  768.                         flag1=1;
  769.                         count1=count1+1;
  770.                         done=1;
  771.                 }
  772.                 if((IrValue[2]==0x15))        //按键VOL-
  773.                 {
  774.                         if(flag1==0)
  775.                         {
  776.                                 switch(count)
  777.                                 {
  778.                                         case 1:
  779.                                 DS1302_change(0x81,&miao);
  780.                                                 miao=miao-1;                                                         
  781.                                                 if(miao==-1)     
  782.                                                         miao=59;
  783.                                                 down_flag=1;        
  784.                                                 break;
  785.                                         case 2:
  786.                                     DS1302_change(0x83,&fen);
  787.                                                 fen=fen-1;                                                           
  788.                                                 if(fen==-1)     
  789.                                                         fen=59;
  790.                                                 down_flag=1;        
  791.                                                 break;
  792.                                         case 3:
  793.                                     DS1302_change(0x85,&shi);
  794.                                                 shi=shi-1;                                                           
  795.                                                 if(shi==-1)     
  796.                                                         shi=23;
  797.                                                 down_flag=1;        
  798.                                                 break;
  799.                                        
  800.                                         case 4:
  801.                                     DS1302_change(0x87,&day);
  802.                                                 DS1302_change(0x89,&month);
  803.                                                 day=day-1;                                                           
  804.                                                 if(day==0&&((month==4)||(month==6)||(month==9)||(month==11)))     
  805.                                                         day=30;
  806.                                                 if(day==0&&(month==2))
  807.                                                         day=29;
  808.                                                 if(day==0&&((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)))
  809.                                                         day=31;
  810.                                                 down_flag=1;        
  811.                                                 break;
  812.                                         case 5:
  813.                                     DS1302_change(0x89,&month);
  814.                                                 month=month-1;                                                         
  815.                                                 if(month==0)     
  816.                                                         month=12;
  817.                                                 down_flag=1;
  818.                                                 break;
  819.                                         case 6:
  820.                                     DS1302_change(0x8d,&year);
  821.                                                 year=year-1;                                                         
  822.                                                 if(year==-1)     
  823.                                                         year=99;
  824.                                                 down_flag=1;        
  825.                                                 break;
  826.                                         default:        break;
  827.                                 }
  828.                         }
  829.                         else
  830.                         {
  831.                                 switch(count1)
  832.                                 {
  833.                                         case 1:
  834.                                                 clock_miao=clock_miao-1;                                                         
  835.                                                 if(clock_miao==-1)     
  836.                                                         clock_miao=59;        
  837.                                                 break;
  838.                                         case 2:
  839.                                                 clock_fen=clock_fen-1;                                                           
  840.                                                 if(clock_fen==-1)     
  841.                                                         clock_fen=59;
  842.                                                 break;
  843.                                         case 3:
  844.                                                 clock_shi=clock_shi-1;                                                           
  845.                                                 if(clock_shi==-1)     
  846.                                                         clock_shi=23;
  847.                                                 break;        
  848.                                         case 4:
  849.                                                 clock_day=clock_day-1;                                                           
  850.                                                 if(clock_day==0&&((clock_month==4)||(clock_month==6)||(clock_month==9)||(clock_month==11)))     
  851.                                                         clock_day=30;
  852.                                                 if(clock_day==0&&(clock_month==2))
  853.                                                         clock_day=29;
  854.                                                 if(clock_day==0&&((clock_month==1)||(clock_month==3)||(clock_month==5)||(clock_month==7)||(clock_month==8)||(clock_month==10)||(clock_month==12)))
  855.                                                         clock_day=31;
  856.                                                 break;
  857.                                         case 5:
  858.                                                 clock_month=clock_month-1;                                                         
  859.                                                 if(clock_month==0)     
  860.                                                         clock_month=12;
  861.                                                 break;
  862.                                         default:        break;
  863.                                 }
  864.                         }
  865.                 }
  866.                 if((IrValue[2]==0x09))           //按键VOL+
  867.                 {
  868.                    if(flag1==0)
  869.                         {           
  870.                                 switch(count)
  871.                                 {
  872.                                         case 1:
  873.                                 DS1302_change(0x81,&miao);
  874.                                                 miao=miao+1;                                                         
  875.                                                 if(miao>=60)     
  876.                                                         miao=0;
  877.                                                 down_flag=1;        
  878.                                                 break;
  879.                                         case 2:
  880.                                     DS1302_change(0x83,&fen);
  881.                                                 fen=fen+1;                                                           
  882.                                                 if(fen>=60)     
  883.                                                         fen=0;
  884.                                                 down_flag=1;        
  885.                                                 break;
  886.                                         case 3:
  887.                                     DS1302_change(0x85,&shi);
  888.                                                 shi=shi+1;                                                           
  889.                                                 if(shi>=24)     
  890.                                                         shi=0;
  891.                                                 down_flag=1;        
  892.                                                 break;
  893.                                 
  894.                                         case 4:
  895.                                     DS1302_change(0x87,&day);
  896.                                                 DS1302_change(0x89,&month);
  897. ……………………

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

所有资料51hei提供下载:
电子万年历.7z (167.33 KB, 下载次数: 23)


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

使用道具 举报

沙发
ID:367948 发表于 2019-2-27 11:17 | 只看该作者
感谢楼主,学习中
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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