|
12864時(shí)鐘資料包(附件中可下載完整版的代碼 而且注釋非常詳細(xì)):
0.png (40.61 KB, 下載次數(shù): 40)
下載附件
2017-5-28 17:26 上傳
單片機(jī)源程序如下:
- #include "Initial.h"
- #include "ds1302.h"
- #include "12864.h"
- #include "IC.h"
- #include "HongWai.h"
- #include "Alarm.h"
- /**********************************************************
- 函數(shù)名: Initial()
- 函數(shù)功能: 用于單片機(jī)開機(jī)后的第一次初始化
- 入口參數(shù):無
- 出口參數(shù):無
- **********************************************************/
- void Initial()
- {
- Initial_12864(); //12864的初始化
- Write_12864_DS1302_Constant(); //寫12864的固定部分
-
- g_Alarm_min = Read_Add_24c02(1); //首次從24C02中讀取數(shù)據(jù) 鬧鐘的時(shí)分
- g_Alarm_hour = Read_Add_24c02(2);
- Initial_IIC(); //24c02的初始化
-
- Initial_HW_Time(); //初始化紅外的定時(shí)器
-
- g_Alarm_Flag1 = 0;
- g_Alarm_Flag2 = 0;
- g_HongWai_Work_Flag = 0;
- g_Uart_Work_Flag = 0;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
紅外遙控部分:
串口:
- /***********************************************************
- 本文件主要用來寫串口通信
- 注:統(tǒng)計(jì)5s時(shí)間的函數(shù)寫在紅外里面了
- 若調(diào)用本文件的定時(shí)器 定期寫在最后 在工程中我把
- 定時(shí)器屏蔽掉
- ***********************************************************/
- #include "Uart.h"
- #include "ds1302.h"
- #include "HongWai.h"
- #include "12864.h"
- #include "Alarm.h"
- bit g_Recieve_Flag;
- bit g_Run_Time_Uart_Flag; //串口調(diào)試的時(shí)候時(shí)間走動(dòng)的時(shí)候標(biāo)志位
- bit g_Send_Uart_Flag; //串口發(fā)送給電腦的標(biāo)志位
- uchar Recieve_Time_Data; //接受的時(shí)間數(shù)據(jù)
- uchar g_Num_Uart; //統(tǒng)計(jì)串口接收的次數(shù)
- /*********************************************************
- 函數(shù)名: Initial_Uart()
- 函數(shù)功能:初始化串口
- 入口參數(shù):無
- 出口參數(shù):無
- 備 注: 12M晶振 600bps
- *********************************************************/
- void Initial_Uart() //初始化串口
- {
- TMOD = 0x21; //串行口通信時(shí)要把定時(shí)器打開,設(shè)置定時(shí)器工作方式
- TH0 = (65536 - 45872) / 256;//裝初值
- TL0 = (65536 - 45872) % 256;
- TH1 = 0xcc; //自動(dòng)重裝波特率為600bps 12M晶振
- TL1 = 0x98;
- TR1 = 1; //打開定時(shí)器1
- ET0 = 1; //
- SM0 = 0; //設(shè)置串行口工作方式1,要與TMOD相對(duì)應(yīng)
- SM1 = 1;
- EA = 1; //打開總中斷
- ES = 1; //打開串行口中斷
- REN = 1; //允許串行口接受,當(dāng)TMOD = 0x21時(shí)要在設(shè)置好SM0,SM1后再寫
- }
- /****************************************************************
- 函數(shù)名稱: Ser_Uart()
- 函數(shù)功能: 主要用于串口的中斷服務(wù)
- 入口參數(shù): 無
- 出口參數(shù): 無
- 備 注: 進(jìn)入計(jì)算機(jī)通信中斷后設(shè)定標(biāo)志位
- *****************************************************************/
- void Ser_Uart() interrupt 4
- {
- RI = 0;
- Recieve_Time_Data = SBUF; //把接收的數(shù)據(jù)給時(shí)間標(biāo)志位
-
- if(Recieve_Time_Data == 'r')
- {
- g_Num_Uart = 0;
- }
- else
- {
- Recieve_Time_Data = Recieve_Time_Data - '0';
- g_Num_Uart ++;
- }
- g_Recieve_Flag = 1; //串口服務(wù)的標(biāo)志主要用于接收
-
- }
- /***********************************************************
- 函數(shù)名稱: Uart_Process()
- 函數(shù)功能: 串口處理
- 入口參數(shù): 無
- 出口參數(shù): 無
- 備 注: 本函數(shù)主要通過處理g_Recieve_Flag g_Send_Uart_Flag
- g_Run_Time_Uart_Flag來達(dá)到執(zhí)行相應(yīng)函數(shù)的目的
- ***********************************************************/
- void Uart_Process()
- {
- if(g_Recieve_Flag == 1) //如果出現(xiàn)標(biāo)志位置1 則進(jìn)行接收的處理
- {
- g_Recieve_Flag = 0;
- ES = 0;
- TI = 1;
-
- switch(g_Num_Uart) //通過判斷串口發(fā)送的次數(shù)來進(jìn)行相應(yīng)的處理
- {
- case 1: break;
- case 2: break;
- case 3: g_year = Recieve_Time_Data * 10; break;
- case 4: g_year = Recieve_Time_Data + g_year; break;
- case 5: g_month = Recieve_Time_Data * 10; break;
- case 6: g_month = Recieve_Time_Data + g_month; break;
- case 7: g_date = Recieve_Time_Data * 10; break;
- case 8: g_date = Recieve_Time_Data + g_date; break;
- case 9: g_hour = Recieve_Time_Data * 10; break;
- case 10: g_hour = Recieve_Time_Data + g_hour; break;
- case 11: g_min = Recieve_Time_Data * 10; break;
- case 12: g_min = Recieve_Time_Data + g_min; break;
- case 13: g_sec = Recieve_Time_Data * 10; break;
- case 14: //對(duì)數(shù)據(jù)進(jìn)行最后一次處理并退出串口中斷服務(wù)
- {
- g_sec = Recieve_Time_Data + g_sec;
- Write_sfm(6,g_sec); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,2); //顯示位置重新回到調(diào)節(jié)處
-
- g_Num_Uart = 0;
- g_Uart_Work_Flag = 0; //串口工作的標(biāo)志位清零退出串口工作
- g_Set_DS1302_Num = 0;
- Write_1302_Date (); //把數(shù)據(jù)寫進(jìn)DS1302
- Write_12864_DS1302_Constant(); //把顯示DS1302時(shí)間的固定部分寫在液晶上
- Initial_HW_Time (); //初始化紅外的定時(shí)器
- break;
- }
- default: //為了讓程序穩(wěn)定 對(duì)一些標(biāo)志位繼續(xù)處理
- {
- g_Num_Uart = 0;
- g_Uart_Work_Flag = 0; //串口工作的標(biāo)志位清零退出串口工作
- g_Set_DS1302_Num = 0;
- Write_1302_Date (); //把數(shù)據(jù)寫進(jìn)DS1302
- Write_12864_DS1302_Constant(); //把顯示DS1302時(shí)間的固定部分寫在液晶上
- Initial_HW_Time (); //初始化紅外的定時(shí)器
- }
-
- }
-
- if(g_Num_Uart >= 15) //增加程序的穩(wěn)定性
- {
- g_Num_Uart = 0;
- }
- while(!TI);
- TI = 0;
- ES = 1;
- }
-
- if(g_Send_Uart_Flag == 1) //進(jìn)行發(fā)送給電腦數(shù)據(jù)的處理 發(fā)送后DS1302便會(huì)更改
- {
- g_Send_Uart_Flag = 0;
- ES = 0;
- TI = 1;
- printf("\n\n\n 現(xiàn)在時(shí)間是\n");
- printf("\n 20%c%c年%c%c月%c%c日 %c%c時(shí)%c%c分%c%c秒\n",
- g_year / 10 + '0', g_year % 10 + '0',
- g_month / 10 + '0', g_month % 10 + '0',
- g_date / 10 + '0', g_date % 10 + '0',
- g_hour / 10 + '0', g_hour % 10 + '0',
- g_min / 10 + '0', g_min % 10 + '0',
- g_sec / 10 + '0', g_sec % 10 + '0');
-
- while(!TI);
- TI = 0;
- ES = 1;
- }
-
- if(g_Run_Time_Uart_Flag == 1) //到達(dá)一秒的時(shí)間對(duì)DS1302的時(shí)間進(jìn)行讀取更新
- {
- g_Run_Time_Uart_Flag = 0;
- Read_All_DS1302_Date(); //讀取DS1302的所有數(shù)據(jù)
- Display_DS1302_Time(); //把讀取的數(shù)據(jù)顯示在液晶上
- }
- }
- /*******************************************************
- 函數(shù)名: T0_Time (void) interrupt 1 using 1
- 函數(shù)功能: 定時(shí)器0的中斷處理
- 入口參數(shù): 無
- 出口參數(shù): 無
- void T0_Time (void) interrupt 1 using 1
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼- /*******************************************************
- 文件說明:本文件主要用來寫DS1302與鬧鈴相應(yīng)
- 的按鍵按下之后對(duì)相應(yīng)的數(shù)值進(jìn)行處理的函數(shù)
- ********************************************************/
- #include "Control.h"
- #include "Delay.h"
- #include "ds1302.h"
- #include "12864.h"
- #include "IC.h"
- #include "Alarm.h"
- /**************************************************
- 函數(shù)名: Di()
- 函數(shù)功能: 制造蜂鳴器的聲音
- 入口參數(shù): 無
- 出口參數(shù): 無
- 備 注:
- *************************************************/
- void Di()
- {
- uint i;
- for(i = 1;i < 50; i ++)
- {
- beep = 0;
- DelayUs2x(i * 10);
- beep = 1;
- DelayUs2x( ( 50 - i) * 5);
- }
- for(i = 1;i < 50; i++)
- {
- beep = 1;
- DelayUs2x(i * 10);
- beep = 0;
- DelayUs2x( ( 50 - i) * 5);
- }
- }
- /*************************************************
- 函數(shù)名: Locate_DS1302()
- 函數(shù)功能: 用于調(diào)整DS1302時(shí)間時(shí) 定位游標(biāo)
- 與提示改變的項(xiàng)目
- 入口參數(shù): 無
- 出口參數(shù): 無
- 備 注:
-
- *************************************************/
- void Locate_DS1302()
- {
- Remind_DS1302_Exchange(g_Set_DS1302_Num); //提示DS1302改變的項(xiàng)目
- switch(g_Set_DS1302_Num) //定位光標(biāo)
- {
- case 1: Locate_pos(2,6); break; //第一次按下光標(biāo)到秒位置
- case 2: Locate_pos(2,4); break; //第二次按下光標(biāo)到分鐘位置
- case 3: Locate_pos(2,2); break; //第三次按下光標(biāo)到小時(shí)位置
- case 4: Locate_pos(2,1); break; //第四次按下光標(biāo)到星期位置
- case 5: Locate_pos(1,6); break; //第五次按下光標(biāo)到日位置
- case 6: Locate_pos(1,4); break; //第六次按下光標(biāo)到月位置
- case 7: Locate_pos(1,2); break; //第七次按下光標(biāo)到年位置
- default: //返回界面并對(duì)標(biāo)志位進(jìn)行處理
- {
- g_Set_DS1302_Num = 0;
- Initial_12864();
- Initial_12864(); //初始化12864
- Write_12864_DS1302_Constant(); //寫12864固定的部分
- Write_1302_Date(); //寫入 存儲(chǔ)數(shù)據(jù)
- g_Alarm_Flag1 = 0;
- g_Alarm_Flag2 = 0;
- }
- }
- if(g_Set_DS1302_Num >= 8) //增加程序的穩(wěn)定性
- {
- g_Set_DS1302_Num = 0;
- }
- }
- /************************************************
- 函數(shù)名: Increase_DS1302()
- 函數(shù)功能: 用于處理調(diào)整DS1302的數(shù)值之時(shí)
- 對(duì)調(diào)整的項(xiàng)目進(jìn)行數(shù)值增加
- 入口參數(shù):無
- 出口參數(shù):無
- 備 注:
- ************************************************/
- void Increase_DS1302()
- {
- Remind_DS1302_Exchange(g_Set_DS1302_Num); //提示改變的項(xiàng)目
- switch(g_Set_DS1302_Num)
- {
- case 1: //增大調(diào)整秒
- {
- g_sec ++;
- if(g_sec >= 60) //到達(dá)一分鐘的時(shí)間
- {
- g_sec = 0;
- }
- Write_sfm(6,g_sec); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,6); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 2: //增大調(diào)整分鐘
- {
- g_min ++;
- if(g_min >= 60) //到達(dá)一小時(shí)的時(shí)間
- {
- g_min = 0;
- }
- Write_sfm(4,g_min); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,4); //顯示位置重新回到調(diào)節(jié)處
-
- break;
- }
- case 3: //增大調(diào)整小時(shí)
- {
- g_hour ++;
- if(g_hour >= 24)
- {
- g_hour = 0;
- }
- Write_sfm(2,g_hour); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,2); //顯示位置重新回到調(diào)節(jié)處
- break;
-
- }
- case 4: //增大調(diào)整星期
- {
- g_week ++;
- if(g_week >= 8)
- {
- g_week = 1;
- }
- Write_week(g_week); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,1); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 5: //增大調(diào)整日期
- {
- g_date ++;
- if(g_date >= 31)
- {
- g_date = 1;
- g_month ++;
- if(g_month >= 13)//到達(dá)一年的時(shí)間
- {
- g_month = 1;
- g_year++;
- if(g_year >= 20)
- {
- g_year = 9;
- }
- }
- }
- Write_nyr(6,g_date); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,6); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 6: //增大調(diào)整月份
- {
- g_month ++;
- if(g_month >= 12)
- {
- g_month = 1;
- g_year ++;
- if(g_year >= 20)
- {
- g_year = 9;
- }
- }
- Write_nyr(4,g_month); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,4); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 7: //增大調(diào)整年
- {
- g_year ++;
- if(g_year >= 20)
- {
- g_year = 9;
- }
- Write_nyr(2,g_year); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,2); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
-
- }
- }
- /***********************************************
- 函數(shù)名: Decrease_DS1302()
- 函數(shù)功能: 用于處理調(diào)整DS1302的數(shù)值之時(shí)
- 對(duì)調(diào)整的項(xiàng)目進(jìn)行數(shù)值減小
- 入口參數(shù):無
- 出口參數(shù):無
- 備 注:
- /***********************************************/
- void Decrease_DS1302()
- {
- switch(g_Set_DS1302_Num)
- {
- case 1: //減小調(diào)整秒
- {
- g_sec --;
- if(g_sec <= 0)
- {
- g_sec = 59;
- }
-
- Write_sfm(6,g_sec); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,6); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 2: //減小調(diào)整分鐘
- {
- g_min --;
- if(g_min <= 0)
- {
- g_min = 59;
- }
- Write_sfm(4,g_min); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,4); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 3: //減小調(diào)整小時(shí)
- {
- g_hour --;
- if(g_hour <= 0)
- {
- g_hour = 23;
- }
- Write_sfm(2,g_hour); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,2); //顯示位置重新回到調(diào)節(jié)處
- break;
-
- }
- case 4: //減小調(diào)整星期
- {
- g_week --;
- if(g_week <= 0)
- {
- g_week = 7;
- }
- Write_week(g_week); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(2,1); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 5: //減小調(diào)整日期
- {
- g_date --;
- if(g_date <= 0)
- {
- g_date = 31;
- }
- Write_nyr(6,g_date); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,6); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 6: //減小調(diào)整月份
- {
- g_month --;
- if(g_month <= 0)
- {
- g_month = 12;
- g_year --;
- if(g_year <= 8)
- {
- g_year = 20;
- }
- }
- Write_nyr(4,g_month); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,4); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
- case 7: //減小調(diào)整年
- {
- g_year --;
- if(g_year <= 8)
- {
- g_year = 20;
- }
- Write_nyr(2,g_year); //把調(diào)節(jié)的數(shù)據(jù)寫在液晶屏上
- Locate_pos(1,2); //顯示位置重新回到調(diào)節(jié)處
- break;
- }
-
- }
- }
- /************************************************
- 函數(shù)名: void Locate_A()
- 函數(shù)功能: 給變項(xiàng)目時(shí)對(duì)鬧鐘的調(diào)整項(xiàng)目進(jìn)行提示
- 并定位改變的項(xiàng)目
- 入口參數(shù):無
- 出口參數(shù):無
- 備 注:
- ************************************************/
- void Locate_A()
- {
- switch(g_Set_Alarm_Num)
- {
- case 1: Write_Remind_Alarm_Time(1); break; //設(shè)置分鐘
-
- case 2: Write_Remind_Alarm_Time(2); break; //定位小時(shí)
- }
- }
- /************************************************
- 函數(shù)名: void A_Increase()
- 函數(shù)功能: 在調(diào)整鬧鈴的數(shù)值時(shí)對(duì)相應(yīng)的時(shí)分
- 進(jìn)行增加
- 入口參數(shù): 無
- 出口參數(shù): 無
- 備 注:
- ************************************************/
- void A_Increase()
- {
- switch(g_Set_Alarm_Num)
- {
- case 1: //增加鬧鐘分鐘的時(shí)間
- {
- g_Alarm_min ++;
- if(g_Alarm_min >= 60)
- {
- g_Alarm_min = 0;
- }
- Write_Remind_Alarm_Time (1); //讀取設(shè)置后的鬧鈴時(shí)間
- Write_Add_24c02 (1,g_Alarm_min); //24C02存數(shù)據(jù)
- break;
- }
- case 2: //增加鬧鐘小時(shí)的時(shí)間
- {
- g_Alarm_hour ++;
- if(g_Alarm_hour >= 24)
- {
- g_Alarm_hour = 0;
- }
- Write_Remind_Alarm_Time (2); //讀取設(shè)置后的鬧鈴時(shí)間
- Write_Add_24c02 (2,g_Alarm_hour); //24C02存數(shù)據(jù)
- break;
- }
- }
- }
- /************************************************
- 函數(shù)名: A_Decrease()
- 函數(shù)功能: 調(diào)整鬧鈴時(shí)對(duì)鬧鈴的小時(shí)與分鐘進(jìn)行
- 減小
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載(完整源碼打包):
我的超級(jí)時(shí)鐘.zip
(163.52 KB, 下載次數(shù): 97)
2017-5-28 00:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|