|
/*************************************************************************************
* 實(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"
*************************************************************************************/
- #include <stc8.h>
- #include "ds1302.h"
- #include "display.h"
- #include "key.h"
- #include "settime.h"
- #include "timer0.h"
- #include "1602.h"
- #include "i2c.h"
- #include "delay.h"
- sbit speaker = P1^3; // 蜂鳴器
- char TIMED[7]; // 用于接收ds1302中的數(shù)據(jù),轉(zhuǎn)化為有符號(hào)類型,便于界限判定
- unsigned char alarm[3]={0,1,12}; // 存放鬧鐘時(shí)間(12:01:00鬧鐘初始化時(shí)間)
- unsigned int num2=0; // 用于無人關(guān)鬧鐘時(shí),計(jì)數(shù),當(dāng)達(dá)到5s后,把鬧鐘響應(yīng)標(biāo)志置0
- unsigned char Aflag = 0; // 鬧鐘開關(guān)及鬧鐘時(shí)間顯示標(biāo)志
- bit Hflag=0, Tflag=0, Sflag=0; // Hflag閃爍標(biāo)志,Tflag鬧鐘響應(yīng)標(biāo)志,Sflag清鬧鐘響應(yīng)標(biāo)志標(biāo)志
- void main()
- {
- unsigned char keys, i;
- P1M1=0x00;P1M0=0x08; // 蜂鳴器配置為強(qiáng)推挽輸出
- speaker = 1; // 關(guān)閉蜂鳴器
- Ds1302Init(); // ds1302初始化
- LCD_Init(); // LCD1602初始化
- Timer0Init(); // 定時(shí)器0初始化
- for(i=0;i<3;i++) // 實(shí)驗(yàn)板第一次下載或復(fù)位后,往AT24C04中寫入鬧鐘初始化時(shí)間
- {
- write_24c04(0x00+i,alarm[i]);
- Delay_ms(1);
- }
- while(1)
- {
- keys = key_scan(); // 獲取按鍵按鍵值
- for(i=0;i<3;i++) // 工作后,讀出已存入AT24C04中的鬧鐘時(shí)間
- {
- alarm[i] = read_24c04(0x00+i);
- Delay_ms(1);
- }
- settime(keys); // 設(shè)置時(shí)間及鬧鐘時(shí)間函數(shù),keys=0,設(shè)置年月日,keys=1,設(shè)置時(shí)分秒,keys=4,設(shè)置鬧鐘時(shí)間
- Display(); // 工作狀態(tài)下1602顯示函數(shù)
- if(keys == 5) // 通過按鍵5設(shè)置是否開啟鬧鐘,Aflag=1開啟,Aflag=0關(guān)閉,Aflag=2查看鬧鐘時(shí)間
- {
- Aflag++;
- if(Aflag==3) // Aflag累加到3后,歸零
- Aflag = 0;
- }
- if((Aflag==1)&&(TIME[0]==alarm[0])&&(TIME[1]==alarm[1])&&(TIME[2]==alarm[2]))
- { // 判斷是否滿足鬧鐘鳴叫條件
- Tflag = 1; // 鬧鐘鳴叫標(biāo)志置1
- num2 = 0; // 鳴叫計(jì)數(shù)歸零
- Sflag = 0; // 清鬧鐘鳴叫標(biāo)志置0
- }
- if((Tflag == 1)&&(Aflag == 1))// 鳴叫需同時(shí)滿足鳴叫標(biāo)志為1、鬧鐘開啟
- {
- speaker = ~speaker;
- if(Sflag == 1) // 判斷鳴叫時(shí)間是否到5s了
- Tflag = 0; // 5s后,鳴叫標(biāo)志清0
- }
- else
- {
- speaker = 0; // 關(guān)閉蜂鳴器
- Tflag = 0;
- }
- }
- }
- void TM0_Isr() interrupt 1 using 1
- {
- static unsigned char num1=0;
- num1++; // 進(jìn)一次中斷值加1,5ms進(jìn)一次中斷
- if(Tflag == 1) // 到鬧鐘時(shí)間后,num2開始累加
- {
- num2++;
- }
- if(100 == num1) // 選中要調(diào)整的時(shí)間后,代表這個(gè)時(shí)間的兩位開始每0.5s閃爍一次
- {
- num1 = 0;
- Hflag = ~Hflag; // 閃爍標(biāo)志翻轉(zhuǎn)
- }
- if(1000 == num2) // 鬧鐘無人關(guān)時(shí),鳴叫5s后,自動(dòng)關(guān)閉鬧鐘,下次時(shí)間到時(shí)仍會(huì)鳴叫
- {
- num2 = 0;
- Sflag = 1; // 清鬧鐘標(biāo)志標(biāo)志置1
- }
- }
復(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ī)論壇)
|
|