分享個(gè)基于51單片機(jī)設(shè)計(jì)的 串口通信+帶I2C存儲(chǔ)+時(shí)間+鬧鐘+按鍵+狀態(tài)機(jī)+定時(shí)中斷
矩陣 按鍵 中 隨意抽取 6個(gè)按鍵 來完成一下功能:
1) K1 ,K3,K5 分別為 秒鐘,分鐘,小時(shí)的+1功能;
2) K2 ,K4,K6 分別為 秒鐘,分鐘,小時(shí)的 -1功能;
3) K7 切換顯示 時(shí)間 和鬧鐘的;
全時(shí)鐘自動(dòng)運(yùn)行 的邏輯
全時(shí)鐘自動(dòng)運(yùn)行 代碼 邏輯(流程)分析
時(shí)鐘的原理
小時(shí) - 分鐘 - 秒鐘
分鐘由59—>0時(shí)刻+1 秒鐘由59—>0時(shí)刻 +1 每一秒加1
/*******************************************************************/
定義全局變量a_mstime=0 , 累計(jì)本代碼的總共毫秒數(shù)量(最后看這個(gè)定義)
定義全局變量 flag=0 , 讓秒鐘自動(dòng)加1的一個(gè)信號(hào)。 (最后看這個(gè)定義)
主函數(shù)
{
定義 數(shù)碼管顯示數(shù)組 00-00-00 ,長度為8;
定義 時(shí)間數(shù)組 23,55,35 (小時(shí),分鐘,秒鐘)
while(1)
{
判斷flag == 1 ;
秒鐘+1 ;(還要確保 0 – 59 之間)
判斷秒鐘 >= 60
秒鐘 = 0;( 由60變成 0 , 60出現(xiàn)的時(shí)間多長?4us左右,4us之前59出現(xiàn)了1秒了) 59(1s)—>60(4us) —>0(1秒)
分鐘 +1;(也要控制分鐘取值范圍0-59)
判斷分鐘 >= 60
分鐘 = 0;
小時(shí) +1;(控制小時(shí)取值范圍0-23)
判斷按鍵1是否按下
如果按下,去抖,等待完全松開
讓秒鐘加1;(你可以寫任何你想做的事情)
判斷按鍵2是否按下
如果按下,去抖,等待完全松開
讓分鐘加1;(你可以寫任何你想做的事情)
判斷按鍵3是否按下
如果按下,去抖,等待完全松開
讓小時(shí)加1;(你可以寫任何你想做的事情)
把時(shí)間數(shù)組[3] 拆解到 顯示數(shù)組[8]里面去;
通過函數(shù)LED7_display(a, 8); 把拆解后的時(shí)間顯示出來
}
}
子函數(shù)LED7_display(a, 8)
{
把a(bǔ)里面的8個(gè)內(nèi)容逐個(gè)的送到每個(gè)數(shù)碼管顯示,
調(diào)用8次ms_delay(2);(每個(gè)數(shù)碼管 要消耗2ms 的點(diǎn)亮?xí)r間;)
}
子函數(shù)ms_delay(毫秒數(shù)量) // 就是模仿小孩子 等人 時(shí)的 數(shù)數(shù)(動(dòng)名)
{
2個(gè)空循環(huán);
///////////////////////////
a_mstime += 毫秒數(shù)量;(把本代碼的毫秒數(shù)累計(jì)起來) 判斷a_mstime 大于等于 1000 的時(shí)刻,
flag =1 ;秒鐘加1的信號(hào) a_mstime = a_mstime-1000 ; }
-------------------------------------
秒鐘自動(dòng)+1 的邏輯
秒鐘自動(dòng)加1的 代碼 邏輯(流程)分析
定義全局變量a_mstime=0 , 累計(jì)本代碼的總共毫秒數(shù)量(最后看這個(gè)定義)
定義全局變量 flag=0 , 讓秒鐘自動(dòng)加1的一個(gè)信號(hào)。 (最后看這個(gè)定義)
主函數(shù)
{
定義 數(shù)碼管顯示數(shù)組 00-00-00 ,長度為8;
定義 時(shí)間數(shù)組 23,55,35 (小時(shí),分鐘,秒鐘)
while(1)
{
判斷flag == 1 ;
秒鐘+1 ;(還要確保 0 – 59 之間)
判斷按鍵1是否按下
如果按下,去抖,等待完全松開
讓秒鐘加1;(你可以寫任何你想做的事情)
判斷按鍵2是否按下
如果按下,去抖,等待完全松開
讓分鐘加1;(你可以寫任何你想做的事情)
判斷按鍵3是否按下
如果按下,去抖,等待完全松開
讓小時(shí)加1;(你可以寫任何你想做的事情)
把時(shí)間數(shù)組[3] 拆解到 顯示數(shù)組[8]里面去;
通過函數(shù)LED7_display(a, 8); 把拆解后的時(shí)間顯示出來
}
}
子函數(shù)LED7_display(a, 8)
{
把a(bǔ)里面的8個(gè)內(nèi)容逐個(gè)的送到每個(gè)數(shù)碼管顯示,
調(diào)用8次ms_delay(2);(每個(gè)數(shù)碼管 要消耗2ms 的點(diǎn)亮?xí)r間;)
}
子函數(shù)ms_delay(毫秒數(shù)量) // 就是模仿小孩子 等人 時(shí)的 數(shù)數(shù)(動(dòng)名)
{
2個(gè)空循環(huán);
///////////////////////////
a_mstime += 毫秒數(shù)量;(把本代碼的毫秒數(shù)累計(jì)起來) 判斷a_mstime 大于等于 1000 的時(shí)刻,
flag =1 ;秒鐘加1的信號(hào) a_mstime = a_mstime-1000 ; }
單片機(jī)源程序如下:
-
- #include <reg52.h>
- #include <type_h.h>
- #include <timer.h>
- #include <key.h>
- #include <LED_7.h>
- #include <alarm.h>
- #include <I2CROM.h>
- #include <com.h>
- void main()
- {
- uint8 key = 0;
- uint16 ms = 50 ;
- //uint8 LED7_len = 8 ; // 顯示長度 初始8 ,鬧鐘長度為5
- ms_delay(100);
- Timer0_set() ; //初始化 定時(shí)器 T0
- x24c02_init();
- read_time() ; //包含了 數(shù)據(jù)校驗(yàn)
- Com_Init() ;
- while(1)
- {
-
- maketime(b);
- Naozhong() ;
- key = Keyx_scanf(); // 此 函數(shù) 內(nèi)部已經(jīng) 做好了 去抖動(dòng) 等一系列操作
- key_do_something(key);
- // 根據(jù) 顯示指針 所指向的 對(duì)象,來確定 顯示的長度
- LED7_display(disp, 8); //數(shù)碼管顯示 耗時(shí)16ms
- Task_sendtime() ;
- ms_delay(1);
-
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
串口通信 帶I2C存儲(chǔ) 時(shí)間 鬧鐘 按鍵 狀態(tài)機(jī) 定時(shí)中斷.rar
(105.16 KB, 下載次數(shù): 119)
2018-4-10 15:28 上傳
點(diǎn)擊文件名下載附件
|