单片机最小系统.docx

上传人:b****8 文档编号:30267607 上传时间:2023-08-13 格式:DOCX 页数:14 大小:77.52KB
下载 相关 举报
单片机最小系统.docx_第1页
第1页 / 共14页
单片机最小系统.docx_第2页
第2页 / 共14页
单片机最小系统.docx_第3页
第3页 / 共14页
单片机最小系统.docx_第4页
第4页 / 共14页
单片机最小系统.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机最小系统.docx

《单片机最小系统.docx》由会员分享,可在线阅读,更多相关《单片机最小系统.docx(14页珍藏版)》请在冰豆网上搜索。

单片机最小系统.docx

单片机最小系统

基于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();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1