电路图在附件
制作出来的实物图如下:
单片机源程序如下:
- /*
- *******************************************************************************
- * “冬松电子工作室” 倾情奉献
- *
- * 配套 LCD12864电子万年历时钟电路板
- *
- * 文 件 名:calendarMain.c
- * 描 述: LCD12864电子万年历时钟工程主文件
- * 功 能:初始化定时器0,及中断服务程序(用于闹钟),主函数调用
- * 咨询电话:135-91697612
- *******************************************************************************
- */
- #include "clock.h"
- #include "calendar.h"
- #include "key.h"
- #include "lcd.h"
- #include "zhen.h"
- #include "sensor.h"
- uchar alarmStyle; //定义蜂鸣器报警方式
- /****************************************************************************/
- sbit bell=P1^0; //定义蜂鸣器端口
- /****************************************************************************
- * 名称:void Timer0_Initial(void)
- * 功能:初始化timer0
- * 入口函数:无
- * 出口函数:无
- ****************************************************************************/
- void Timer0_Initial(void)
- {
- TMOD=0x01; //Timer0工作方式1定时
- TH0 =0x4c;
- TL0 =0x00; //定时50 ms
- ET0 =1; //Timer0开中断
- TR0 =1; //timer0启动
- }
- /*****************************************************************************
- * 名称: Timer0_Overflow() inturrupt 1
- * 功能: 中断服务程序 1.整点报时 三声嘟嘟的声音 2.闹钟报时,持续一分钟
- * 入口参数:无
- * 出口参数:无
- *****************************************************************************/
- void Timer0_Overflow() interrupt 1
- {
- TH0 = 0x4c;
- TL0 = 0x00; //延时 50 ms
- bell=~bell; //进入中断,蜂鸣器取反,达到蜂鸣器间歇工作目的
-
- }
- /******************************************************************************
- * 函数名称: main()
- * 功 能: 主函数
- * 入口参数: 无
- * 出口参数: 无
- ********************************************************************************/
- void main()
- {
- uchar clock_time[7] = {0x00,0x11,0x20,0x01,0x02,0x01,0x16}; //定义时间变量 秒 分 时 日 月 周 年
- uchar alarm_time[3]; //闹钟设置 alarm_time[0]:分钟 alarm_time[1]:小时
- uchar temperature[2];//定义温度变量temperature[0]为低8位,temperature[1]为高8位
- uchar i, j;
- uchar CALL[3]; //存储三画面状态(开和闭)数组
- // bell = 1;
- // lcd = 1;
- // psb = 1; //12864采用并口输出方式
- // cs2 = 0;
- Timer0_Initial(); //初始化定时器0
- v_Lcd12864Init_f(); //12864初始化
- port = 0xFF; //释放P0端口
- Lcd_Write_Command(0x36); //采用扩充指令集,绘图开,清除模拟指针画面字符
- delay_1ms(2); //延时2ms
- Lcd_Write_Command(0x36); //采用扩充指令集,绘图开,需设定两次,先改DL,再改RE
- delay_1ms(2); //延时2ms
- cls(); //清屏,为显示做准备
- key_init(); //初始化键盘扫描程序变量
- // Set1302(clock_time); //时钟初试化
- CALL1[0] = R1302(0xc7); //读取DS1302的RAM中 画面一 状态值
- CALL1[1] = R1302(0xc9); //读取DS1302的RAM中 画面二 状态值
- CALL1[2] = R1302(0xcb); //读取DS1302的RAM中 画面三 状态值
- if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二个画面
- {
- frame_and_scale_f(); //绘制出边框,和刻度
- }
- alarmStyle=0x00; //初始化报警方式,此时不报警
- EA = 0; //关闭总中断
- while( 1 )
- {
- CALL[0] = R1302(0xc1); //读取DS1302的RAM中 分 闹钟值
- CALL[1] = R1302(0xc3); //读取DS1302的RAM中 时 闹钟值
- CALL[2] = R1302(0xc5); //读取DS1302的RAM中 开和闭 状态值
- CALL1[0] = R1302(0xc7); //重新读取DS1302的RAM中 画面一 状态值
- CALL1[1] = R1302(0xc9); //重新读取DS1302的RAM中 画面二 状态值
- CALL1[2] = R1302(0xcb); //重新读取DS1302的RAM中 画面三 状态值
- Get1302(clock_time); //获取 秒 分 时 日 月 周 年 的时钟数据
- Lcd_Clock(clock_time); //时钟显示
- Sensor_Fresh(temperature); //温度更新,读取温度
- Lcd_Temperature(temperature); //显示温度
- Conversion(0,clock_time[6],clock_time[4],clock_time[3]); //输入BCD阳历数据,输出BCD阴历数据
- Conver_week(0,clock_time[6],clock_time[4],clock_time[3]);//输入BCD阳历数据,输出BCD星期数据
- if(KEY_FUNC==Key_Scan()) //如果按键作值KEY_FUNC(0x08)与按键扫描Key_Scan()数对比相等(也是0x08),
- {
- while(KEY_FUNC==Key_Scan()); //KEY_FUNC和Key_Scan()的值相等,就在这里等待,按键抬起就执行下面语句,
- Key_Function(clock_time, alarm_time); //则进入功能选择菜单
- }
- if(KEY_UP == Key_Scan()) //如果按键作值KEY_UP(0x01)与按键扫描Key_Scan()数对比相等(也是0x01),
- {
- lcd = 1; //打开液晶背光灯
- }
- if(KEY_DOWN == Key_Scan()) //如果按键作值KEY_DOWN(0x02)与按键扫描Key_Scan()数对比相等(也是0x02),
- {
- lcd = 0; //关闭液晶背光灯
- }
- if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二个画面
- {
- frame_and_scale_f(); //绘制出边框,和刻度
- zhizhen();
- }
- if(((CALL1[0]==0)||(CALL1[1]==0))&&(CALL1[2]==1)) //第三个画面
- {
- Lcd_Write_Command(0x34); //采用扩充指令集,绘图关
- Lcd_Write_Command(0x30); //基本指令集
- }
- if((*clock_time==0x59)&&(*(clock_time+1)==0x59)) //比较秒和分数据到59,整点报时
- {
- EA = 1; //打开总中断
- bell = 0; //打开蜂鸣器
- }
- else
- {
- EA = 0; //关闭总中断
- bell = 1; //关闭蜂鸣器
- }
- //闹钟报警
- i = clock_time[1]; //分钟数据传递给变量 i
- j = clock_time[2]; //小时数据传递给变量 j
- i = bcd_hex(i); //分钟数据转换成十进制数
- j =bcd_hex(j); //小时数据转换成十进制数
- //不转换闹钟调整数据和DS1302闹铃存储的闹钟数据不同,闹钟不响
- if(CALL[2] == 0) //如果闹钟状态是 “开”
- {
- if(( CALL[0] == i)&&( CALL[1] == j)) //时钟分钟和小时与DS13202存储的闹钟值相吻合,
- {
- EA = 1; //打开总中断
- bell = 0; //打开蜂鸣器
- }
- }
- else //否则闹钟状态是 “关”
- {
- EA = 0; //关闭总中断
- bell = 1; //关闭蜂鸣器
- }
- }
- }
复制代码
所有资料51hei提供下载:
指针数字切换万年历.rar
(114.42 KB, 下载次数: 216)
|