久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4270|回復: 0
打印 上一主題 下一主題
收起左側(cè)

很好用的基于51單片機的萬年歷仿真設(shè)計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:243192 發(fā)表于 2017-12-27 15:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
希望能對你們有所幫助。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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;                                  //設(shè)置鬧鐘
  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;                                                //定時器開關(guān)打開
  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)                                                                        //主循環(huán)
  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;                           //關(guān)閉設(shè)置鬧鐘指示
  264.                                         key_fun_f = 0;                                 //清鍵盤功能標志位
  265.                                         key_fun = 0x00;
  266.                                         WRDcomm(0x0c);                                   //關(guān)閉數(shù)字閃爍
  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. }
復制代碼

所有資料51hei提供下載:
萬年歷.7z (55.23 KB, 下載次數(shù): 69)



評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区在线观看 | 五月天婷婷激情 | 91精品久久久久久久久久 | 欧美成人a| 亚洲最色视频 | 一区二区三区四区电影视频在线观看 | 国产福利在线 | 精品视频在线免费观看 | 天天玩天天操天天干 | 日本精品久久久一区二区三区 | 麻豆a级片| 成人精品在线视频 | 极品国产视频 | 神马久久久久久久久久 | 欧美精品一区在线 | 国产成人一区在线 | 国产视频中文字幕在线观看 | 在线免费观看a级片 | 天天色综网 | 久久精品视频91 | 天堂一区二区三区 | 国产成人亚洲精品自产在线 | 不卡的av电影| 综合九九 | a免费观看 | 羞羞视频在线观看网站 | 久久精品一二三影院 | 免费观看av| 一区二区三区亚洲精品国 | av三级在线观看 | 国产成人久久av免费高清密臂 | 一区亚洲 | 人操人免费视频 | 日韩色视频 | 日本三级网站在线 | 日韩视频精品在线 | 精品视频一区二区三区四区 | 久久蜜桃av一区二区天堂 | 性高湖久久久久久久久3小时 | 日韩午夜影院 | 99re视频 |