(此文档为word格式,下载后您可任意编辑修改!)
专业综合课程设计报告
题目:智能电子钟(LCD)
题目智能电子钟(LCD)
一、设计要求:
制作一个LCD显示的智能电子钟:
(1) 计时:秒、分、时、日、月、年、星期。
(2) 闰年自动判别。
(3) 时间、年、月、日、星期交替显示。
(5) 自定任意时刻自动开关屏。
(6) 计时精度:误差≤1秒月(具有微调设置)。
二、方案论证:
本实验可采用并行时钟芯片(DS12C887)和串行时钟芯片(DS1302),DS1302要用户自己安装后备电池和串口通讯,要
32.768KHz的晶振,而DS12C887自带后备电池,并口通讯,无需
外围元件,并且DS12C887多了一个字节来记录世纪使用的,处在RAM的32H单元,但是其他的寄存器定义都相同。由于本实验用到了STC12C5A60S2直插40P封装的单片机、nokia5110液晶屏、独立式按键、四路2输入与门并且都是直插的,而且在实验室做PCB 只能是单层板,为了节约空间和简化电路于是就选用了串行时钟芯片DS1302。
三、理论设计:
用CAD软件绘制的硬件原理图
载端口,DOWN端口适用于四角插针式下载、BAT为备用电源端口。
CPU主控部分,此部分采用的是高速51系列的STC12C5A60S2的单片机,该芯片不仅运行速度快稳定驱动能力更大,还为用户提供了内部集成8位10位可调分辨率ADC模块(在此设计中有用到),1KB可擦写EEPROM本设
计中用其设计成可调闹钟功能存放闹钟值。
此图为串行数据nokia5110的LCD显示器模块,采用可控背光和可控电源有很好的节能效果。该显示器能显示汉字,字符,图片、并且处理显示数
据速度快。
DS1302具有闰年补偿。
处理按键按下的值来执行用户的操作。
此图为蜂鸣器模块此模块用于闹钟铃声设计,和开机提示。
此图为PCB版图
此图为PCB打印预览
软件流程图
yes其他键yes
按下目录键
NO
功能1(时间)
功能2(温度)
功能3(电压)
功能4(闹钟)
程序清单
完整C程序源代码
************************************************************************* *************
* 主程序:顶层程序
*
* 显示默认功能:时间日期显示;
*
* 调用子程序;
*
*
*
************************************************************************* **************
# include { system_inint(); 系统初始化; Set_RTC(); while(1) { checkclock(); caidan(); 菜单显示; if(menue==0) { if(ok==1) { LCD_clear(); 清屏幕 while(menue==0) 由此进入时钟功能 { ok=0; logo(); Read_RTC();读取时钟; data_change();时钟数据处理 tiaozheng_flag(); date_time(); 显示年月日时分秒; week();星期处理; set_date_time();设置改变时间和日期; powervcc(); checkclock(); } LCD_clear(); 清屏幕 } } else if(menue==1) 由此进入温度检测功能{ if(ok==1) { LCD_clear(); 清屏幕 while(menue==1) { temperatuercheck(); ok=0; } LCD_clear(); 清屏幕 } } else if(menue==2) 由此进入电压测量功能{ if(ok==1) { LCD_clear(); 清屏幕 while(menue==2) { power();电量检测 ok=0; } LCD_clear(); 清屏幕 } } else if(menue==3)由此进入闹钟功能{ if(ok==1) { LCD_clear(); 清屏幕 while(menue==3) { clock(); ok=0; checkclock(); } LCD_clear(); 清屏幕 } } else {LCD_clear(); caidan();} } } void extern0() interrupt 0 *外部中断0中断函数定义;* { key(); } ************************************************************************* ************* * 子程序:底层程序 * * 功能:时间日期数据处理; * * * * * ************************************************************************* ************** # include } ****************************************************************** * 读时钟数据* ****************************************************************** void Read_RTC(void) 读取日历 { unsigned char i,*p; p=Read_RTC_address; 地址传递 for(i=0;i<7;i++) 分7次读取秒分时日月周年 { l_tmpDate[i]=Read_Ds1302(*p); p++; } } ****************************************************************** * 设定时钟数据* ****************************************************************** void Set_RTC(void) 设定日历 { uchar i,*p,tmp; for(i=0;i<7;i++) { BCD处理 tmp=l_tmpDate[i]10; l_tmpDate[i]=l_tmpDate[i]%10; l_tmpDate[i]=l_tmpDate[i]+tmp*16; } Write_Ds1302(0x8E,0X00); 关闭写保护; p=Write_rtc_address; 传地址 for(i=0;i<7;i++) 7次写入秒分时日月周年 { Write_Ds1302(*p,l_tmpDate[i]); p++; } Write_Ds1302(0x8E,0x80); 打开写保护; } ************************************************************************* ************* * 子程序:底层程序 * * 功能:按键处理,键值显示; * * * * * ************************************************************************* ************** # include "main.,shi,ri,yue,zhou,nian;*时间日期数值标志位;* uchar clocktable[5]; 分,时,星期; char ==0) { Delay10ms(); if(keydown==0) { LCD_BLA=1; Delay10ms(); while(keydown==0); key_flag--; } } if(keymenue==0) { Delay10ms(); if(keymenue==0) 菜单选择标志位;{ Delay10ms(); while(keymenue==0); LCD_BLA=1; menue++; if(menue>3)menue=0; } } if(keyok==0) { Delay10ms(); if(keyok==0) 确认标志位;{ Delay10ms(); while(keyok==0); ok++; if(ok>1)ok=0; set=0;LCD_BLA=0;TR0 = 0; } } if(set>=2)TR0 = 0; EA=1; } void set_date_time() { if(set==2) { while(keyup==0|keydown==0); { miao=l_tmpdisplay[10]*10+l_tmpdisplay[11]; miao=miao+key_flag; if((key_flag<0)&(miao==0))miao=59; if(miao>59)miao=0; miao=miao%10+(miao10)*16; Write_Ds1302(0x8E,0x00); Write_Ds1302(0x80,miao); Write_Ds1302(0x8E,0x80); } } if(set==3) { while(keyup==0||keydown==0); { fen=l_tmpdisplay[8]*10+l_tmpdisplay[9]; fen=fen+key_flag; if(fen>59) { fen=0; } if((key_flag<0)&&(fen<0)) { fen=59; } fen=fen%10+(fen10)*16; Write_Ds1302(0x8E,0x00); Write_Ds1302(0x82,fen); Write_Ds1302(0x8E,0x80); } }