单片机电子万历设计分析方案书Word下载.docx
- 文档编号:19059130
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:19
- 大小:185.48KB
单片机电子万历设计分析方案书Word下载.docx
《单片机电子万历设计分析方案书Word下载.docx》由会员分享,可在线阅读,更多相关《单片机电子万历设计分析方案书Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
LCD液晶显示屏作为显示。
2系统的硬件设计与实现
2.1电路设计框图
图1系统原理图
2.2系统硬件概述
本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;
温度的采集由DS18B20构成;
显示部份由LCD液晶显示屏显示。
2.3主要单元电路的设计
2.3.1单片机主控制模块的设计
AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口<
P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
如图2所示:
图2主控制系统
2.3.2时钟电路模块的设计
图.3示出DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768KHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。
中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端<
双向)。
SCLK始终是输入端。
图3DS1302的引脚图
2.3.3电路原理及说明
(1>
时钟芯片DS1302的工作原理:
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;
读/写时序如下图4所示。
DS1302的控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。
对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0,位1至位5指操作单元的地址。
位0是读/写操作位,进行读操作时,该位为1;
该位为0则表示进行的是写操作。
控制字节总是从最低位开始输入/输出的。
表.2为DS1302的日历、时间寄存器内容:
“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;
当该位为0时,时钟开始运行。
“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。
当“WP”为1时,写保护位防止对任一寄存器的写操作。
(2>
DS1302的控制字节:
DS1302控制字节的高有效位<
位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位<
位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出
(3>
数据输入输出<
I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
(4>
DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写>
、FFH(读>
。
2.3.4显示模块的设计
如图.4为LCD显示模块,和最小系统上的连线一样,无需修改。
图-4LCD液晶显示屏显示模块
3系统的软件设计
3.1程序流程框图
图5主程序流程图
图6时间调整程序流程图
4测试与结果分析
4.1硬件测试
电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。
在本成电子万年历的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:
<
1)LCD液晶显示屏显示部分已经连在最小系统上,节省了不少时间和精力。
2)对万年历修改时间或日期时,有时LCD液晶显示屏被屏蔽掉,造成不亮现象。
解决:
根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。
4.2软件测试
电子万年历是多功能的数字型,可以看当前日期,时间。
电子万年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。
最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。
在软件的调试过程中遇到的主要问题是:
1.烧入程序后,LCD液晶显示屏显示亮度不好。
解决:
一遍旋转10K欧的滑动变阻器,一遍观看LCD显示屏,知道看到合适的亮度为止。
4.3测试结果分析与结论
4.3.1测试结果分析
1.在测试中遇到LCD液晶显示屏为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏,滑动变阻器器没有调好:
查看烧写的程序是否正确无误,对程序进行认真修改。
4.3.2测试结论
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。
同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。
5课设总结
在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。
较好的完成了作品,达到了预期的目的,完了最初的设想。
在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。
反而达到事半功倍的效果。
对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。
程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。
在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。
也练就了我们的耐心,做什么事都在有耐心。
此次比赛中学到了很多很多东西,这是最重要的。
总之,此次课设使我的能力得到了全方位的提高。
致谢
感谢学院给我提供了一个展现自己的舞台,给我一次难得煅炼的机会,使得我的动手能力和专业技能都有了很大的提高。
在做课设的日子里得到了陈老师王老师的悉心指导,在此向他们致以诚挚的谢意。
感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我们对这次的作品完成有了信心和动力,也给了我们很多无私的帮助和支持,我们在此深表谢意。
参考文献
1刘勇编数字电路电子工业出版社2004
2陈正振编电子电路设计与制作广西交通职业技术学院信息工程系2007
3杨子文编单片机原理及应用西安电子科技大学出版社2006
4王法能编单片机原理及应用科学出版社2004
附录一:
系统电路图
附录二:
系统程序清单
#include<
REG51.H>
intrins.h>
//#include"
LCD1602.h"
DS1302.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitDS1302_CLK=P1^7。
//实时时钟时钟线引脚
sbitDS1302_IO=P1^6。
//实时时钟数据线引脚
sbitDS1302_RST=P1^5。
//实时时钟复位线引脚
sbitACC0=ACC^0。
sbitACC7=ACC^7。
charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year。
//秒,分,时到日,月,年位闪的计数
sbitSet=P2^0。
//模式切换键
sbitUp=P2^1。
//加法按钮
sbitDown=P2^2。
//减法按钮
sbitout=P2^3。
//立刻跳出调整模式按钮
chardone,count,temp,flag,up_flag,down_flag。
ucharTempBuffer[5],week_value[2]。
voidshow_time(>
//液晶显示程序
/***********1602液晶显示部分子程序****************/
//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。
LcdEn=0。
returnDBPort。
}
//向LCD写入命令或数据************************************************************
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput>
{LcdEn=0。
LcdRs=style。
LcdRw=0。
_nop_(>
DBPort=input。
//注意顺序
LcdEn=0。
LCD_Wait(>
}
//设置显示模式************************************************************
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode>
{LCD_Write(LCD_COMMAND,0x08|DisplayMode>
//设置输入模式************************************************************
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode>
{LCD_Write(LCD_COMMAND,0x04|InputMode>
//初始化LCD************************************************************
voidLCD_Initial(>
LCD_Write(LCD_COMMAND,0x38>
//8位数据端口,2行显示,5*7点阵
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR>
//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN>
//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE>
//AC递增,画面不动}
//液晶字符输入的位置************************
voidGotoXY(unsignedcharx,unsignedchary>
{if(y==0>
LCD_Write(LCD_COMMAND,0x80|x>
if(y==1>
LCD_Write(LCD_COMMAND,0x80|(x-0x40>
>
//将字符输出到液晶显示
voidPrint(unsignedchar*str>
{while(*str!
='
\0'
{LCD_Write(LCD_DATA,*str>
str++。
}}
/***********DS1302时钟部分子程序******************/
typedefstruct__SYSTEMTIME__
{
unsignedcharSecond。
unsignedcharMinute。
unsignedcharHour。
unsignedcharWeek。
unsignedcharDay。
unsignedcharMonth。
unsignedcharYear。
unsignedcharDateString[11]。
unsignedcharTimeString[9]。
}SYSTEMTIME。
//定义的时间类型
SYSTEMTIMECurrentTime。
#defineAM(X>
X
#definePM(X>
(X+12>
//转成24小时制
#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间
#defineDS1302_MINUTE0x82
#defineDS1302_HOUR0x84
#defineDS1302_WEEK0x8A
#defineDS1302_DAY0x86
#defineDS1302_MONTH0x88
#defineDS1302_YEAR0x8C
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>
//实时时钟读取一字节(内部函数>
{ACC=ACC>
1。
//相当于汇编中的RRC
ACC7=DS1302_IO。
DS1302_CLK=0。
}
return(ACC>
voidWrite1302(unsignedcharucAddr,unsignedcharucDa>
//ucAddr:
DS1302地址,ucData:
要写的数据
{DS1302_RST=0。
DS1302_RST=1。
DS1302InputByte(ucAddr>
//地址,命令
DS1302InputByte(ucDa>
//写1Byte数据
DS1302_RST=0。
}unsignedcharRead1302(unsignedcharucAddr>
//读取DS1302某地址的数据
{unsignedcharucData。
DS1302InputByte(ucAddr|0x01>
//地址,命令
ucData=DS1302OutputByte(>
//读1Byte数据
return(ucData>
voidDS1302_GetTime(SYSTEMTIME*Time>
//获取时钟芯片的时钟数据到自定义的结构型数组
{unsignedcharReadValue。
ReadValue=Read1302(DS1302_SECOND>
Time->
Second=((ReadValue&
0x70>
4>
*10+(ReadValue&
0x0F>
ReadValue=Read1302(DS1302_MINUTE>
Minute=((ReadValue&
ReadValue=Read1302(DS1302_HOUR>
Hour=((ReadValue&
ReadValue=Read1302(DS1302_DAY>
Day=((ReadValue&
ReadValue=Read1302(DS1302_WEEK>
Week=((ReadValue&
ReadValue=Read1302(DS1302_MONTH>
Month=((ReadValue&
ReadVal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 万历 设计 分析 方案