找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11535|回复: 7
收起左侧

51单片机万年历仿真+程序

  [复制链接]
ID:123040 发表于 2016-5-25 09:14 | 显示全部楼层 |阅读模式
最近刚学51单片机,自己做的,还有仿真图,

0.png 0.png

  1. #include<reg52.h>
  2. #include "ds1302.h"
  3. #include "main.h"
  4. bit readtime_f;                                                //定义读时间标志
  5. bit key_f = 0;
  6. bit readtemp_f = 0;key_fun_f = 0;
  7. sbit ADJTIME = P1^3;                                 //校准时间
  8. sbit SETALARM = P1^4;                                  //设置闹钟
  9. unsigned char key_value,key_select,key_fun = 0;
  10. unsigned int key_count = 0;
  11. SYSTEMTIME timer,timer1;

  12. void timer0_init()                                //T0初始化
  13. {
  14.         TMOD = 0x01;                                  //使用模式1,16位定时器
  15.         TH0 = 0X3C;
  16.         TL0 = 0XB0;
  17.         EA = 1;                                                  //总中断打开
  18.         ET0 = 1;                                           //定时器中断打开
  19.         TR0 = 1;                                                //定时器开关打开
  20. }

  21. void timer0_isr() interrupt 1
  22. {
  23.         static unsigned char counter = 0,counter1 = 0;
  24.         TH0 = 0X3C;
  25.         TL0 = 0XB0;
  26.         counter ++;
  27.         key_f = 1;
  28.         if(counter ==10)                                                 //500ms
  29.         {
  30.                 counter = 0;
  31.                 readtime_f = 1;                                           //读时间标志位置1
  32.                 counter1 ++;
  33.                 if(counter1 ==2)                                        //5s读一次温度值
  34.                 {
  35.                         counter1 = 0;
  36.                         readtemp_f = 1;                                                 //读温度标志位置1
  37.                 }
  38.         }
  39. }

  40. void main()
  41. {
  42.         unsigned char readtemp;
  43.         lcd_initial();
  44.         timer0_init();
  45.         ds1302_init();
  46.         while(1)                                                                        //主循环
  47.         {
  48.                 if(readtemp_f&&!key_fun_f)//读取温度
  49.                 {
  50.                         readtemp_f = 0;
  51.                         readtemp = read_temperature();
  52.                         LCD_Write_Char(13,1,readtemp/10+'0');  //显示温度值
  53.                         LCD_Write_Char(14,1,readtemp%10+'0');
  54.                 }
  55.                 if(readtime_f&&!key_fun_f)
  56.                 {
  57.                         readtime_f = 0;
  58.                         Ds1302_Read_Time(&timer);
  59.                         timer_alarm(&timer,&timer1);
  60.                         LCD_Write_Char(3,1,timer.Hour/10 + '0');
  61.                         LCD_Write_Char(4,1,timer.Hour%10 + '0');
  62.                         LCD_Write_Char(6,1,timer.Minute/10 + '0');//显示秒
  63.                         LCD_Write_Char(7,1,timer.Minute%10 + '0');
  64.                         LCD_Write_Char(9,1,timer.Second/10 + '0');//显示秒
  65.                         LCD_Write_Char(10,1,timer.Second%10 + '0');
  66.                         LCD_Write_Char(3,0,timer.Year/10 + '0');        //显示年
  67.                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  68.                         LCD_Write_Char(6,0,timer.Month/10 + '0');         //显示月
  69.                         LCD_Write_Char(7,0,timer.Month%10 + '0');
  70.                         LCD_Write_Char(9,0,timer.Day/10+ '0');        //显示日
  71.                         LCD_Write_Char(10,0,timer.Day%10 + '0');
  72.                         LCD_Write_Char(14,0,timer.Week%10 + '0'); //显示周
  73.                 }
  74.                 if(key_f)
  75.                 {
  76.                         key_f = 0;
  77.                         key_value = key();
  78.                
  79. /****************************加值键**************************************/
  80.                         if(key_value==0x01)
  81.                         {
  82.                                 if(key_select==0x01)//修改年
  83.                                 {
  84.                                         timer.Year ++;
  85.                                         if(timer.Year==100)
  86.                                         timer.Year = 0;
  87.                                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  88.                                         LCD_Write_Char(3,0,timer.Year/10 + '0');
  89.                                 }
  90.                                 else if(key_select==0x02)//修改月
  91.                                 {
  92.                                         timer.Month ++;
  93.                                         if(timer.Month==13)
  94.                                         timer.Month = 1;
  95.                                         LCD_Write_Char(7,0,timer.Month % 10 + '0');       
  96.                                         LCD_Write_Char(6,0,timer.Month / 10 + '0');
  97.                                 }
  98.                                 else if(key_select==0x03)//修改日
  99.                                 {
  100.                                         timer.Day ++;
  101.                                         if(timer.Day==32)
  102.                                         timer.Day = 1;
  103.                                         LCD_Write_Char(10,0,timer.Day % 10 + '0');       
  104.                                         LCD_Write_Char(9,0,timer.Day / 10 + '0');
  105.                                        
  106.                                 }                                                  
  107.                                 else if(key_select==0x04)//修改星期
  108.                                 {
  109.                                         timer.Week ++;
  110.                                         if(timer.Week==8)
  111.                                         timer.Week = 1;
  112.                                         LCD_Write_Char(14,0,timer.Week % 10 + '0');       
  113.                                         LCD_Write_Char(13,0,':');
  114.                                        
  115.                                 }
  116.                                 else if(key_select==0x05)//修改时
  117.                                 {
  118.                                         timer.Hour ++;
  119.                                         if(timer.Hour==24)
  120.                                         timer.Hour = 0;
  121.                                         LCD_Write_Char(4,1,timer.Hour % 10 + '0');       
  122.                                         LCD_Write_Char(3,1,timer.Hour / 10 + '0');
  123.                                        
  124.                                 }
  125.                                 else if(key_select==0x06)//修改分
  126.                                 {
  127.                                         timer.Minute ++;
  128.                                         if(timer.Minute==60)
  129.                                         timer.Minute = 0;
  130.                                         LCD_Write_Char(7,1,timer.Minute % 10 + '0');       
  131.                                         LCD_Write_Char(6,1,timer.Minute / 10 + '0');
  132.                                        
  133.                                 }
  134.                                 else if(key_select==0x07)//修改秒
  135.                                 {
  136.                                         timer.Second ++;
  137.                                         if(timer.Second==60)
  138.                                         timer.Second = 0;
  139.                                         LCD_Write_Char(10,1,timer.Second % 10 + '0');       
  140.                                         LCD_Write_Char(9,1,timer.Second / 10 + '0');
  141.                                    }
  142.                         }               
  143. /***************************选择键********************************************/
  144.                                 else if(key_value == 0x02)
  145.                                 {
  146.                                         key_select ++;
  147.                                         if(key_select>0x07)
  148.                                         {
  149.                                                 key_select = 0x00;
  150.                                                 WRDcomm(0x0c);
  151.                                         }
  152.                                
  153.                                 else
  154.                                 {
  155.                                         WRDcomm(0x0d);
  156.                                         switch(key_select)
  157.                                         {
  158.                                                 case 0x01:LCD_Write_Char(3,0,timer.Year/10 + '0');break;
  159.                                                 case 0x02:LCD_Write_Char(6,0,timer.Month/10 + '0');break;
  160.                                                 case 0x03:LCD_Write_Char(9,0,timer.Day/10 + '0');break;
  161.                                                 case 0x04:LCD_Write_Char(13,0,':');break;
  162.                                                 case 0x05:LCD_Write_Char(3,1,timer.Hour/10 + '0');break;
  163.                                                 case 0x06:LCD_Write_Char(6,1,timer.Minute/10 + '0');break;
  164.                                                 case 0x07:LCD_Write_Char(9,1,timer.Second/10 + '0');break;
  165.                                                 default:break;
  166.                                         }
  167.                                 }
  168.                         }
  169. /******************************减值键******************************************/
  170.                         else if(key_value==0x04)
  171.                         {
  172.                                 if(key_select==0x01)//修改年
  173.                                 {
  174.                                         timer.Year --;
  175.                                         if(timer.Year==-1)
  176.                                         timer.Year = 99;
  177.                                         LCD_Write_Char(4,0,timer.Year%10 + '0');
  178.                                         LCD_Write_Char(3,0,timer.Year/10 + '0');
  179.                                 }
  180.                                 else if(key_select==0x02)//修改月
  181.                                 {
  182.                                         timer.Month --;
  183.                                         if(timer.Month==0)
  184.                                         timer.Month = 12;
  185.                                         LCD_Write_Char(7,0,timer.Month % 10 + '0');       
  186.                                         LCD_Write_Char(6,0,timer.Month / 10 + '0');
  187.                                 }
  188.                                 else if(key_select==0x03)//修改日
  189.                                 {
  190.                                         timer.Day --;
  191.                                         if(timer.Day==0)
  192.                                         timer.Day = 31;
  193.                                         LCD_Write_Char(10,0,timer.Day % 10 + '0');       
  194.                                         LCD_Write_Char(9,0,timer.Day / 10 + '0');
  195.                                        
  196.                                 }                                                  
  197.                                 else if(key_select==0x04)//修改星期
  198.                                 {
  199.                                         timer.Week --;
  200.                                         if(timer.Week==0)
  201.                                         timer.Week = 7;
  202.                                         LCD_Write_Char(14,0,timer.Week % 10 + '0');       
  203.                                         LCD_Write_Char(13,0,':');
  204.                                        
  205.                                 }
  206.                                 else if(key_select==0x05)//修改时
  207.                                 {
  208.                                         timer.Hour --;
  209.                                         if(timer.Hour==-1)
  210.                                         timer.Hour = 23;
  211.                                         LCD_Write_Char(4,1,timer.Hour % 10 + '0');       
  212.                                         LCD_Write_Char(3,1,timer.Hour / 10 + '0');
  213.                                        
  214.                                 }
  215.                                 else if(key_select==0x06)//修改分
  216.                                 {
  217.                                         timer.Minute --;
  218.                                         if(timer.Minute==-1)
  219.                                         timer.Minute = 59;
  220.                                         LCD_Write_Char(7,1,timer.Minute % 10 + '0');       
  221.                                         LCD_Write_Char(6,1,timer.Minute / 10 + '0');
  222.                                        
  223.                                 }
  224.                                 else if(key_select==0x07)//修改秒
  225.                                 {
  226.                                         timer.Second --;
  227.                                         if(timer.Second==-1)
  228.                                         timer.Second = 59;
  229.                                         LCD_Write_Char(10,1,timer.Second % 10 + '0');       
  230.                                         LCD_Write_Char(9,1,timer.Second / 10 + '0');
  231.                                    }
  232.                         }
  233. /******************************功能键***************************************/
  234.                         else if(key_value == 0x08)
  235.                         {
  236.                                 key_fun ++ ;
  237.                                 if(key_fun == 0x01)
  238.                                 {
  239.                                         ADJTIME = 0;
  240.                                         key_fun_f = 1;
  241.                                 }
  242.                                 else if(key_fun == 0x02)
  243.                                 {
  244.                                         ADJTIME = 1;
  245.                                         key_fun_f = 0;
  246.                                         WRDcomm(0x0c);
  247.                                         key_select = 0x00;
  248.                                         Ds1302_Write_Time(ds1302_sec_add,timer.Second);
  249.                                         Ds1302_Write_Time(ds1302_min_add,timer.Minute);
  250.                                         Ds1302_Write_Time(ds1302_hr_add,timer.Hour);
  251.                                         Ds1302_Write_Time(ds1302_day_add,timer.Week);
  252.                                         Ds1302_Write_Time(ds1302_date_add,timer.Day);
  253.                                         Ds1302_Write_Time(ds1302_month_add,timer.Month);
  254.                                         Ds1302_Write_Time(ds1302_year_add,timer.Year);
  255.                                 }
  256.                                 else if(key_fun == 0x03)
  257.                                 {
  258.                                         SETALARM = 0;
  259.                                         key_fun_f = 1;
  260.                                 }
  261.                                 else if(key_fun == 0x04)
  262.                                 {
  263.                                         SETALARM = 1;                           //关闭设置闹钟指示
  264.                                         key_fun_f = 0;                                 //清键盘功能标志位
  265.                                         key_fun = 0x00;
  266.                                         WRDcomm(0x0c);                                   //关闭数字闪烁
  267.                                         timer1.Second = timer.Second;
  268.                                         timer1.Minute = timer.Minute;
  269.                                         timer1.Hour = timer.Hour;
  270.                                         timer1.Week = timer.Week;
  271.                                         timer1.Day = timer.Day;
  272.                                         timer1.Month = timer.Month;
  273.                                         timer1.Year = timer.Year;
  274.                                 }
  275.                         }
  276.                
  277.                 }

  278.         }
  279. }
复制代码


万年历.7z

38.85 KB, 下载次数: 144, 下载积分: 黑币 -5

万年历.7z

55.23 KB, 下载次数: 134, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:124123 发表于 2016-5-30 23:14 | 显示全部楼层
图在哪里
回复

使用道具 举报

ID:61840 发表于 2016-6-15 23:30 | 显示全部楼层
两个压缩包有区别那
回复

使用道具 举报

ID:148320 发表于 2016-11-16 19:20 | 显示全部楼层
两个压缩包有区别吗?
回复

使用道具 举报

ID:322483 发表于 2018-6-9 15:27 | 显示全部楼层
挖坟,谢谢楼主,哈哈找了很久
回复

使用道具 举报

ID:313328 发表于 2018-6-9 21:43 | 显示全部楼层
可以参考了
回复

使用道具 举报

ID:453005 发表于 2018-12-23 23:40 | 显示全部楼层
挺好的,有价值
回复

使用道具 举报

ID:453654 发表于 2018-12-24 17:08 | 显示全部楼层

这个在编译的时候居然显示有错误,请问知道怎末回事吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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