LCD电子钟的设计单片机课程设计.docx
《LCD电子钟的设计单片机课程设计.docx》由会员分享,可在线阅读,更多相关《LCD电子钟的设计单片机课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
LCD电子钟的设计单片机课程设计
摘要
单片机,是集CPU、RAM、ROM、定时器、计数器和多种接口于一体的微控制器。
自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。
它体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易,广泛应用于智能生产和工业自动化上。
本系统为基于DS1302的多功能电子钟,以AT89C51单片机作为主控芯,采用实时时钟芯片DS1302,使用LCD1602液晶作为显示输出。
该系统走时精确,具有显示时、分、秒的功能,本文将详细介绍AT89C51单片机和DS1302时钟芯片的基本原理,从软件和硬件电路的实现两大方面进行分析。
关键词 :
AT89C51单片机 LCD液晶屏 DS302时钟芯片
第一章绪论
在新的世纪我们已经步入了第二个十年,随着全球经济的复苏和发展,由于在世界范围内人类需求的巨大释放,以及消费结构的升级,同时传统能源的稀缺以及带来的环境的破坏,都将带来新一轮的科技革命的巨变。
因此,更适合人类社会协调、健康、可持续发展的新能源、新材料等便应运而生。
LCD作为一种新的材料,LCD的设计制造技术与应用水平上都得到了迅速的提高,生产也得到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。
然而随着人们生活节奏的加快,时间对人们的重要性也越来越重要,因此,拥有一个不错的时钟对人们的生活将带来很大的方便。
时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?
这就要求人们不断设计出新型时钟。
1.1AT89C51单片机概述
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
AT89C51单片机有40个引脚,其中包含2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
1.2LCD概述
LCD液晶显示器是LiquidCrystalDisplay的简称,LCD的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。
LCD可以分为为两种类型,一种是文字模式LCD,一种是绘图模式LCD。
LCD1602属于字符型液晶,能够同时显示16x2即32个字符。
可以与8位CPU相联,指令功能强可以组合成各种输入、显示、移位方式以满足不同要求。
显示黄绿带背光,显示对比度可以调节,正常工作电压(VDD)为+5V,工作电流约为2mA(不计背光功耗),同时可靠性高寿命达50,000小时(25℃)。
1.3DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
时钟可工作在24小时格式或12小时(AM/PM)格式。
DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。
可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
1.4本设计任务
本系统以单片机芯片为核心部件,利用合理的程序控制,在液晶显示屏上实现各个功能并且显示等功能,使其显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
第2章总体方案论证与设计
本设计采用AT89C51单片机作为本系统的控制模块。
单片机可把DS1302中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。
以LCD液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化。
在显示电路中,主要靠按键来实现各种显示要求的选择与切换。
下面对各模块的设计逐一进行论证比较。
2.1显示部分
显示部分是本次设计的重要部分,一般有以下两种方案:
方案一:
采用LED显示,分静态显示和动态显示。
对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。
而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。
方案二:
采用LCD显示。
LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。
鉴于上述原因,我们采用方案二。
2.2数字时钟
数字时钟是本设计的核心的部分。
根据需要可采用以下两种方案实现:
方案一:
方案完全用软件实现数字时钟。
原理为:
在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。
该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。
而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
方案二:
方案采用Dallas公司的专用时钟芯片DS1302。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。
2.3总体硬件组成框图
本系统的电路系统框图如图2-1所示。
AT89C51单片机对DS1302写入控制字并读取相应的数据,继而控制LCD1602作出对应的显示。
AT89C51
主控模块
图2-1总体硬件组成框图
第3章系统硬件设计
3.1AT89C51单片机最小系统
最小系统包括晶体振荡电路、复位开关和电源部分。
图3-1为AT89C51单片机的最小系统。
图3-1最小系统电路
3.2时钟模块
时钟模块采用DS1302芯片,DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM指示决定采用24或12小时格式DS1302与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线:
RST复位、I/O数据线、SCLK串行时钟。
时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。
DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW,其接线电路如图3-2。
图3-2时钟电路
3.3LCD液晶显示模块
LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作时电流仅2.0mA/5.0V。
通过编程实现自动关闭屏幕能够更有效的降低功耗。
LCD1602分两行显示,每行可显示多达16个字符。
LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制,并且还能利用空余的空间自定义字符。
其接线如图3-3。
图3-3LCD显示电路
3.4按键模块
它是整个系统中最简单的部分,根据功能要求,本系统共需四个按键:
进入设定、时设定、分设定、确认设式键采用独立式按键。
如图3-4所示。
图3-4按键电路
3.5整体电路
系统整体电路如图3-5所示:
图3-5系统总体电路图
第4章系统的软件设计
4.1主程序设计
主流程图说明:
程序开始运行时先初始化时钟控制器件DS1302、显示器件LCD1602,然后打开LCD1602,再读取时间,把读取的数据送入LCD1602进行显示,时间进行调整。
其主程序流程如图4-1所示。
图4-1主程序流程图
4.2时间设定程序流程
时间设定流程图说明:
程序开始后初始化DS1302,然后从DS1302中读出数据,放入RAM中,然后调用显示子程序,使LCD1602相应的模块显示温度,其间也可对温度进行设置,设置完成后把数据重新送入RAM中,再由LCD1602相应模块显示,整个过程由此反复进行。
图4-2显示时间子程序流程
第5章系统调试与测试结果分析
5.1使用的仪器仪表
数字万用表、秒表、电源
5.2系统调试
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:
温度测量模块的调试,时钟模块的调试,LCD液晶显示模块的调试等,最后将各模块组合后进行整体测试。
5.2.1硬件调试
对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。
5.2.2软件调试
软件调试采用单片机仿真器WAVE6000L及微机,将编好的程序进行调试,主要是检查语法错误。
5.2.3硬件软件联调
将调试好的硬件和软件进行联调,主要调试系统的实现功能。
5.3测试结果
此次系统设计结果较好,能动态显示实时时钟的时、分、秒,数据显示,能够实现时钟的定时,并且具有调整时间的功能。
过了一段时间,仿真显示如图5-2所示。
图5-2
(1)
图5-2
(2)
设计心得体会
在这个一个星期的时间里我学到了很多宝贵的知识和单片编程的经验,在这次课程设计过程中我遇到了许多困难和问题,其中一些我通过自己上网找资料和询问同学的方式找到了解决的方法,就是在这个过程中我学会了许多书本上学不到的东西,还有一些是我自己解决不了的问题,这些问题都是需要靠我以后的经验积累和不断的学习才能得到解决的,从这次课程设计中我体会到了自己用汗水换来的成果的喜悦。
我在刚开始设计这个东西时是一头雾水,没有一个方向和目标,后来从网上找到一些有关的资料通过相似的题目我一步一步的完成我自己的课程设计的功能,尤其是在编写程序的时候,每一个模块都要经过非常仔细的考虑后在写,因为程序的运行过程中需要考虑各个模块之间的影响和互助,有一些模块是我们没有学习过的我从网上找到相似的然后经过修改变成我能用的,在这之间我锻炼了我的变成能力。
电路的设计相对编程来说要容易一些,总体来说电路图都是大同小异的,只是他们中的分支做一些修改来。
最重要的学习就是一个课程设计的过程的整体思路,先做什么后做什么最后来一个总结经验的过程,这给我以后的设计过程打下了基础,这次设计中,我深刻体会到专研的重要性,一个看似简单的系统,却需要着大量的知识储备和很强的专研精神,理论和实践往往是两回事,理论上很简单的事情在实际操作中往往会遇到很多意想不到的困难,学科的知识不光来自于书本知识,更来自于实践。
由于水平和经验的有限,系统可能仍存在一些缺点或者有更多更好的功能或方法可以加进去,望各位老师、同学指正。
参考文献
[1]求是科技.单片机典型模块设计实例导航.北京:
人民邮电出版社.2005.8
[2]徐淑华,程退安等.单片微型机原理及应用.哈尔滨:
哈尔滨工业大学出版社.2005.1
[3]孙余凯.精选实用电子电路260例.北京:
电子工业出版社.2007.6
[4]殷春浩,崔亦飞.电磁测量原理及应用.徐州:
中国矿业大学出版社.2003.7
[5]《LCD1602A数据手册》
[6]《DS1302数据手册》
[7]张义和.例说51单片机[M].北京:
人民邮电出版社,2010年
[8]阎石编著数字电子技术基础(第五版)北京高等教育出版社]2006.1~550
[9]蔡明文冯先成主编单片机课程设计华中科技大学出版社2007.3
[10]陈明萤编著8051单片机课程设计实训教材清华大学出版社2004
[11]黄智伟编著全国大学生电子设计竞赛电路(第一版)航空航天大学出版社2006.36
附录程序
#include
#include
//#include"LCD1602.h"
//#include"DS1302.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitDS1302_CLK=P1^7;//实时时钟时钟线引脚
sbitDS1302_IO=P1^6;//实时时钟数据线引脚
sbitDS1302_RST=P1^5;//实时时钟复位线引脚
sbitwireless_1=P3^0;
sbitwireless_2=P3^1;
sbitwireless_3=P3^2;
sbitwireless_4=P3^3;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
charhide_sec,hide_min,hide_hour,;//秒,分,时位闪的计数
sbitSet=P2^0;//进入设置时间键
sbitHour=P2^1;//设置小时键
sbitMin=P2^2;//设置分钟键
sbitout=P2^3;//立刻跳出调整模式按钮
chardone,count,temp,flag,up_flag,down_flag;
ucharTempBuffer[5],week_value[2];
voidshow_time();//液晶显示程序
/***********液晶显示部分子程序****************/
//PortDefinitions
sbitLcdRs=P2^5;
sbitLcdRw=P2^6;
sbitLcdEn=P2^7;
sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
unsignedcharLCD_Wait(void)
{
LcdRs=0;
LcdRw=1;_nop_();
LcdEn=1;_nop_();
LcdEn=0;
returnDBPort;
}
//初始化LCD
voidLCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动
}
voidPrint(unsignedchar*str)
{
while(*str!
='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/***********DS1302时钟部分子程序******************/
typedefstruct__SYSTEMTIME__
{
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
}SYSTEMTIME;//定义的时间类型
SYSTEMTIMECurrentTime;
#defineAM(X)X
#definePM(X)(X+12)//转成24小时制
#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间
#defineDS1302_MINUTE0x82
#defineDS1302_HOUR0x84
voidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数)
{
unsignedchari;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;//相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
}
unsignedcharDS1302OutputByte(void)//实时时钟读取一字节(内部函数)
{
unsignedchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;//相当于汇编中的RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:
DS1302地址,ucData:
要写的数据
{
DS1302_RST=0;//Write1302(0x8e,0x00);
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);//地址,命令
DS1302InputByte(ucDa);//写1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
}
unsignedcharRead1302(unsignedcharucAddr)//读取DS1302某地址的数据
{
unsignedcharucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01);//地址,命令
ucData=DS1302OutputByte();//读1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
voidDS1302_GetTime(SYSTEMTIME*Time)//获取时钟芯片的时钟数据到自定义的结构型数组
voidTimeToStr(SYSTEMTIME*Time)//将时,分,秒数据转换成液晶显示字符放到数组TimeString[];
{
if(hide_hour<2)
{
Time->TimeString[0]=Time->Hour/10+'0';
Time->TimeString[1]=Time->Hour%10+'0';
}
else
{
Time->TimeString[0]='';
Time->TimeString[1]='';
}
Time->TimeString[2]=':
';
if(hide_min<2)
{
Time->TimeString[3]=Time->Minute/10+'0';
Time->TimeString[4]=Time->Minute%10+'0';
}
else
{
Time->TimeString[3]='';
Time->TimeString[4]='';
}
Time->TimeString[5]=':
';
if(hide_sec<2)
{
Time->TimeString[6]=Time->Second/10+'0';
Time->TimeString[7]=Time->Second%10+'0';
}
else
{
Time->TimeString[6]='';
Time->TimeString[7]='';
}
Time->DateString[8]='\0';
}
voidInitial_DS1302(void)//时钟芯片初始化
{
unsignedcharSecond=Read1302(DS1302_SECOND);
if(Second&0x80)//判断时钟芯片是否关闭
{
Write1302(0x8e,0x00);//写入允许
Write1302(0x8c,0x07);//以下写入初始化时间
Write1302(0x88,0x07);
Write1302(0x86,0x25);
Write1302(0x8a,0x07);
Write1302(0x84,0x23);
Write1302(0x82,0x59);
Write1302(0x80,0x55);
Write1302(0x8e,0x80);//禁止写入
}
}
答辩记录及评分表
课题名称
LCD电子钟的设计
答辩教师(职称)
臧大进宋洪儒
答辩时间
2013~2014学年第2学期第15周
答
辩
记
录
评分表
学生姓名
学号
评分