单片机最小系统.docx
《单片机最小系统.docx》由会员分享,可在线阅读,更多相关《单片机最小系统.docx(14页珍藏版)》请在冰豆网上搜索。
单片机最小系统
基于1602LCD的可调式电子钟的设计
Designofadjustable-typeElectronicClockBasedon1602LCD
专业:
电路与系统
学号:
2012204107
姓名:
彭洪
指导老师:
陈颀
完成时间:
2012.12.25
基于1602LCD的可调式电子钟的设计
摘要:
可调式电子钟的设计是选用按键作为输入设备,AT89C51单片机作为主控和处理设备,1602LCD液晶屏作为输出设备,而设计的一款可调式显示的电子时钟。
该电子钟通过对1602LCD的操作实现对“时”、“分”、“秒”的动态显示,以24小时计时方式。
用32768Hz的晶振产生振荡脉冲,定时计数,通过选择键(K1)、加键(K2)、减键(K3)和确定键(K4)四个按键实现对时间的调整。
整个电子钟系统能完成时间的显示,时间调整等功能。
关键词:
AT89C51;1602LCD;可调式电子钟
Designofadjustable-typeElectronicClockBasedon1602LCD
Abstract:
Designofadjustable-typeElectronicClockisselectionofkeyboardasaninputdevice,AT89C51microcontrollerasthemaincontrolandprocessingequipment,1602LCDscreenasanoutputdevice,andthedesignofaadjustable-typedisplayelectronicclock.Theelectronicclockbasedon1602LCDoperationtoachievethedesignoftheLCDscreento"Hours","minutes","seconds"dynamicdisplay,in24hourstime.Using32768HZcrystaloscillationpulse,timingandcounting,byselectingthekey(K1),addthekey(K2),subtractthekey(K3)anddeterminethekey(K4)quadruplebondtoachievethetimeadjustment.Theelectronicclocksystemcancompletetimedisplay,timeadjustmentfunction.
Keywords:
AT89C51;1602LCD;Adjustable-typeElectronicClock
1.引言
可调式电子钟是采用数字电路实现对时、分、秒数字显示的计时装置,已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使可调式电子钟具有走时准确、性能稳定、携带方便等优点,它还用于自动控制等各个领域。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
本文设计的可调式电子钟的特点如下:
●采用1602LCD液晶屏显示时间;
●通过按键调整时间。
2.可调式电子钟硬件电路设计
本系统采用单片机AT89C51做控制系统,采用1602LCD液晶屏作为显示元件显示时分秒。
系统结构框图如图1。
图1系统结构框图
单片机工作需要时钟电路,通过引脚XTAL1和XTAL2两端跨接32768Hz的晶振,利用芯片内部的振荡电路,就构成稳定的自激振荡器,发出的脉冲直接送到内部电路,这就构成了内部时钟方式;外接时钟是把时钟信号送入XTAL1,另一引脚悬空。
外接晶振时,c1和c2值通常选择为20到30pF;为了减少寄生电容,更好的保证振荡器稳定可靠的工作,振荡器和电容尽可能的与单片机芯片靠近安装。
本设计使用四个按键,实现的功能比较完善,减少了硬件资源的损耗。
按键功能:
●K1为选择按键;只按一次,则选定调节对象为时针;连续按两次,则选定调节对象为分针。
●K2为累加调整按键;当按选择按键K1后,再按K2调整选定时(或分),每按一次K2选定的时(或分)加1。
●K3为递减调整按键;当按选择按键K1后,再按K3调整选定时(或分),每按一次K2选定的时(或分)减1。
●K4为确定所调整的时间;当成功完成调整时间后,按K4键确定显示调整后的时间。
原理图如图2。
图2电路原理图
3.可调式电子钟系统软件实现
系统的软件设计也是工具系统功能的设计。
单片机软件的设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。
单片机的软件设计通常要考虑以下几个方面的问题:
(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构,使软件开发清晰、简洁和流程合理。
(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序化。
既便于调试、链接,又便于移植和修改。
(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数。
(4)绘制程序流程图。
(5)合理分配系统资源。
(6)为程序加入注释,提高可读性,实施软件工程。
(7)注意软件的抗干扰设计,提高系统的可靠性。
主程序是先开始,然后初始化,初始化后在进行从LCD左上角开始清屏,然后中断,判断是否执行调整操作,读取当前时间或者调整时间后,就可以显示时间。
主程序流程图如图3。
图3主程序流程图
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示当前时间。
动态扫描显示方式中,动态扫描的频率有一定的要求,频率太低,LCD将出现闪烁现象。
如频率太高,由于每个LCD点亮的时间太短,LCD的亮度太低,肉眼无法看清,所以一般均取10ms左右为宜,这就要求在编写程序时,选通某一位LCD使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
在C51指令中,延时子程序是相当简单的,并且延时时间也很容易更改。
4.系统仿真
图4系统仿真图
系统仿真需要使用Keil软件编写真确的C程序,并且生成hex文件。
然后把所生成的hex文件加载到通过Protues绘制出的系统仿真图主控芯片AT89C51中。
图11为用Protues绘制出的系统仿真图。
如果在程序编译的时候检测出错误或者警告,则用Protues仿真1602LCD显示的时候很可能会出现问题。
图12为正确的仿真效果图,图13、14分别为通过按键调整后所显示的时间。
图5当前时间仿真效果图图6调整时针仿真效果图图7调整分针仿真效果图
调整电子时钟前的当前时间为15:
55:
29;通过调时按键调整后的时间为17:
55:
29;通过调分按键调整后的时间为15:
46:
29。
综合图4、5、6、7仿真图可以得出,仿真结果与理论计算的结果一样,即该系统仿真完全满足要求。
5.结论
本次系统设计做的是可调式的电子钟,主要是出于自己的兴趣爱好。
由于自己才疏学浅,开始对控1602LCD的显示就很是头疼,但是通过查询资料、请教别人以及自己的认真思考,终于明白了1602LCD的显示原理。
通过此次课程设计使我深刻了解到了日常知识积累的重要性。
书到用时方恨少,在以后的学习中一定要吸取经验,学好基础知识并努力开阔视野。
而且通过本次课程设计更加意识到提高编程能力关键是要多多实践,读书是为写代码打基础,但只读书不敲代码是不可能提高实际的编程能力的。
只有多读源码、多写代码、多思考才能对知识有更加深刻的了解。
本系统用单片机AT89C51构成控制系统,具有精度高、速度快、性能稳定和电路简单且工作可靠等特点,具有很好的使用价值。
对今后的进一步研究和应用有一定的指导意义。
参考文献
[1]李金群.基于51单片机的1602液晶图文显示研究[J].机电信息,2010,(36):
6-7.
[2]陈涛.单片机应用C51程序设计[M].北京:
机械工业出版社,2008,27-83.
[3]赵勤.现代显示[J].北京现代显示杂志社,2003,(10):
32-33.
[4]王显.单片机技术课程设计说明书--1602LCD液晶显示[J].科技视界,2007,(02):
30-31.
[5]黄正谨.综合电子设计与实践[M].江苏:
东南大学出版社,2002,57-86.
[6]杨欣等.电子设计从零开始[M].北京:
清华大学出版社,2005,137-152.
[7]岳国义,李宝树,赵书涛.智能型可调式仪表识别系统的研究[J].仪器仪表学报,2003,(S2):
24-25.
[8]马忠梅,张凯.单片机的C语用程序设计[M].北京:
北京航空航天大学出版社,2010,1-353.
附录
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDelayNop(){_nop_();_nop_();_nop_();_nop_();}
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitSPK=P3^0;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
bitLCD_Busy_Check();
voidLCD_Initialize;
voidLCD_Set_POS(uchar);
voidLCD_Write_Command(uchar);
voidLCD_Write_Data(uchar);
ucharcodeStr1[]="CurrentTime";
ucharcodeStr2[]="SetNewTime…";
ucharHMS_String[]="12:
30:
00";
bitSettime=0;
bitChang_H_or_M=1;
ucharMilliSecond,Hour=12,Minute=30,Second=0;
voidDelayMS(uintx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
bitLCD_Busy_Check()
{
bitLCD_Status;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
DelayMS
(1);
LCD_Status=(bit)(P2&0x80);
LCD_EN=0;
returnLCD_Status;
}
voidLCD_Write_Command(ucharcmd)
{
while(LCD_Busy_Check());
RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;DelayNOP();
E=1;DelayNOP();E=0;
}
voidLCD_Set_Pos(ucharpos)
{
LCD_Write_Command(pos|0x80);
}
voidLCD_Write_Data(uchardat)
{
while(LCD_Busy_Check());
RS=1;RW=0;E=0;
P0=dat;DelayNOP();
E=1;DelayNOP();E=0;
}
voidLCD_Initialize()
{
LCD_Write_Command(0x38);DelayMS
(1);
LCD_Write_Command(0x0c);DelayMS
(1);
LCD_Write_Command(0x06);DelayMS
(1);
LCD_Write_Command(0x01);DelayMS
(1);
}
voidDisplay_String(uchar*str,ucharLineNo)
{
uchari,j=70;
for(i=0;i<200;i++){while(--j);SPK=-SPK;}
DelayMS(300);SPK=0;
}
voidDisplay_HMS(ucharh,m,s)
{
if(Settime)HMS_String[3]='>';
elseHMS_String[3]='';
HMS_String[4]=h/10+'0';
HMS_String[5]=h%10+'0';
HMS_String[7]=m/10+'0';
HMS_String[8]=m%10+'0';
HMS_String[10]=s/10+'0';
HMS_String[11]=s%10+'0';
Display_String(HMS_String,0x40)
}
voidChang_Time()
{
Settime=0;
if(K1==0||K2==0||K3==0)
{
TR0=0;
Display_String(Str2,0x00);
Settime=1;
}
while(Settime)
{if(K1==0)
{
Beep();
while(K1==0);
Change_H_or_M=!
Change_H_or_M;
}
elseif(K2==0)
{
Beep();
while(K2==0);
if(Change_H_or_M==1){if(++Hour==24)Hour=0;}
else{if(++Minute==60)Minute=0;}
}
elseif(K3==0)
{
Beep();
while(K3==0);
if(Change_H_or_M==1)
{if(--Hour==24)Hour=23;}
else
{if(--Minute==60)Minute=59;}
}
elseif(K4==0)
{
Beep();
while(K4==0);
Display_String(Str1,0x00);
Settime=0;
TR0=1;
}
Display_HMS(Hour,Minute,Second);
}
}
voidTime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++MilliSececond==20)
{
MilliSececond=0;
if(++Second==60)
{
Second=0;
if(++Minute==60)
{
Minute=0;
if(++Hour==24)
{
Hour=0;
Minute=0;
Second=0;
}
}
}
}
}
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
SPK=0;
LCD_Initialize();
Display_String(Str1,0x00);
TR0=1;
P1=0xFF;
while
(1)
{
Display_HMS(Hour,Minute,Second);
DelayMS(500);
Change_Time();
}
}