lCD时钟日历设计报告.docx
- 文档编号:11453584
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:30
- 大小:58.34KB
lCD时钟日历设计报告.docx
《lCD时钟日历设计报告.docx》由会员分享,可在线阅读,更多相关《lCD时钟日历设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
lCD时钟日历设计报告
此报告供参考,剩下自己修改添加完善
LCD屏幕显示硬件系统设计电路图(a)
一方案设计及方案论证
1.时钟温度的总体设计思路
按照老师的设计功能要求,电话机LCD屏幕显示系统设计必须采用单片机软件系统实现,用单片机的自动控制能力配合现有的按键控制,来控制时钟、日历星期的调整及显示。
获得时钟日历星期数据信息,单片机对其进行一系列的处理,最后通过LCD液晶屏幕显示出来。
2.时钟温度系统方案论证
2.1时钟系统方案选择
方案1:
通过单片机内部的定时器/计数器,用软件实现,直接用单片机的定时器编程以实现时钟、日历、星期;(原理为:
在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。
而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
)括号部分可不要
方案2:
用专门的时钟芯片实现时钟的记时,再把时间日历数据送入单片机,由单片机控制显示。
(该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
)括号部分可不要
虽然用软件实现时钟硬件线路简单,但是程序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需要的功能造成软件编程非常复杂。
用专用时钟芯片硬件成本相对较高,但它的精度很高,软件编程很简单。
但考虑方案1节省成本,对内部的定时器/计数器方面的知识比较了解熟悉,因此采用方案1。
2.2单片机的选择
对于单片机的选择,如果用8031系列,由于它没有内部RAM,系统又需要大量内存存储数据,因而不可用;51系列单片机的ROM为4K,对于我们设计的系统可能有点小;52系列单片机与51系列的结构一样,而ROM扩大为8K,对我们设计系统提供充足的空间进行功能的扩展。
再有51系列单片机与52系列的单片机价格差不多。
因此,我们选择52系列的单片机。
2.3显示系统的方案比较
方案1:
用数码管或LED显示。
方案2:
用液晶162显示。
方案3:
用液晶12864显示。
时钟和日历星期的显示可以用数码管或LED,而且价格便宜。
但是数码管的只能显示简单的设计的系统,与我们设计要求也不相符。
有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用162液晶显示数据有限,显示数据的可读性不好,用可以显示汉字的12864液晶显示器还可以增加显示信息的可读性,让人看起来会很方便。
另外它们在价格上差距很大,考虑成本我们首选162。
所以选择方案2。
2.4报警系统的方案比较
方案1:
用单片机板上长鸣的蜂鸣器实现定时闹钟功能。
方案2:
用喇叭加语音芯片实现定时闹钟功能。
用喇叭加语音芯片成本很高,但声音还不错,再有喇叭体积庞大。
用用单片机板上蜂鸣器,节约了成本和设计的时间。
限于设计所需要的功能,用蜂鸣器是最佳选择。
所以我们采用方案1.
2.5键盘控制方案选择
方案1:
采用矩阵键盘,采用矩阵形式连接。
方案2:
采用单片机实验板上固有的按键作为校时调整控制。
虽然矩阵键盘调整简单快速,考虑到程序设计的便捷但我们觉得还是用方案2。
二、硬件系统方框图
三、硬件电路设计
硬件系统设计电路图如(a)所示,单片机的P1口为LCD液晶显示的引脚接口。
单片机的P2^0~P^3、P3^3引脚作为按键接口,其中P2^0为设置闹钟项选择键,P2^1为调整时间项选择键,P2^2为调整时间或设置闹钟加1键,P2^3为调整时间或设置闹钟减1键,P3^3为闹钟停止键。
Reset为复位键,P1-0为蜂鸣器接口,高电平驱动蜂鸣器鸣叫,模拟闹钟起闹。
LCD162的相关说明
(LCD液晶显示的资料介绍和外观图形,)
四、软件系统程序设计流程图
(自己参考书本P245~P251及参考资料)
五、调试结果分析及使用操作说明
1)软件调试
软件调试,我是在keil软件平台和单片机学习板上来完成的。
当我写部分程序在keil软件经过调试,开始出现很多错误和警告。
通过逐个错误排错及修改。
得出下列经验,
(1)调用函数最好在头文件中进行申明,主函数写在最后;
(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题。
经过一系列排错,最后文件没有错误但还有警告。
由于c语言中有警告是没关系的,我将HEX文件下在到单片机竟显示一些乱码。
我有回到文件,经过对警告的分析及上网查阅。
将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码。
经过分析,叠屏现象是没有对液晶清平所致。
于是我又在不同界面程序前加入调用填充空格函数,然后又下载,结果与前面一样。
经过几个小时后,无意间我去掉调用函数前void,结果叠屏现象解决。
还有在定时计数时出现了计数不准确,通过修改定时器部分程序,问题也得到了解决。
还另外在闹钟部分不能起闹,原因是由于LCD液晶函数部分和闹铃比较函数出现了小问题,经过不断调试才得已解决。
调试正确后,第一行显示年月日星期和"@_@",第二行显示时分秒和"TuNian",并且能正常行走,按下相应键能实现相应的功能。
2)使用操作说明
程序修改编译无误后,将HEX文件下在到单片机,按下单片机电源开关键,刚开始如出现乱码,按一下复位键,LCD液晶显示屏正常显示。
当按下P2^0键时,设置闹钟功能,第一次调整时,第二次调整分,第三次调整秒,调整完3秒后恢复正常模式,闹铃设鸣叫5s;当按下P2^1键时,对应调整项闪烁,定时器停止计数,开始对日历和时间调整,前三次为年月日星期调整,后三次为时分秒调整;当按下P2^2键时,设置日历时间或闹钟加1,加1调整完3秒后恢复正常行走;当按下P2^3键时,设置日历时间或闹钟减1,减1调整完3秒后恢复正常行走;当按下P3^3键时,可对闹钟终止鸣叫。
源程序:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//#defineLCD_EN_PORTP1
//#defineLCD_RS_PORTP1
#defineLCD_DATA_PORTP1
#defineLCD_ENP1_3
#defineLCD_RSP1_2
/**********************函数声明***************************/
voidLCD_write_char(unsignedcharData,unsignedcharcommand);//写命令或写数据函数
voidLCD_init(void);//液晶初始化函数
voidLCD_en_write(void);//液晶使能函数
voidLCD_write_char(ucharcommand,ucharData);//写命令或写数据函数
voidLCD_set_xy(ucharx,uchary);//设置显示位置函数
voidLCD_write_string(ucharX,ucharY,uchar*s);//写字符串函数
voiddelay_nus(uintn);//延时函数
voiddelay_nms(uintn);//延时函数
voidSet_Time(ucharsel,ucharsel_1);
voidset_alarm(ucharsel,ucharsel_1);
externvoiddelay_nms(unsignedintn);
ucharData1[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharData2[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
ucharData3[9]={0,0,0,0,0,0,0,0,0};
uintrun_nian();//判断是否为闰年
unsignedchartab[]="TuNian";
unsignedchartab0[]="@_@";
uintcount=0;
ucharcount1=0;
uintcount2=0;
ucharh,msec;
ucharSJ=0;//调整时间选择
ucharNZ=0;//设置闹钟选项
uintnian=2011;//年初始值
ucharyue=4,ri=8,xq=5,hour=0,min=0,sec=0;//月、日。
时。
分。
秒初始值
ucharalarm_hour=0,alarm_min=0,alarm_sec=0;//闹钟时。
分。
秒初始值
bitclear_flag=0;//液晶清除屏幕标志
bitFlicker;//调整时间及设置闹钟位闪烁标志
bitalarm_flag=0;//闹钟起闹标志
bitflag=0;//显示屏幕切换标志
bitstart_alarm_flag=0;//
sbitkey_alarm=P2^0;//设置闹钟项选择键
sbitkey_moda=P2^1;//调整时间项选择键
sbitkey_up=P2^2;//调整时间或设置闹钟加1键
sbitkey_Down=P2^3;//调整时间或设置闹钟减1键
sbitalarm_stop=P3^3;//闹钟停止键
/********************液晶初始化函数************************/
voidLCD_init(void)
{
delay_nms(5);
LCD_write_char(0x28,0);//4位显示
LCD_write_char(0x0c,0);//显示开
LCD_write_char(0x06,0);
LCD_write_char(0x01,0);//清屏
}
/********************液晶使能函数************************/
voidLCD_en_write(void)
{LCD_EN=0;
delay_nus
(2);
LCD_EN=1;
delay_nus
(2);
LCD_EN=0;
}
/*********************写命令或写数据函数*******************/
voidLCD_write_data(unsignedcharData_command)
{unsignedchartemp;
temp=Data_command;
LCD_DATA_PORT&=0X0f;//LCD_DATA_PORT=LCD_DATA_PORT&0X0f
LCD_DATA_PORT|=temp&0xf0;//写高四位
LCD_en_write();
temp=temp<<4;
LCD_DATA_PORT&=0x0f;
LCD_DATA_PORT|=temp&0xf0;//写低四位
LCD_en_write();
}
/*********************写命令和写数据函数*******************/
//参数:
command=1,写数据,command=0写命令
voidLCD_write_char(unsignedcharData_or_command,unsignedcharcommand)
{
if(command==0)
{LCD_RS=0;//RS=0,选择指令寄存器
LCD_write_data(Data_or_command);
}
else
{
LCD_RS=1;//RS=1,选择数据寄存器
LCD_write_data(Data_or_command);
}
}
/**********************设置显示地址函数********************/
voidLCD_set_xy(unsignedcharx,unsignedchary)
{
unsignedcharaddress;
if(y==0)
address=0x80+x;
else
address=0xc0+x;
LCD_write_char(address,0);
}
/*********************写字符串函数************************/
//参数:
X为显示在第几列,Y为显示在第几行,s为待显示字符串
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s)
{
LCD_set_xy(X,Y);//写地址
while(*s)//写显示字符
{
LCD_write_char(*s,1);
s++;
}
}
/*******************延时函数*************************/
//系统时钟:
12MHZ
voiddelay_nus(uintn)//Nus延时函数
{
unsignedinti=0;
for(i=0;i _nop_(); } voiddelay_nms(uintn)//Nms延时函数 { uchari=0; while(n--) { for(i=0;i<125;i++); } } /*******************定时器0初始化函数*********************/ voidTIMER0_init() {TMOD=0x12;//定时器T1方式1,定时器T0方式2 TH0=0x06;//12MHz晶振,250us定时初值 TL0=0x06; TH1=0x3c;//12MHz晶振,50ms定时初值 TL1=0xb0; EA=1; ET0=1; TR0=1; ET1=1; TR1=1; } /********************定时器0中断函数************************/ unsignedintrun_nian()////判断是否为闰年 { uintrun; if((nian%4==0&&nian%100! =0)||nian%400==0)//闰年的条件 run=1; else run=0; returnrun; } voidTIMER0_OVER(void)interrupt1 {unsignedintcount;//中断次数计数值 TH0=0x06; TL0=0x06; count++; if(count==4000) {count=0; clear_flag=1;//置液晶清除屏幕标志为1 sec++;//秒加1 if(sec==60) {sec=0; min++;//分加1 if(min==60) {min=0; hour++;//时加1 if(hour==24) {hour=0;//时清0 ri++;xq++; if(xq>7)xq=1; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) if(ri>31){ri=1;xq++;yue++;}//大月31天 if(yue==4||yue==6||yue==9||yue==11) if(ri>30){ri=1;xq++;yue++;}//小月30天 if(yue==2) {if(run_nian())//闰年的条件 {if(ri>29){ri=1;xq++;yue++;}}//闰年2月为29天 else {if(ri>28){ri=1;xq++;yue++;}}//平年2月为28天 } if(yue>12){yue=1;nian++;xq++;} if(nian>2100)nian=0; //{if(xq=7)xq=1;} } } } } } /***************年、月、日转换程序********************/ //作用: 处理显示数据年、月、日 voidRiQi_process(uchar*p1) {p1[0]=((uchar)(nian/1000))+0x30; p1[1]=((uchar)(nian%1000/100))+0x30; if(SJ==1&&Flicker==1) {p1[2]=''; p1[3]=''; } else {p1[2]=((uchar)(nian%1000%100/10))+0x30; p1[3]=((uchar)(nian%1000%100%10))+0x30; } p1[4]='-'; if(SJ==2&&Flicker==1) {p1[5]=''; p1[6]=''; } else {p1[5]=yue/10+0x30; p1[6]=yue%10+0x30;} p1[7]='-'; if(SJ==3&&Flicker==1) {p1[8]=''; p1[9]=''; } else {p1[8]=ri/10+0x30; p1[9]=ri%10+0x30; p1[10]='-'; } if(SJ==3&&Flicker==1) {p1[11]=''; p1[12]=''; } else {//p1[11]=xq/10+0x30; p1[11]=xq%10+0x30;} p1[12]='\0';//结束标示 } /***************时、分、秒转换程序********************/ //作用: 处理显示数据时、分、秒 voidShiJian_process(uchar*p2) {if(SJ==4&&Flicker==1) {p2[0]=''; p2[1]=''; } else {p2[0]=hour/10+0x30; p2[1]=hour%10+0x30; } p2[2]=': '; if(SJ==5&&Flicker==1) {p2[3]=''; p2[4]=''; } else {p2[3]=min/10+0x30; p2[4]=min%10+0x30; } p2[5]=': '; if(SJ==6&&Flicker==1) {p2[6]=''; p2[7]=''; } else {p2[6]=sec/10+0x30; p2[7]=sec%10+0x30; } p2[8]='\0';//结束标示 } /***************闹钟处理子程序********************/ //作用: 处理设置闹钟时的显示数据时、分、秒 voidNaoZhong_process(uchar*p3) {if(NZ==1&&Flicker==1) {p3[0]=''; p3[1]=''; } else {p3[0]=alarm_hour/10+0x30; p3[1]=alarm_hour%10+0x30; } p3[2]=': '; if(NZ==2&&Flicker==1) {p3[3]=''; p3[4]=''; } else {p3[3]=alarm_min/10+0x30; p3[4]=alarm_min%10+0x30; } p3[5]=': '; if(NZ==3&&Flicker==1) {p3[6]=''; p3[7]=''; } else {p3[6]=alarm_sec/10+0x30; p3[7]=alarm_sec%10+0x30; } p3[8]='\0';//结束标示 } /*****************定时器1中断函数*****************/ voidtimer_1(void)interrupt3//中断入口,闪烁 { TH1=0x3C;//50ms定时晶振12M TL1=0xB0; if(count1++==10)//500ms {count1=0; Flicker=! Flicker; } if(msec++==20)//1000ms {msec=0; if(h++==3)//3秒后进入正常走时。 {SJ=0;h=0;NZ=0;TR0=1;flag=0;clear_flag=1;} } if(start_alarm_flag==1) {if(count2++==100)//5秒后闹钟停止 {count2=0;alarm_flag=0;start_alarm_flag=0;} } } /*****************按键扫描程序****************************/ voidkey_scan() {if(alarm_stop==0)//闹钟停止 { delay_nms(10); if(alarm_stop==0) alarm_flag=0; start_alarm_flag=0; } if(key_alarm==0)//设置闹钟 { delay_nms(10); if(key_alarm==0) {NZ++; flag=1; SJ=0; if(NZ>3) {NZ=0; flag=0; clear_flag=1; start_alarm_flag=1; } whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lCD 时钟日历 设计 报告