基於51單片機的萬年曆(演算法實現)

来源:http://www.cnblogs.com/yllinux/archive/2017/06/08/6959768.html
-Advertisement-
Play Games

基於51單片機的萬年曆,用到了單片機獨立鍵盤、數位管、LED燈模塊實現。 想要簡單還是DS1302好用。 -- -- -- 參考: http://www.cnblogs.com/LXSYD-C/p/6364888.html 如有錯誤還請指出,如有侵權還請告知,如需轉載請註明出處! 本人博客:http ...


基於51單片機的萬年曆,用到了單片機獨立鍵盤、數位管、LED燈模塊實現。

想要簡單還是DS1302好用。

  1 /**************************************************
  2 
  3 作者:糹彖氵戔   博客:http://www.cnblogs.com/yllinux/
  4   
  5 時間:2017年6月7日
  6     
  7 目標:利用單片機獨立鍵盤、數位管、LED燈模塊實現萬年曆(演算法實現)
  8       
  9 ***************************************************/
 10 #include <reg52.h>
 11 #define uchar unsigned char
 12 #define uint unsigned int
 13 
 14 uchar a[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80 };  //字形碼表0~9和.
 15 uchar b[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff };  //數位管位碼表1~8和0
 16 uchar c[] = { 0x3f,0xf3,0xcf };
 17 uint year = 2100;
 18 uchar month = 2, day = 14;
 19 uchar hour = 8, minute = 40, second = 0;
 20 uchar count;  //時鐘計數
 21 uchar n = 1;  //年月日調位指示
 22 uchar j = 1;  //時分秒調位指示
 23 
 24 sbit Key1 = P3 ^ 0; //計時停止
 25 sbit Key2 = P3 ^ 1;    //調位
 26 sbit Key3 = P3 ^ 2;    //加一    
 27 sbit Key4 = P3 ^ 3; //切換
 28 sbit LED1 = P1 ^ 0;  //可刪此燈,有衝突
 29 sbit we   = P2 ^ 7;
 30 sbit du   = P2 ^ 6;
 31 
 32 void Delayms(uint z)
 33 {
 34     uint x, y;
 35     for (x = 0; x < z; x++)
 36         for (y = 0; y < 114; y++);
 37 }
 38 
 39 //時分秒顯示函數
 40 void Dispaly1(uchar hour, uchar minute, uchar second)
 41 {
 42     //數位管1
 43     P0 = b[8];
 44     we = 1;
 45     we = 0;
 46     P0 = a[hour / 10];
 47     du = 1;
 48     du = 0;
 49     P0 = b[0];
 50     we = 1;
 51     we = 0;
 52     Delayms(1);
 53     //數位管2    
 54     P0 = b[8];
 55     we = 1;
 56     we = 0;
 57     P0 = a[hour % 10];
 58     du = 1;
 59     du = 0;
 60     P0 = b[1];
 61     we = 1;
 62     we = 0;
 63     Delayms(1);
 64     //數位管2小數點
 65     P0 = b[8];
 66     we = 1;
 67     we = 0;
 68     P0 = a[10];
 69     du = 1;
 70     du = 0;
 71     P0 = b[1];
 72     we = 1;
 73     we = 0;
 74     Delayms(1);
 75     //數位管3
 76     P0 = b[8];
 77     we = 1;
 78     we = 0;
 79     P0 = a[minute / 10];
 80     du = 1;
 81     du = 0;
 82     P0 = b[2];
 83     we = 1;
 84     we = 0;
 85     Delayms(1);
 86     //數位管4    
 87     P0 = b[8];
 88     we = 1;
 89     we = 0;
 90     P0 = a[minute % 10];
 91     du = 1;
 92     du = 0;
 93     P0 = b[3];
 94     we = 1;
 95     we = 0;
 96     Delayms(1);
 97     //數位管4小數點
 98     P0 = b[8];
 99     we = 1;
100     we = 0;
101     P0 = a[10];
102     du = 1;
103     du = 0;
104     P0 = b[3];
105     we = 1;
106     we = 0;
107     Delayms(1);
108     //數位管5    
109     P0 = b[8];
110     we = 1;
111     we = 0;
112     P0 = a[second / 10];
113     du = 1;
114     du = 0;
115     P0 = b[4];
116     we = 1;
117     we = 0;
118     Delayms(1);
119     //數位管6
120     P0 = b[8];
121     we = 1;
122     we = 0;
123     P0 = a[second % 10];
124     du = 1;
125     du = 0;
126     P0 = b[5];
127     we = 1;
128     we = 0;
129     Delayms(1);
130 }
131 
132 
133 //年月日顯示函數
134 void Dispaly2(uint year, uchar month, uchar day)
135 {
136     //數位管1
137     P0 = b[8];
138     we = 1;
139     we = 0;
140     P0 = a[year / 1000];
141     du = 1;
142     du = 0;
143     P0 = b[0];
144     we = 1;
145     we = 0;
146     Delayms(1);
147     
148     //數位管2    
149     P0 = b[8];
150     we = 1;
151     we = 0;
152     P0 = a[(year % 1000) / 100];
153     du = 1;
154     du = 0;
155     P0 = b[1];
156     we = 1;
157     we = 0;
158     Delayms(1);
159     
160     //數位管3
161     P0 = b[8];
162     we = 1;
163     we = 0;
164     P0 = a[(year % 100) / 10];
165     du = 1;
166     du = 0;
167     P0 = b[2];
168     we = 1;
169     we = 0;
170     Delayms(1);
171     
172     //數位管4
173     P0 = b[8];
174     we = 1;
175     we = 0;
176     P0 = a[year % 10];
177     du = 1;
178     du = 0;
179     P0 = b[3];
180     we = 1;
181     we = 0;
182     Delayms(1);
183     
184     //數位管4小數點
185     P0 = b[8];
186     we = 1;
187     we = 0;
188     P0 = a[10];
189     du = 1;
190     du = 0;
191     P0 = b[3];
192     we = 1;
193     we = 0;
194     Delayms(1);
195     
196     //數位管5
197     P0 = b[8];
198     we = 1;
199     we = 0;
200     P0 = a[month / 10];
201     du = 1;
202     du = 0;
203     P0 = b[4];
204     we = 1;
205     we = 0;
206     Delayms(1);
207     
208     //數位管6    
209     P0 = b[8];
210     we = 1;
211     we = 0;
212     P0 = a[month % 10];
213     du = 1;
214     du = 0;
215     P0 = b[5];
216     we = 1;
217     we = 0;
218     Delayms(1);
219     //數位管6小數點
220     P0 = b[8];
221     we = 1;
222     we = 0;
223     P0 = a[10];
224     du = 1;
225     du = 0;
226     P0 = b[5];
227     we = 1;
228     we = 0;
229     Delayms(1);
230     //數位管7
231     P0 = b[8];
232     we = 1;
233     we = 0;
234     P0 = a[day / 10];
235     du = 1;
236     du = 0;
237     P0 = b[6];
238     we = 1;
239     we = 0;
240     Delayms(1);
241     //數位管8
242     P0 = b[8];
243     we = 1;
244     we = 0;
245     P0 = a[day % 10];
246     du = 1;
247     du = 0;
248     P0 = b[7];
249     we = 1;
250     we = 0;
251     Delayms(1);
252 }
253 
254 void Keyscan1()
255 {
256     static    uchar i = 0;
257     if (Key1 == 0)
258     {
259         Delayms(5); //消抖    
260         if (Key1 == 0)
261             while (!Key1); //等待按鍵彈起
262             i++;
263     }
264     if (i % 2 == 1)
265     {
266         LED1 = 0;
267         TR0 = 0;
268     }
269     if (i % 2 == 0)
270     {
271         LED1 = 1;
272         TR0 = 1;
273     }
274     if (Key2 == 0)
275     {
276         Delayms(5);
277         if (Key2 == 0)
278             while (!Key2);
279             j++;
280             if (j == 3)
281                 j = 0;
282     }
283     if (j % 3 == 1)
284     {
285         if (Key3 == 0)
286         {
287             Delayms(5);
288             if (Key3 == 0)
289                 while (!Key3);
290                 second++;
291                 if (second == 60)
292                     second = 0;
293         }
294     }
295     if (j % 3 == 2)
296     {
297         if (Key3 == 0)
298         {
299             Delayms(5);
300             if (Key3 == 0)
301                 while (!Key3);
302                 minute++;
303                 if (minute == 60)
304                     minute = 0;
305         }
306     }
307     if (j % 3 == 0)
308     {
309         if (Key3 == 0)
310         {
311             Delayms(5);
312             if (Key3 == 0)
313                 while (!Key3);
314                 hour++;
315                 if (hour == 24)
316                     hour = 0;
317         }
318     }
319 }
320 
321 void Keyscan2()
322 {
323     static    uchar m = 0;
324     if (Key1 == 0)
325     {
326         Delayms(5);
327         if (Key1 == 0)
328             while (!Key3);
329             m++;
330             if (m == 3)
331                 m = 0;
332     }
333     if (m % 2 == 1)
334     {
335         LED1 = 0;
336         TR0 = 0;
337     }
338     if (m % 2 == 0)
339     {
340         LED1 = 1;
341         TR0 = 1;
342     }
343     if (Key2 == 0)
344     {
345         Delayms(5);
346         if (Key2 == 0)
347             while (!Key2);
348             n++;
349     }
350     if (n % 3 == 1)
351     {
352         if (Key3 == 0)
353         {
354             Delayms(5);
355             if (Key3 == 0)
356                 while (!Key3);
357                 day++;
358                 if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))  //是閏年
359                 {
360                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)
361                     {
362                         if (day == 32)
363                         {
364                             day = 0;
365                         }
366                     }
367                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )
368                     {
369                         if (day == 31)
370                         {
371                             day = 0;
372                         }
373                     }
374                     if (month == 2)
375                     {
376                         if (day == 29)
377                         {
378                             day = 0;
379                         }
380                     }
381                 }                
382                 else    //不是閏年
383                 {
384                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)
385                     {
386                         if (day == 32)
387                         {
388                             day = 0;
389                         }
390                     }
391                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )
392                     {
393                         if (day == 31)
394                         {
395                             day = 0;
396                         }
397                     }
398                     if (month == 2)
399                     {
400                         if (day == 30)
401                         {
402                             day = 0;
403                         }
404                     }
405                 }
406                 
407         }
408     }
409     if (n % 3 == 2)
410     {
411         if (Key3 == 0)
412         {
413             Delayms(5);
414             if (Key3 == 0)
415                 while (!Key3);
416                 month++;
417                 if (month == 12)
418                     month = 0;
419         }
420     }
421     if (n % 3 == 0)
422     {
423         if (Key3 == 0)
424         {
425             Delayms(5);
426             if (Key3 == 0)
427                 while (!Key3);
428                 year++;
429                 if (year == 99)
430                     year = 0;
431         }
432     }
433     
434 }
435 
436 void main()
437 {
438     TMOD = 0x01;
439     TH0  = 0x4c;
440     //TH0 = (65536 - 10000) / 256;
441     TL0  = 0x00;
442     //TL0 = (65536 - 10000) % 256;
443     EA = 1;
444     ET0 = 1;
445     TR0 = 1;
446     while (1)
447     {
448         static    uchar h = 0;
449         if (Key4 == 0)
450         {
451             Delayms(5);
452             if (Key4 == 0)
453                 while (!Key4);
454                 h++;
455         }
456         if (h % 2 == 1)  //按Key4奇次數顯示年月日
457         {
458             P1 = c[n % 3];  //年月日調位判斷燈
459             Dispaly2(year, month, day);
460             Keyscan2();
461         }
462         if (h % 2 == 0)  //按Key4偶次數顯示時分秒
463         {
464             P1 = c[j % 3];  //時分秒調位判斷燈
465             Dispaly1(hour, minute, second);
466             Keyscan1();
467         }
468     }
469 }
470 
471 void time0_int(void) interrupt 1
472 {
473     //TH0 = (65536 - 10000) / 256;
474     //TL0 = (65536 - 10000) % 256;
475     TH0  = 0x4c;    //公式:定時時間t = (2^16 - T0初值) * 振蕩周期 * 12         (振蕩周期 * 12 即機器周期)
476     TL0  = 0x00;    //T0 = 2^16 - t * 11059200 / 12         (此定時時間為 50ms, T1 = 19456 = 0x4c00)
477     count++;
478     if (count == 20)
479     {
480         count = 0;
481         second++;
482         if (second == 60)
483         {
484             second = 0;
485             minute++;
486             if (minute == 60)
487             {
488                 minute = 0;
489                 hour++;
490                 if (hour == 24)
491                 {
492                     hour = 0;
493                     day++;
494                     if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))    //是閏年
495                     {
496                         if (month == 12 || month == 1 ||  month == 
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念 1)以銀行取款為例: 2)Java對BIO、NIO、AIO的支持: 3)BIO、NIO、AIO適用場景分析: BIO方式適用於連接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發局限於應用中,JDK1.4以前的唯一選擇,但程式直觀簡單易理解。 NIO方式適用於連接數目多且連接比 ...
  • 1、面向對象 VS 面向過程 2、面向對象的編程關註於類的設計! 2.1、一個項目或者工程不管多龐大一定是有一個一個的類構成的。 2.2、類是抽象的,好比是製造汽車的圖紙。而具體的一輛一輛的車,是根據圖紙製造的,實際上就是類的實例化 3、完成一個項目(或功能)的思路 3.1、所要完成的功能對應的類的 ...
  • 前言 使用lucene創建索引時如果指定瞭解析器,則需要讀寫都使用這個解析器,目前我發現也就是在處理中文這塊比較麻煩,像你在使用solr時如果配置了ik分詞,則需要把index清空重新創建才能繼續搜索。 本篇引用lucene-6.4.0和4.x的幾個關鍵類會有不同的地方。 創建索引 讀取索引 ...
  • 註意:轉載自併發編程網 – ifeve.com本文鏈接地址: Java NIO系列教程(二) Channel Channel Java NIO的通道類似流,但又有些不同: 既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。 通道可以非同步地讀寫。 通道中的數據總是要先讀到一個Buff ...
  • 註意: 轉載自併發編程網 – ifeve.com本文鏈接地址: Java NIO系列教程(一) Java NIO 概述 JAVA-1NIO概述 Java NIO 由以下幾個核心部分組成: Channels Buffers Selectors 雖然Java NIO 中除此之外還有很多類和組件,但在我看 ...
  • idea啟動TOMCAT html 亂碼,在運行/調試 配置對話框的Startup/Connection面板中,勾選Pass environment variables.並添加一個environment variable,Name填 JAVA_TOOL_OPTIONS, Value填 -Dfile.... ...
  • 作業:購物商城 商品展示,價格 買,加入購物車 付款,錢不夠 流程圖如下: 代碼共有4個文件,如下: 用戶文件: 商品文件: 購物車文件: 錢包文件: 代碼如下: 上述代碼運行流程如下: (1)展示商品信息; (2)用戶登錄驗證; (3)用戶輸入想購買產品及數量,輸入quit退出購物; (4)添加到 ...
  • 實際項目中pom.xml依賴寫法: Maven 安裝 JAR 包的命令是: 例如我的這個spring-context-support-3.1.0.RELEASE.jar 文件放在了"D:\mvn\"中 則命令為(在cmd中執行): mvn install:install-file -Dfile=D: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...