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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機利用內(nèi)部定時器做的萬年歷,Proteus仿真+程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:586177 發(fā)表于 2019-12-21 13:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機利用內(nèi)部定時器做的萬年歷仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include "reg52.h"
  2. #include "LCD1602.h"
  3. #include "stdio.h"
  4. #include "math.h"
  5. typedef struct {
  6.         int year;
  7.         unsigned char month;
  8.         unsigned char day;
  9.         unsigned char hour;
  10.         unsigned char min;
  11.         unsigned char sec;
  12. } times_t;         //        定義時間參數(shù)結(jié)構(gòu)體
  13. times_t times;

  14. unsigned char strline1[16]="Date:0000-00-00";
  15. unsigned char strline0[16]="Time:00-00-00";



  16. unsigned char vTH , vTL , flagset = 0; //定時器參數(shù)
  17. //判斷年
  18. int leapyear ( int year ) //判斷傳來的year是否為閏年//
  19. {
  20.         if ( ( year % 4 == 0 ) && ( year % 100 != 0 ) || ( year % 400 == 0 ) ) {
  21.                 return 0; //是閏年返回值0
  22.         } else
  23.                 return 1; //不是閏年返回值1
  24. }

  25. //返回這個月一共有多少天
  26. int days_of_month ( int year , unsigned char month )
  27. {
  28.         //存儲平年每月的天數(shù)
  29.         const int month_days [ 12 ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
  30.         if ( 2 == month && leapyear ( year ) )
  31.                 return 29; // 如果是閏年2月,返回29天
  32.         else
  33.                 return month_days [ month - 1 ];  //正常返回
  34. }
  35. int days_of_months ( int year , unsigned char month )
  36. {
  37.         //存儲平年每月的天數(shù)
  38.         const int month_days [ 12 ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
  39.         if ( 2 == month && leapyear ( year ) )
  40.                 return 29; // 如果是閏年2月,返回29天
  41.         else
  42.                 return month_days [ month - 1 ];  //正常返回
  43. }

  44. void Delayms ( unsigned int count )        //延時函數(shù) 單位1ms
  45. {
  46.         unsigned int i , j;
  47.         for ( i = 0; i < count ; i++ )
  48.                 for ( j = 0; j < 120 ; j++ )
  49.                         ;
  50. }

  51. void DisLcdplayDate(void)
  52. {
  53.   
  54.     strline1 [ 5 ] = times.year / 1000 % 10+'0';
  55.     strline1 [ 6 ] = times.year / 100 % 10+'0';
  56.         strline1 [ 7 ] = times.year / 10 % 10+'0';
  57.         strline1 [ 8 ] = times.year % 10+'0';
  58.         strline1 [ 10 ] = times.month / 10 % 10+'0';
  59.         strline1 [ 11 ] = times.month % 10+'0';
  60.         strline1 [ 13 ] = times.day / 10 % 10+'0';
  61.         strline1 [ 14 ] = times.day % 10+'0';


  62. }

  63. void DisLcdplayTime(void)
  64. {
  65. strline0[5]         = times.hour / 10 % 10+'0';
  66. strline0[6]         = times.hour  % 10+'0';
  67. strline0[8]         = times.min / 10 % 10+'0';
  68. strline0[9]         = times.min  % 10+'0';
  69. strline0[11]         = times.sec / 10 % 10+'0';
  70. strline0[12]         = times.sec  % 10+'0';
  71. }


  72.   void displayLcd(void)
  73.   {
  74.           DisLcdplayDate();
  75.         DisLcdplayTime();
  76.           if(flagset==0)
  77.         {

  78.         LCDPrint(0,0, strline0);
  79.         LCDPrint(0,1, strline1);
  80.         }
  81.         else if(flagset==1)
  82.         {
  83.         LCDPrint(2,0,"Set Year");
  84.         LCDPrint(0,1, strline1);
  85.         }
  86.         else        if(flagset==2)
  87.         {
  88.         LCDPrint(2,0,"Set Month");
  89.         LCDPrint(0,1, strline1);
  90.         }
  91.         else        if(flagset==3)
  92.         {
  93.         LCDPrint(2,0,"Set Day");
  94.         LCDPrint(0,1, strline1);
  95.         }
  96.         else        if(flagset==4)
  97.         {
  98.         LCDPrint(2,0,"Set Hour");
  99.         LCDPrint(0,1, strline0);
  100.         }
  101.         else        if(flagset==5)
  102.         {
  103.         LCDPrint(2,0,"Set Min");
  104.         LCDPrint(0,1, strline0);
  105.         }
  106.                 else        if(flagset==6)
  107.         {
  108.         LCDPrint(2,0,"Set Second");
  109.         LCDPrint(0,1, strline0);
  110.         }
  111.   }
  112. void TimeRun ( void )         //定時器1s調(diào)用一次
  113. {
  114.         if ( times.sec < 59 ) {                //檢測秒鐘是否大于59
  115.                 times.sec++;
  116.         } else {
  117.                 times.sec = 0;
  118.                 if ( times.min < 59 ) {         //檢測分鐘是否大于59
  119.                         times.min++;
  120.                 } else {
  121.                         times.min = 0;
  122.                         if ( times.hour < 23 ) {   //檢測時大于大于23
  123.                                 times.hour++;
  124.                         } else {
  125.                                 times.hour = 0;
  126.                                 if ( times.day < days_of_month ( times.year , times.month ) ) {          //檢測天數(shù) 和年月有關(guān)
  127.                                         times.day++;
  128.                                 } else {
  129.                                         times.day = 1;
  130.                                         if ( times.month < 12 ) { //檢測月是否大于12
  131.                                                 times.month++;
  132.                                         } else {
  133.                                                 times.month = 1;
  134.                                                 times.year++;
  135.                                         }
  136.                                 }
  137.                         }

  138.                 }
  139.         }

  140. }

  141. sbit Key0 = P3 ^ 2;        //按鍵定義
  142. sbit Key1 = P3 ^ 3;          //按鍵定義
  143. sbit Key2 = P3 ^ 4;          //按鍵定義

  144.   void KeyScan()
  145.   {
  146.                   if ( Key0 == 0 ) {          //設(shè)置按鍵按下 總共5次
  147.                        DelaymsLcd(10);
  148.                                    if ( Key0 == 0 ) {
  149.                         if ( flagset < 6 )
  150.                                 flagset++;
  151.                         else
  152.                                 flagset = 0;
  153.                                 LCD_Clear();
  154.                         while ( Key0 == 0 )
  155.                                 ;
  156.                                 }
  157.                 }
  158.                 if ( Key1 == 0 ) {         //加操作
  159.                DelaymsLcd(10);
  160.                                    if ( Key1 == 0 ) {
  161.                         if ( flagset == 1 )         //年加調(diào)節(jié)
  162.                                 times.year++;
  163.                         if ( flagset == 2 ) {          //月加調(diào)節(jié)
  164.                                 if ( times.month < 12 )
  165.                                         times.month++;
  166.                                 else
  167.                                         times.month = 1;
  168.                         }
  169.                         if ( flagset == 3 ) {//天加調(diào)節(jié)
  170.                                 if ( times.day < days_of_months ( times.year , times.month ) )
  171.                                         times.day++;
  172.                                 else
  173.                                         times.day = 1;
  174.                         }
  175.                         if ( flagset == 4 ) {  //時加調(diào)節(jié)
  176.                                 if ( times.hour < 23 )
  177.                                         times.hour++;
  178.                                 else
  179.                                         times.hour = 0;
  180.                         }
  181.                         if ( flagset == 5 ) {         //分加調(diào)節(jié)
  182.                                 if ( times.min < 59 )
  183.                                         times.min++;
  184.                                 else
  185.                                         times.min = 0;
  186.                         }
  187.                          if ( flagset == 6 ) {         //分加調(diào)節(jié)
  188.                                 if ( times.sec < 59 )
  189.                                         times.sec++;
  190.                                 else
  191.                                         times.sec = 0;
  192.                         }
  193.                         while ( Key1 == 0 )
  194.                                 ;
  195.                                 }
  196.                 }
  197.                 if ( Key2 == 0 ) {        //減操作
  198.                                           DelaymsLcd(10);
  199.                                    if ( Key2 == 0 ) {
  200.                         if ( flagset == 1 ) {         //減年操作
  201.                                 if ( times.year > 0 )
  202.                                         times.year--;
  203.                         }
  204.                         if ( flagset == 2 ) {         //月減操作
  205.                                 if ( times.month > 1 )
  206.                                         times.month--;
  207.                                 else
  208.                                         times.month = 12;
  209.                         }
  210.                         if ( flagset == 3 ) {         //天減操作
  211.                                 if ( times.day > 1 )
  212.                                         times.day--;
  213.                                 else
  214.                                         times.day = days_of_months ( times.year , times.month );
  215.                         }
  216.                         if ( flagset == 4 ) { //時減操作
  217.                                 if ( times.hour > 0 )
  218.                                         times.hour--;
  219.                                 else
  220.                                         times.hour = 23;
  221.                         }
  222.                         if ( flagset == 5 ) {         //分操作
  223.                                 if ( times.min > 0 )
  224.                                         times.min--;
  225.                                 else
  226.                                         times.min = 59;
  227.                         }
  228.                                 if ( flagset ==6 ) {         //分操作
  229.                                 if ( times.sec > 0 )
  230.                                         times.sec--;
  231.                                 else
  232.                                         times.sec = 59;
  233.                         }
  234.                         while ( Key2 == 0 )
  235.                                 ;
  236.                                 }
  237.                 }
  238.   }
  239. void main ( )
  240. {
  241.         int i;
  242.         times.year = 2019; //初始化時間
  243.         times.month = 12;
  244.         times.day = 12;
  245.         times.hour = 7;
  246.         times.min = 59;
  247.         times.sec = 53;
  248.         LCD_Init();
  249.         vTH = ( 65536 - 1000 ) / 256;                           //計數(shù)寄存器高8位
  250.         vTL = ( 65536 - 1000 ) % 256;                           //計數(shù)寄存器低8位
  251.         TH0 = vTH;
  252.         TL0 = vTL;
  253.         TMOD |= 0x01;                           //工作方式為16位定時器
  254.         ET0 = 0x01;                           //允許TC0中斷
  255.         TR0 = 1;
  256.         EA = 1;
  257.         while ( 1 ) {

  258.         KeyScan();

  259.         displayLcd();         
  260.         }

  261. }



  262. void Time0 ( void )interrupt 1
  263. {
  264.         static int mil=0;

  265.         TH0=vTH;
  266.         TL0=vTL;
  267.          
  268.         if(mil<999)         //延時999ms
  269.         {
  270.                 mil++;
  271.         }
  272.         else
  273.         {
  274.                 mil=0;
  275.                 if(flagset==0) TimeRun(); //1s調(diào)用一次
  276.         }
  277. }
復制代碼

所有資料51hei提供下載:
758110408keil(1).zip (163.51 KB, 下載次數(shù): 119)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:682186 發(fā)表于 2020-1-6 15:58 | 只看該作者
樓樓,編譯并不成功,LCDPrint(0,0, strline0);這里并沒有定義
回復

使用道具 舉報

板凳
ID:675991 發(fā)表于 2020-9-29 13:38 | 只看該作者
閏年計算有誤吧?
回復

使用道具 舉報

地板
ID:870180 發(fā)表于 2021-1-5 11:23 | 只看該作者
樓主,為啥燒錄后,連接線路,lcd只顯示下面一行,還只有黑格,一點數(shù)據(jù)都沒有
回復

使用道具 舉報

5#
ID:702127 發(fā)表于 2021-1-6 14:15 | 只看該作者
閏年的返回值反了
回復

使用道具 舉報

6#
ID:586177 發(fā)表于 2021-4-26 17:43 | 只看該作者
羊羊22 發(fā)表于 2021-1-5 11:23
樓主,為啥燒錄后,連接線路,lcd只顯示下面一行,還只有黑格,一點數(shù)據(jù)都沒有

是不是你的電位器沒調(diào)好
回復

使用道具 舉報

7#
ID:586177 發(fā)表于 2021-4-26 17:45 | 只看該作者
thornthorn1 發(fā)表于 2020-1-6 16:00
LCDPrint(0,0, strline0);這里沒有定義,無法編譯成功

不應該呀,我當時上傳的時候是好使的,這個仿真圖是論壇管理員仿真截屏的圖,是好用的

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:911036 發(fā)表于 2021-4-27 06:52 來自手機 | 只看該作者
孤獨的小黑 發(fā)表于 2021-4-26 17:45
不應該呀,我當時上傳的時候是好使的,這個仿真圖是論壇管理員仿真截屏的圖,是好用的

學習,樓主強大!編譯仿真成功了 謝謝
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久亚洲 | 在线毛片网 | 欧美性高潮 | 亚洲色图在线观看 | 日韩色视频 | 亚洲一区视频在线 | 伊人网在线看 | www免费视频 | 成年女人免费v片 | 91高清在线 | 性xxxxx| 久久久日韩精品一区二区三区 | va在线| 久久精品一区 | 日韩欧美国产精品 | 精品一区精品二区 | 精品一二三区视频 | 日韩毛片 | 日本欧美在线视频 | 日日噜噜夜夜爽爽狠狠 | 99国内精品久久久久久久 | 国产精品日本一区二区在线播放 | 欧美在线观看一区二区 | 91久久久久久久久久久 | 亚洲精品久久久久久久久久久久久 | 亚洲一区二区三区视频 | 久久国产精品99久久久久久丝袜 | 天天操伊人 | 亚洲欧美日韩电影 | 欧美精品一区在线 | 精品网| 四虎影院在线观看av | 国产在线精品一区二区 | 欧美色成人| 一本一道久久a久久精品蜜桃 | 午夜天堂精品久久久久 | 亚洲精品一区在线观看 | 日韩有码一区 | 国产免费拔擦拔擦8x高清 | 精品国产免费一区二区三区演员表 | 一本久久a久久精品亚洲 |