12864时钟资料包(附件中可下载完整版的代码 而且注释非常详细):
单片机源程序如下:
- #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)
|