找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)萬年歷(含鬧鐘)思路分析及main.c內(nèi)容(只給出main.c內(nèi)容)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
/*************************************************************************************
*                   實(shí)驗(yàn):萬年歷(DS1302、LCD1602、AT24C04的綜合應(yīng)用)
* 步驟及現(xiàn)象:程序下載前,stc-isp選擇IRC頻率:12MHz,程序下載后,LCD1602顯示時(shí)間‘第一
*     行:“12:00:00     2”,第二行:"2019.01.01     0" ’。第一行最右側(cè)的2是周二
*     (有效范圍2000~2100年);第二行最右側(cè)0是關(guān)閉鬧鐘,若是1,則開啟鬧鐘,若是2,則
*     第一行顯示鬧鐘時(shí)間,而不是時(shí)鐘時(shí)間。鬧鐘開關(guān)及鬧鐘時(shí)間顯示的位選鍵是按鍵5。
*   (1)若設(shè)置時(shí)分秒(按鍵1是位選,按鍵2是加,按鍵3是減)。按按鍵1,小時(shí)的那兩位每0.5s
*      閃爍一次,表示可以對(duì)時(shí)的值按按鍵2一次加1或按按鍵3一次減1;再按按鍵1,分鐘的那兩
*      位每0.5s閃爍一次,表示可以對(duì)分的值進(jìn)行加或減;再按按鍵1,秒的那兩位每0.5s閃爍一
*      次,表示可以對(duì)秒進(jìn)行加或減。再按按鍵1或按按鍵0,退出設(shè)置模式。
*   (2)若設(shè)置年月日(按鍵0是位選,按鍵2是加,按鍵3是減)。按按鍵0,年的前兩位每0.5s閃爍
*      一次,表示可以對(duì)年前兩位的值進(jìn)行加或減;再按按鍵0,年的后兩位每0.5s閃爍一次,表示
*      可以對(duì)年后兩位的值進(jìn)行加或減;再按按鍵0,月的兩位每0.5s閃爍一次,表示可以對(duì)月的
*      值進(jìn)行加或減;再按按鍵0,日的兩位每0.5s閃爍一次,表示可以對(duì)日的值進(jìn)行加或減。再
*      按按鍵0或按按鍵1,退出設(shè)置模式。
*   (3)若設(shè)置鬧鐘(按鍵4是位選鍵,按鍵2是加,按鍵3是減),F(xiàn)象和(1)一樣。(若開啟鬧鐘
*      后,到達(dá)鬧鐘時(shí)間,鬧鐘鳴叫,而無人去關(guān)閉鬧鐘,則鬧鐘從響應(yīng)時(shí)間開始,鳴叫5s后,自
*      動(dòng)關(guān)閉,下次時(shí)間到達(dá)后仍會(huì)提醒。)鬧鐘初始化時(shí)間"12:01:00"
*************************************************************************************/
  1. #include <stc8.h>
  2. #include "ds1302.h"
  3. #include "display.h"
  4. #include "key.h"
  5. #include "settime.h"
  6. #include "timer0.h"
  7. #include "1602.h"
  8. #include "i2c.h"
  9. #include "delay.h"

  10. sbit speaker = P1^3;             // 蜂鳴器
  11. char TIMED[7];                   // 用于接收ds1302中的數(shù)據(jù),轉(zhuǎn)化為有符號(hào)類型,便于界限判定
  12. unsigned char alarm[3]={0,1,12}; // 存放鬧鐘時(shí)間(12:01:00鬧鐘初始化時(shí)間)
  13. unsigned int num2=0;             // 用于無人關(guān)鬧鐘時(shí),計(jì)數(shù),當(dāng)達(dá)到5s后,把鬧鐘響應(yīng)標(biāo)志置0
  14. unsigned char Aflag = 0;         // 鬧鐘開關(guān)及鬧鐘時(shí)間顯示標(biāo)志
  15. bit Hflag=0, Tflag=0, Sflag=0;   // Hflag閃爍標(biāo)志,Tflag鬧鐘響應(yīng)標(biāo)志,Sflag清鬧鐘響應(yīng)標(biāo)志標(biāo)志
  16. void main()
  17. {
  18.         unsigned char keys, i;
  19.         P1M1=0x00;P1M0=0x08;      // 蜂鳴器配置為強(qiáng)推挽輸出
  20.         speaker = 1;              // 關(guān)閉蜂鳴器
  21.         Ds1302Init();             // ds1302初始化         
  22.         LCD_Init();               // LCD1602初始化
  23.         Timer0Init();             // 定時(shí)器0初始化
  24.         for(i=0;i<3;i++)          // 實(shí)驗(yàn)板第一次下載或復(fù)位后,往AT24C04中寫入鬧鐘初始化時(shí)間
  25.         {
  26.                 write_24c04(0x00+i,alarm[i]);
  27.                 Delay_ms(1);
  28.         }
  29.         while(1)
  30.         {
  31.                 keys = key_scan();    // 獲取按鍵按鍵值
  32.                 for(i=0;i<3;i++)      // 工作后,讀出已存入AT24C04中的鬧鐘時(shí)間
  33.                 {
  34.                         alarm[i] = read_24c04(0x00+i);
  35.                         Delay_ms(1);
  36.                 }
  37.                 settime(keys);                  // 設(shè)置時(shí)間及鬧鐘時(shí)間函數(shù),keys=0,設(shè)置年月日,keys=1,設(shè)置時(shí)分秒,keys=4,設(shè)置鬧鐘時(shí)間
  38.                 Display();            // 工作狀態(tài)下1602顯示函數(shù)
  39.                 if(keys == 5)         // 通過按鍵5設(shè)置是否開啟鬧鐘,Aflag=1開啟,Aflag=0關(guān)閉,Aflag=2查看鬧鐘時(shí)間
  40.                 {
  41.                         Aflag++;
  42.                         if(Aflag==3)      // Aflag累加到3后,歸零
  43.                                 Aflag = 0;
  44.                 }
  45.                 if((Aflag==1)&&(TIME[0]==alarm[0])&&(TIME[1]==alarm[1])&&(TIME[2]==alarm[2]))
  46.                 {                     // 判斷是否滿足鬧鐘鳴叫條件
  47.                         Tflag = 1;        // 鬧鐘鳴叫標(biāo)志置1
  48.                         num2 = 0;         // 鳴叫計(jì)數(shù)歸零
  49.                         Sflag = 0;        // 清鬧鐘鳴叫標(biāo)志置0
  50.                 }
  51.                 if((Tflag == 1)&&(Aflag == 1))// 鳴叫需同時(shí)滿足鳴叫標(biāo)志為1、鬧鐘開啟
  52.                 {
  53.                         speaker = ~speaker;
  54.                         if(Sflag == 1)            // 判斷鳴叫時(shí)間是否到5s了
  55.                                 Tflag = 0;            // 5s后,鳴叫標(biāo)志清0
  56.                 }
  57.                 else
  58.                 {
  59.                         speaker = 0;              // 關(guān)閉蜂鳴器
  60.                         Tflag = 0;               
  61.                 }
  62.         }
  63. }
  64. void TM0_Isr() interrupt 1 using 1
  65. {
  66.         static unsigned char num1=0;                  
  67.         num1++;                      // 進(jìn)一次中斷值加1,5ms進(jìn)一次中斷
  68.         if(Tflag == 1)               // 到鬧鐘時(shí)間后,num2開始累加
  69.         {
  70.                 num2++;
  71.         }
  72.         if(100 == num1)              // 選中要調(diào)整的時(shí)間后,代表這個(gè)時(shí)間的兩位開始每0.5s閃爍一次   
  73.         {
  74.                 num1 = 0;
  75.                 Hflag = ~Hflag;          // 閃爍標(biāo)志翻轉(zhuǎn)
  76.         }
  77.         if(1000 == num2)             // 鬧鐘無人關(guān)時(shí),鳴叫5s后,自動(dòng)關(guān)閉鬧鐘,下次時(shí)間到時(shí)仍會(huì)鳴叫      
  78.         {
  79.                 num2 = 0;
  80.                 Sflag = 1;               // 清鬧鐘標(biāo)志標(biāo)志置1
  81.         }
  82. }
復(fù)制代碼

[我是在我之前發(fā)的貼子的基礎(chǔ)上,加了鬧鐘和星期,同時(shí)把調(diào)整時(shí)間選中位改成了閃爍。這個(gè)鏈接是我修改前的模板:(想挑戰(zhàn)自己的就拿這個(gè)改,看能不能改成我現(xiàn)在這個(gè)版本)ds1302用1602實(shí)現(xiàn)時(shí)間顯示及調(diào)整的單片機(jī)代碼
http://www.torrancerestoration.com/bbs/dpj-164635-1.html
(出處: 單片機(jī)論壇)

P90727-090508.jpg (3.51 MB, 下載次數(shù): 70)

效果圖.jpg

效果圖.jpg

P90727-091152.jpg (3.39 MB, 下載次數(shù): 66)

鬧鐘定的時(shí)間.jpg

鬧鐘定的時(shí)間.jpg

捕獲.PNG (6.27 KB, 下載次數(shù): 65)

用到的模塊.jpg

用到的模塊.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表