计算机科学与技术专业专升本论文.docx
《计算机科学与技术专业专升本论文.docx》由会员分享,可在线阅读,更多相关《计算机科学与技术专业专升本论文.docx(47页珍藏版)》请在冰点文库上搜索。
计算机科学与技术专业专升本论文
毕业论文
题目基于AVR的可调电子钟设计
院系名称:
计算机科学与技术
专业班级:
11专升本
学生姓名:
学号:
指导教师:
摘要
单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。
单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。
本设计就是应用单片机强大的控制功能制作而成的指针式电子钟,该指针式电子钟实现如下功能:
液晶屏模拟表盘与时分秒指针显示当前时钟,K1键用于选择调节对象,K2键用于调整时分秒,在按下K4键时确定调节值,时钟继续运行。
本设计采用的是AVR单片机,AVR系列的单片机不仅具有良好的集成性能,而且都具备在线编程接口,其中的Mega系列还具备JTAG仿真和下载功能;含有片内看门狗电路、片内程序Flash、同步串行接口SPI;多数AVR单片机还内嵌了A/D转换器、EEPROM、模拟比较器、PWM定时计数器等多种功能;AVR单片机的I/O接口具有很强的驱动能力,灌入电流可直接驱动继电器、LCD等元件。
芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。
显示器件采用LCD1602液晶,通过相应的按键调整相应的值。
通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
关键词AVR单片机
时钟芯片DS1302LCD1602液晶
第一章引言
本例采用LCD1602液晶作为显示元件,液晶屏显示当前时钟。
该电子钟实现如下功能:
液晶屏模拟表盘与时分秒指针显示当前时钟,K1键用于选择调节对象,K2键用于调整时分秒,在按下K3键时确定调节值,时钟继续运行。
本例程序包含控制模块、显示模块、实时时间计算模块、设置模块(时间设置模块)。
1.1设计任务
利用AVR单片机等实现一个简单的基于AVR的可调电子钟。
1.2设计要求
a.实现年月日时分秒指针式显示功能
b.用三个按键来实现调整时分秒的功能
第二章总体方案论证与设计
组成框图中包含显示模块,控制器,时间模块,设置模块。
显示模块有LCD1602来控制显示,整个代码实现主要由控制器来实现,时间模块有DS1302来实现,可以显示系统时间,也可自行调整,设置模块为按键处理。
具体模块分析在相关的软硬件设计中详细介绍。
本设计中的可调电子钟拟采用AVR系列单片机ATMEGA16作为主控制器,以DS1302时钟芯片和16M的外置晶振提供准确时间标准,以期实现对“时、分、秒”的数字显示和校准时间的计时装置;可调电子钟不但可以显示当前时间,而且可以显示年、月、日等,给人们的生活带来方便。
另外可调电子钟还具备日期时间的调节与写入功能。
本设计将以AVR单片机为控制核心,通过与DS1302信获取实时时间,并将得到的数据通过LCD1602液晶显示出来,同时通过相应的按键调整相应的值。
因此本设计可分为以下模块:
控制模块、显示模块、实时时间计算模块、设置模块(时间设置模块)。
第三章系统硬件设置
3.1ATmega16单片机简介
ATmega16单片机是ATmega系列AVR单片机中内容接口丰富,功能齐全,性能价格比较高的产品。
它具有高性能、低功耗的8位AVR微处理器,先进的RISC结构,非易失性程序和数据存储器等。
ATmega16单片机的中央处理器由32个8位通用寄存器,1个算术运算单元及状态和控制逻辑单元组成。
AVR采用了哈弗结构,具有独立的程序总线和数据总线,程序存储器里的指令通过一级流水线运行。
它的存储器分为独立寻址的flash程序存储器,片内SRAM数据存储器和EEPROM3部分,均采用线性编址。
图3-1
3.2ATmega16单片机的工作原理
3.2.1I/O端口的工作原理
ATmeage16单片机具有32个通用I/O口,分为PA,PB,PC,PD,每组都是八位。
这些I/O都是可以通过各自的端口寄存器设置为输入或置成输出,有些I/O口还具有第二功能。
所有的端口引脚都具有内部上拉电阻,可以通过寄存器独立选择是否连接,复位时所有的引脚都为高阻态。
ATmega16单片机的每个端口都有三个I/O寄存器地址:
数据寄存器PORTx(x=A\B\C\D,下同)、方向寄存器DDRx和输入引脚PINx。
3.2.2定时/计数器
ATmega16单片机有三个定时/计数器:
T/C0,T/C1,T/C2。
其中T/C0,T/C2是两个八位的定时/计数器,而T/C1是16位的定时/计数器。
T/Cx(0,1,2)是一个通用的带有输出比较匹配和PWM波形发生器的单通道8位定时/计数器模块。
T/Cx可以选择通过预分频器由系统时钟驱动,或通过T0引脚的外部时钟驱动,时钟逻辑模块控制使用哪个时钟源及哪个边沿来进行加或者减计数。
T/Cx(0,1,2)的时钟分频器对系统分频后作为T/Cx(0,1,2)的驱动时钟。
T/Cx(0,1,2)的时钟可以是系统时钟或者系统时钟的8分频、64分频、256分频及1024分频,通过控制寄存器TCCRx(0,1,2)。
T/Cx双缓冲结构的八位输出比较寄存器OCRx(0,1,2)一直与T/Cx(0,1,2)的计数值TCNTx(0,1,2)进行比较。
一旦TCNTx(0,1,2)等于OCRx(0,1,2),比较器就给出匹配信号。
有4种工作模式:
普通模式,CTC模式,快速PWM模式,相位修正PWM模式。
3.2.3中断系统
ATmega16单片机有21个中断源,每一个中断源都有一个独立的中断向量作为中断服务程序的入口地址,而且所有的中断源都有自己的独立的使能位。
如果全局中断I和相应使能位都置位,则在中断标志位置位时将执行中断服务程序。
一个中断产生后,全局中断使能位I将被清零,后续中断被屏蔽。
中断相关的寄存器:
MCU控制寄存器MCUCR,MCU控制和状态寄存器MCUCSR,通用中断控制寄存器GICR,通用中断状态寄存器GIFR.
3.2.4振荡器
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
3.3时钟模块设计
实时时间计算模块
方案
(1):
AVR单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。
方案
(2):
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。
综合上述两种方案,宜采用方案
(2)实现实时计时功能。
3.3.1DS1302特性介绍
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。
DS1302可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿等多种功能DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式;采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而采用时钟芯片DS1302。
3.3.2DS1302引脚介绍
图3-2
8、Vcc1:
备用电池端;
1、Vcc2:
5V电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc27、SCLK:
串行时钟,输入;
6、I/O:
数据输入输出口;
5、CE/RST:
复位脚
23、X1、X2是外接晶振脚(32.768KHZ的晶振)
4、地(GND)
3.3.3DS1302有关日历,时间的寄存器
表3-1
3.3.4DS1302与单片机接口电路
图3-3
由于DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲,因为DS1302在芯片本身已经集成了6pF电容。
所以,为了获得稳定的可靠的时钟,必须选用具有6pF负载电容的晶振。
当它工作于所要求的负载电容时,所以要选用32768HZ的晶振。
石英晶振用12M,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us那么定时器计一次数就是1us了,电容范围是在20-40pf之间的都行。
表3-2
引脚号
DS1302
AT89C51
1
I/O
P1.0
2
SCLK
P1.1
3
RST
P1.2
3.4显示模块设计
液晶显示模块
方案
(1):
数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。
要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。
由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。
方案
(2):
LCD1602是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及点阵液晶显示器组成。
可完成字符显示,也可以显示16*2字。
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。
关于行列和页的解释:
从上向下共2行,每一行为16字,汉字占32B,分左右两半,各占16B,根据在LCD上开始显示的行列号及每行的列数可以找到显示RAM对应的地址,设立光标,送上要显示的汉字的第一个字节,光标位置加一,送第二个字节,换行按列对齐。
综合比较上述两种方案,应采用LCD1602液晶组成本设计的显示模块。
3.4.1LCD1602的特性介绍
PG12864LCD是像素可寻址的图形液晶显示屏模块
芯片特性:
1.工作电压为4.5-5.5V,可自带驱动LCD所需的负电压。
2.全屏幕点阵,点阵数为16*2的字符的显示。
3.与CPU接口采用5条位控制总线和8位并行数据总线输入输出。
4.内部有显示数据锁存器,自带EL驱动。
5.简单的操作指令,显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令。
3.4.2LCD1602引脚介绍
表3-3
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0
电源地
2
VDD
+5.0V
电源电压
3
VL
-
液晶显示偏压
4
RS
H/L
RS=“H”表示选择数据寄存器
RS=“L”表示选择指令寄存器
5
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR
6
E
H/L
R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
7
D0
H/L
数据线
8
D1
H/L
数据线
9
D2
H/L
数据线
10
D3
H/L
数据线
11
D4
H/L
数据线
12
D5
H/L
数据线
13
D6
H/L
数据线
14
D7
H/L
数据线
3.4.31602内部功能器件及相关功能
1.指令寄存器(IR)
指令寄存器负责存放单片机写给HD144780的指令,对IR的操作如下:
当RS=0,R/W,E引脚由1变为0,就会把D0到D7引脚的数据送入指令寄存器IR。
2.数据寄存器(DR)
DR负责存放单片机写给CGRAM与DDRAM的数据或从CGRAM与DDRAM的数据。
对DR的操作如下:
当RS=1,R/W=1,E=1,HD44780就会把数据送到D0到D7引脚上,供单片机读取。
当RS=1,R/W=0,E引脚信号由1变为0,HD44780就会把D0到D7引脚上的数据存入DR中
3.忙标志:
BF
BF标志提供内部工作情况。
BF=1表示模块在内部操作,此时模块不接受外部指令和数据。
BF=0时,模块为准备状态,随时可接受外部指令和数据。
4.显示数据RAM(DDRAM)
DDRAM是用来存放LCD要显示的数据,只要将点阵字符图形的代码送入DDRAM,内部的控制电路就会自动将数据传送到LCD显示屏上,如果想在第一行的第一个位置显示字符“0”,那么只要把字符“0”的代码送达DDRAM的0X80地址中,在显示屏就会出现一个字符“0”。
5.字符发生器(CGROM)
HD47780芯片内含一个CGROM,存储了160个不同的点阵字符图形,如数字、字母、中文等。
CGROM用来存储设计者自行设计个性化字符造型代码的RAM,共有512bit,一个5*7的字符体占用8*8bit,因此CGRAM最多只能存放8个自定义字符。
6.地址寄存器(AC)
AC是负责计算送DDRAM,CGRAM读出的地址,或者计算写到CGRAM,DDRAM数据的地址,当单片机对CGRAM,DDRAM进行操作时,AC会依照单片机对HD47780的操作自动修改地址的计数值。
LCD1602内嵌芯片HD47780的控制功能
表3-4
RS
R/W
E
D7-D0
说明
0
1
1
数据输出
读BF与AC的值
1
0
下降沿
数据输入
写数据
0
0
下降沿
数据输入
写指令代码
1
1
1
数据输出
读数据
3.4.41602液晶与单片机接口电路
图3-4
表3-5
引脚号
1602引脚
ATMEGA16引脚
1
数据线DB0-DB7
PB0-PB7
2
寄存器选择RS
PC0
3
写RW
PC1
4
使能端E
PC2
排阻的计算公式:
上拉电源/(硬件额定电流—单片机输出电流)
一、最大值的计算原则:
要保证上拉电阻明显小于负载的阻抗,以使高电平时输出有效。
例如:
负载阻抗是10K,供电电压是5V,如果要求高电平不小于4.5V,那么,上拉电阻最大值R大5-4.5)=10:
5
R大=1K
也就是最大值1k,(如果超过了1k,输出的高电平就小于4.5V了)
二、最小值的计算原则:
保证不超过管子的额定电流(如果不是场效应管而是三极管也可依照饱和电流来计算)
例:
管子的额定电流150mA,放大倍数100,基极限流电阻10k,工作在5v的系统中。
那么,算法如下:
Ib=U/R=(5-0.7)/10=0.47(mA)
Ic=100*0.47=47mA小于额定的150,所以可以按饱和法来算最小值。
上拉电阻最小值
R小=5v/47mA=106欧姆(如果小于这个电阻,管子就会过饱和而没有意义了。
如果大于这个值,管子的导体电阻就会变大一些,所以太高也不利于低电平的输出)
3.5设置模块
设置模块采用四个按键与PD连接
按键与单片机的接口电路
图3-5
按键的断开与闭合式由机械触点的动作实现。
由于机械的弹性作用在按键的断开与闭合过程中会产生抖动。
此抖动的脉冲会给单片机带来误判断,所以必须消除。
消除抖动可以从软件和硬件两方面入手。
本设计采用软件消除抖动,从按键断开到稳定闭合,此抖动的时间一般为5ms到10ms。
所以当单片机检测到有按键被按下时候,就延时一段时间。
单片机与键盘的连接方式可分为独立式,编码式,串口扩展式和矩阵式。
其中较为常用的有独立式和矩阵式。
本设计采用独立式按键,也就是每一个按键都与端口独立连接,每一个按键独立占一根输入线,一根输入线的工作状态不会影响其他按键。
独立式按键通过检测电平的状态可以很容易判断出有没有按键被按下。
独立式的电路配置灵活,软件算法简单。
3.6振荡电路
本设计芯片选用内部振荡器方式。
由于本设计的时间由内部定时器中断与软件计数相结合产生的,所以从计算方便以及系统的效率上考虑,本设计选用12MHz频率的晶振,电路原理图如下:
图3-6atmage16的振荡电路
经厂家推荐稳定电路的电容C1,C2=22uf,C3为10uf。
3.7复位电路
Atmega16有5个复位源:
上电复位、外部复位、看门狗复位、掉电检测复位及JTAG复位。
复位时所有的I/O寄存器都被设置为初始值,程序从复位向量开始执行。
本设计使用上电复位电路。
单片机晶振为12MHz,起振时间将近1ms,单片机2个机器周期的时间为2us。
单片机每次上电复位所需的最短延时应该不小于treset。
这里,treset等于上电延时与起振延时之和。
从实际上讲,延迟一个treset往往还不够,不能够保障单片机有一个良好的工作开端。
复位电路把单片机锁定在复位状态上并且维持一个延时(记作TRST),以便给予电源电压从上升到稳定的一个等待时间;在电源电压稳定之后,再插入一个延时,给予时钟振荡器从起振到稳定的一个等待时间;在单片机开始进入运行状态之前,还要至少推迟2个机器周期的延时间。
单片机是高电平的时候复位,一般是用电阻和电容组成的,电容充电的时RST复位端为高电平,此时单片机开始复位..电容充电完成,此时单片机复位完成。
由此电容值可取10uf,电阻值取10KΩ。
详细见附录文件(电容充电时间的计算方法.pdf)
图3-7Atmage上电复位电路
第四章系统软件设计
软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。
因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用Atmage16编写。
程序框图如下:
没有按键按下
初始化
显示界面
从DS1302读取信息
1602液晶显示相关信息
判断是否有按键按下
时间,日期设置模块
初始化
显示界面
从DS1302读取信息
1602液晶显示相关信息
判断是否有按键按下
4.1时钟函数模块
具体实现含有向DS1302串行写入一字节即DS1302writeByte,从DS1302读取一字节即DS1302OreadByte,从DS1302指定位置读数据Read1302,向DS1302某地址写入数据Write1302,设置时间set_clock,从DS1302获取时间(读取当前时间),get_time利用这些函数来实现时间,最终显示在液晶屏上,可以自行调整。
你可以显示系统时间,也可以显示调整时间,具体实现是设置时间函数。
4.1.1实现功能
能够显示年月日时分秒和星期,完成了24小时和12小时之间的切换,并设有闹钟,闹钟存放于EEPROM中,时间和星期以及闹钟均可调。
其中闹钟掉电数据不会丢失。
4.1.2函数设计
1:
voidDS1302writeByte(uchar_data)
(1)功能
向DS1302中写入一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
(3)右图为流程图:
2:
ucharDS1302OreadByte(void)
(1)功能
从DS1302中读取一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个上升沿可向DS1302中
读取一位数据。
(3)右图为流程图:
3:
ucharRead1302(ucharucAddr)
(1)功能
从指定的地址中读取一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
在启动DS1302时每产生一个上升沿可向DS1302中读取一位数据。
(3)下图为流程图:
4:
voidWrite1302(ucharucAddr,ucharucDa)
(1)功能
向DS1302指定地址中写入一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
在启动DS1302时每产生一个上升
沿可向DS1302中读取一位数据。
(3)右图为流程图:
5:
voidaffirm_data(void)
(1)功能
输入数据入转换函数、将十进制转换成BCD码
(2)依据
转换公式。
(3)下图为流程图:
6:
voidget_time(uchar*time)
(1)功能
读取当前时间,并判断当前是12小时显示还是24小时显示。
(2)依据
通过对标志位的判断来确定当前为12小时制还是24小时制,如果为12小时时要将DS1302寄存器内相应位置1。
(3)右图为流程图:
7:
voidset_clock(void)
功能
向DS1302中写入初始时间,启动DS1302振荡器,判断上下午。
(1)依据
DS1302时序图(详见SD1302技术资料)。
8:
voidformat_datetime(uchard,uchar*a)
(1)功能
将数字转换成字符。
(2)依据
ASII码表。
9:
voidinit_1302(void)
功能
启动DS1302振荡器。
(1)依据
由DS1302的技术资料知,DS1302的秒寄存器的最高位为振荡器控制位,向该位置一即可启动振荡器
4.2显示函数模块
检测LCD是否忙rd_bf(),向LCD发送命令wr_dictate()向lcd发送数据wr_data()初始化1602显示init_lcd(),初始化1602显示屏show_function(通用显示函数)。
显示字符和汉字的字模是用相应的软件导出的,根据液晶显示屏的要求对时钟进行调整。
4.2.1实现功能
通过1602显示电子时钟
4.2.2函数设计
1:
voidrd_bf(void)
(1)功能
检测LCD是否忙碌
(2)依据
通过判断HD47780内部是否处于空闲状态等待单片机进行读写操作
2:
voidwr_dictate(uchardictate)
(1)功能