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