基于单片机的数字钟设计摘要
基于单片机的数字钟的设计与实现
摘 要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应
用正在不断地走向深入,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次做的数字钟是以单片机(ATMEGA16)为核心,由于它具有功能强,
体积小,功耗低,价格便宜,工作可靠,使用方便等。数字时钟采用了性能优秀的ATMEGA16,结合了共阴极LED 、数码显示器、BCD-锁存/7段译码/驱动器,这些元件来控制时钟的显示、调整和校对。通过multisim 软件进行仿真制作,达到制作简易数字钟的目的。数字时钟能够准确显示时间(显示格式为时时:分分,24小时制),而且可以显示年、月、日、时、分、秒、周。其硬件部分难点在于元器件的选择、布局及焊接。
关键词:ATMEGA 16;数码管显示;键盘输入;USB 接口电源
BASED ON SINGLE-CHIP DIGITAL CLOCK DESIGN AND
IMPLEMENTATION
ABSTRACT
In recent years, with the field of computer penetration in the community and the
development of large-scale integrated circuits, microcontroller applications are continually deepening.It is particularly suited to control systems and, more widely used in automatic control, intelligent of instruments, meters, data acquisition, military products, as well as household appliances and other fields. single-chip microcomputer often use as a core component,in accordance with the specific hardware architecture, as well as application-specific features of the software object to be perfect.
This article is based on single-chip digital clock (ATMEGA16) as the core,
because it has a strong functions, small size, low power consumption, cheap, reliable and easy to use and so on. Digital Clock using the excellent performance of ATMEGA16, combined with a total of cathode LED, digital displays, BCD-latch / 7 decoder / driver, these components to control the clock display, adjustment and proofing. Through the production of multisim simulation software to create simple digital clock purposes. Able to accurately show the number of clock time (display format hh: mm: seconds seconds, 24-hour system), and can display year, month, day, hour, minute, second, week. Difficult part of the hardware is the choice of components, layout and welding.
Key words: ATMEGA16; digital tube display; keyboard input; USB port power
supply
目 录
1 前 言 . ............................................................................................................................................ 1
2 系统设计 . ...................................................................................................................................... 2
2.1 电路组成及工作原理 . ...................................................................................................... 2
2.2 硬件部分 . .......................................................................................................................... 2
2.2.1 单片机系统 . .......................................................................................................... 2
2.2.2 A TMEGA16的主要性能参数: ....................................................................... 2
2.3 显示部分 . .......................................................................................................................... 3
2.3.1 LED 显示结构与原理 .......................................................................................... 3
2.3.2 LED 显示器接口及显示方式 .......................................................................... 4
2.4 键盘工作模块 . .................................................................................................................. 5
2.4.1 独立式按键结构 . .................................................................................................. 6
2.4.2 独立式按键的软件结构 . ...................................................................................... 6
2.5 USB 接口电源 ................................................................................................................. 6
2.6 74HC 595驱动模块 .......................................................................................................... 7
2.7 DS1302时钟实现模块 . ..................................................................................................... 7
2.7.1 DS1302简介 . ......................................................................................................... 7
2.7.2 DS1302与CPU 的连接 . ......................................................................................... 8
3 硬件实现及单元电路设计 . .......................................................................................................... 9
3.1主板电路的设计 . ............................................................................................................... 9
3.2外部电路的设计 . ............................................................................................................. 11
4 软件设计 . .................................................................................................................................... 13
4.1 软件设计思路 . ................................................................................................................ 13
4.2 程序文件 . ........................................................................................................................ 13
5 系统调试 . .................................................................................................................................... 27
5.1 硬件调试 . ........................................................................................................................ 27
5.2 软件调试 . ........................................................................................................................ 27
6 结论............................................................................................................................................. 28
参考文献 . ........................................................................................................................................ 29
致 谢............................................................................................................................................... 30
基于单片机数字时钟的设计与实现
1 前 言
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而 ATMEGA16单片机是各单片机中典型代表的一种。这次毕业设计通过对它的学习、应用,以AVR MEGA16芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由直流电源供电,通过数码管能够准确显
数字时钟是现代社会应用广泛的计时工具,在航天、电子等科研单位,工厂、医院、学校等企事业单位,各种体育赛事及至我们每个人的日常生活中都发挥着重要的作用。本系统是基于ATMEGA16单片机设计的一个具有四位LED 显示的数字时实时钟,采用独立式按键进行时间调整。该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。
本篇论文所做的数字时钟,是以ATMEGA16为核心,配合使用74HC 595驱动数码管,DS 1302时钟芯片等实现了用数码管显示,键盘调整的功能。实现时钟的多功能显示时间,通过C 语言编程实现数字时钟的年、月、日、时、分、秒、周。
2 系统设计
2.1 电路组成及工作原理
本文数字时钟设计原理主要利用ATMEGA16单片机, 由单片机的P 0口控制数码管的位显示, P 2口控制数码管的段显示,P 1口与按键相接用于时间的校正。在设计中引入两个电源电路,一个是外部电源系统产生+5V 电压,用于给CPU 及显示电路提供工作电压,这是数字时钟正常工作时的总电压。
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“年”、“月”、“日”、“时”、“分”、“秒”、“周”,计数器的输出,通过四个七段LED 显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“年”、“月”、“日”、“时”、“分”、“秒”、“周”,显示数字进行校对调整。
2.2 硬件部分
2.2.1 单片机系统
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理) 的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口) ,可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED 驱动电路) ,脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。
2.2.2 ATMEGA16的主要性能参数:
本文采用的单片机为ATMEGA16,ATMEGA16高性能,低功耗的AVR 8位微控制器。采用ATMEL 公司的 ATMEGA16L 单片机作为主控制器。ATMEGA16L 是一个低功耗,高性能的8位单片机,片内含16K 空间的可反复擦些10,000次的FLAsH 只读存储器,具有1Keytes 的随机存取数据存储器(RAM ),32个I\O口,2个8位可编程
定时计数器,1个16位可编程定时计数器,四通道PWM ,内置8路10 位ADC 。且ATMEGA16系列的单片机可以在线编程、调试,方便地实现程序的下载与整机的调试。其管脚图如图2-1所示。
图2-1 ATMEGA16管脚图
2.3 显示部分
单片机应用系统中使用的显示器主要有发光二极管显示器,简称LED (LIGHT EMITTING DIODE);液晶显示器LCD (LIQUID CRYsTAL DIsPLAY );近几年也有配置CRT 显示器的。而目前在单片机系统中,通常用LED 数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
2.3.1 LED 显示结构与原理
单片机中通常用七段LED 构成字型“8”,另外,还有一个小数点发光二极管以显示小数位!这种显示器有共阴和共阳两种!发光二极管的阳极连在一起的(公共端)称为共阳极显示器,阴极连在一起的称为共阴极显示器。
一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划(段)A_G, 另一个小数点为DP 发光二极管。当在某段发光二极管上施加一定的正向电压时,该段笔画即亮;不加电压则暗。为了保护各段LED 不被损坏,需外加限
流电阻。
由于共阴极连接需加驱动,故在这里我采用的是共阳阳极连接。
以共阳极LED 为例,各LED 公共阳极K0接高电平,若向各控制端A,B ,…G ,DP 顺次送入00011110信号,则该显示器显示“⒎”字型。
共阴极7段LED 显示数字0 ~ F、文字、符号及小数点的编码(A 段为最低位,DP 点为最高位)如(图2-1)所示。
表2-1 共阴极7 段LED 显示字型编码表
2.3.2 LED 显示器接口及显示方式
LED 显示器有静态显示方式和动态显示方式两种。静态显示就是当显示器显示某个字符时,相应的段恒定的导通或截止,直到显示另一个字符为止。LED 显示器工作于静态显示方式时,各位的共阴极接地;若为共阳极则接+5V 电源。每位的段选线分别与一个8位锁存器的输出口相连,显示器中的各位相互独立,而且各位的显示字符一经确定,相应锁存的输出将维持不变。
正因为如此,静态显示器的亮度较高。这种显示方式编程容易,管理也较简单,但占用I/O口线资源较多。因此,在显示位数较多的情况下,一般都采用动态显示方式。
由于所有4位段皆由一个I/O口控制,因此,在每一瞬间,4位LED 会显示相 同的字符。要想每位显示不同的字符,就必须采用扫描方法轮流点亮各位LED ,即在每一瞬间只使某一位显示字符。在此瞬间,段选控制I/O口输出相应字符段选码(字型码),而位选(如图2-2所示)则控制I/O口在该显示位送入选通电平(因为LED 为共阴,故应送低电平),以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。例如,要求显示“LL 0-20”时,I/O1和I/O2轮流送入段选码、位选码。
图2-2 位LED 动态显示电路
在多位LED 显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制。而共阴(共阳)极公共端分别由相应的I/O口线控制,实现各位的分时选通。
段选码,位选码每送入一次后延时1MS ,因人的视觉暂留时间为0.1S (100MS ),所以每位显示的时间不能超过20MS ,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管总在亮。这种方式称为软件扫描方式。
2.4 键盘工作模块
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。在本套设计中由于只需要几个功能键,此时,可采用独立式按键结构。
2.4.1 独立式按键结构
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键电路如图2-3所示。
图2-3 独立式按键电路
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大。
2.4.2 独立式按键的软件结构
独立式按键的软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
2.5 USB 接口电源
USB+POWER连接器可使外设直接通过USB+POWER接口实现从主机供电,无需额外的电源连接。可用于库存管理、零售扫描、工业处理、游戏器件应用,U S B +POWER 也可应用于PO S 器件,可作为外设,通常为扫描仪和主机之间的I/O设备。
USB+POWER连接器符合U S B 2.0标准,插座在电路板上安装,提供标准过孔安装和板内安装。插头和插座根据工作电压的不同用颜色区分并对应吻合,以确保可靠接
触,工作电压提供5V 、12V 或24V ,允许标准USB 电缆插头插入USB+POWER插座的USB 口。
2.6 74HC 595驱动模块
74HC 595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SHCP 的上升沿输入,在STCP 的上升沿进入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS ),和一个串行输出(Q 7’),和一个异步的低电平复位(MR ),存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE 时(为低电平),存储寄存器的数据输出到总线。图2-4。
如本设计采用LPC 2103自带的硬件SPI 接口与74HC 595进行数据传输。74HC 595将LPC 2103发送过来的8位串行数据转换成8位并行数据,用以驱动数码管。
图2-4 74HC595引脚图
2.7 DS1302时钟实现模块
2.7.1 DS1302简介
DS 1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V ~5.5V 。采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS 1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。DS 1302是DS 1202的升级产品,与DS 1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。如图2-5 DS1302引脚图
图2-5 DS1302引脚图
2.7.2 DS1302与CPU 的连接
实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU 一个口线即可。 LCD还可以换成LED ,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM ,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC 接口。功耗低,显示状态时电流为2μA (典型值) ,省电模式时小于1μA ,工作电压为2.4V ~3.3V ,显示清晰。
3 硬件实现及单元电路设计
3.1主板电路的设计
数字时钟的主板电路设计只要是以单片机为核心,围绕A VR 单片机展开的一系列
连接,控制外部电路的使用。数字时钟的主板电路原理图(单片机ATMEGA16 16)
图3-1 74HC 595驱动数码管显示的连接 图3-2 LED 连接
图3-3电源连接
图3-4 按键连接
图3-5 ATMEGA16连接图
图3-6 AVR 并口仿真电原理图
3.2外部电路的设计
主板电路控制设计的整个系统,那么如何连接就变得十分重要,怎么连接才能连接出我们所要的动作命令,在这次设计中我们没有添加多余的电路,但是可以根据不同的要求,按照一定的连接原理扩展出很多功能。这里介绍一下,本设计外部电路的具体连接。如图3-1电路连接图。
图3-7 电路连接图
具体功能如下:
COM1与MAX232配合使用,其中COM1是与电脑连接的插口,而COM1接口的电平和一般单片机的应用系统的信号电平不同,所以需要MAX232在两者之间进行电平转换。
CN1 LCD是夜晶显示瓶,RW1用于调节显示屏的对比度 CN2 JTAG用于系统仿真的接口。
CN3 ISP下载接口插座, C语言编程下载使用。
按键功能:S0是用于调整和正常计时的转换功能,S1调整数据转换分别显示年、月、日、时、分、秒、周,S2在调整状态下每按一下在自己范围内减1,S3在调整状态下每按一下在自己范围内加1,S4显示内容反向转换,S5显示内容正向转换,S6保存调整后的时间,S7调整后启动正常计时,S8复位键,S9中断键。
74HC595用于驱动数码管。
DS1302是一种具有绢细电流充电能力的电路,主要特点是采用串性数据传输,可为掉电保护电源提供可编程的充电功能,DS1302有12个积存器,其中有7个积存器与日历、始终相关存放的数据为为BCD 码,此外DS1302还有年份寄存器、控制寄存器、充电寄存器。
4 软件设计
4.1 软件设计思路
从我们的控制结构的设计,首先,我们要设计设计数字时钟显示年、月、日、时分、秒程序,采用的是C 语言编写的。其次,我们要键盘程序,主要用于单片机ATMEGA16控制功能。最后是一些信息处理程序和单片机控制程序。
4.2 程序文件
#include "iom16v.h" #include "macros.h" #include "ds1302_h.h"
#include "74hc595_h.h" //简化宏定义 #define uchar unsigned char
#define uint unsigned int //全局变量定义 uchar timer[8];
//时钟数据
//共阳数码管"0-9、A 、B 、C 、D 、E 、-" 显示代码
Uchar Table[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88, 0x83, 0xc6,0xa1,0x86,0xbf}; //转换后的显示数据 uchar s[4]; //定义扫描计数器 uchar sel=0; //定义按键数据 uchar key,k1; uint k2=0;
uchar set_flag=0; uchar xs;
//定义按键调整标志 //定义显示内容标志
//延时函数:入口i ,需要定时的时长
void delay(uint i) {
//在1M 时钟下为i ms
uchar j; for(;i;i--)
{
for(j=220;j;j--) {;}
}
}
void ds1302_write_time(void) {
ds1302_write(ds1302_control_add,0x00); ds1302_write(ds1302_sec_add,0x80);
ds1302_write(ds1302_charger_add,0xa9); ds1302_write(ds1302_year_add,timer[1]); ds1302_write(ds1302_month_add,timer[2]); ds1302_write(ds1302_date_add,timer[3]); ds1302_write(ds1302_day_add,timer[7]); ds1302_write(ds1302_hr_add,timer[4]); ds1302_write(ds1302_min_add,timer[5]); ds1302_write(ds1302_control_add,0x80); }
//从1302中读出当前时钟 void ds1302_read_time(void) {
timer[1]=ds1302_read(ds1302_year_add); timer[2]=ds1302_read(ds1302_month_add);
timer[3]=ds1302_read(ds1302_date_add); timer[7]=ds1302_read(ds1302_day_add); timer[4]=ds1302_read(ds1302_hr_add); timer[5]=ds1302_read(ds1302_min_add); timer[6]=(ds1302_read(ds1302_sec_add))&0x7F;
/向1302中写入时钟数据
//关闭写保护 //暂停
//涓流充电 //年 //月 //日 //周 //时 //分 //打开写保护 //年 //月
//日 //周 //时 //分 //秒
}
//显示数据转换函数 void Process(uchar i) {
s[3]=Table[(timer[i]&0xF0)>>4];
s[2]=Table[(timer[i]&0x0F)]&0x7F; //初始化显示数据,并将时分之间加小数点 s[1]=Table[(timer[i+1]&0xF0)>>4]; s[0]=Table[(timer[i+1]&0x0F)]; }
//调整显示函数 void set_timer_xs(uchar m,uchar i) //入口:m 为调整的数据说明,i 为调整数据 {
s[3]=Table[m]; s[2]=Table[0x0f]; s[1]=Table[(i>>4)]; s[0]=Table[(i&0x0f)]; }
void add_timer(uchar b) //时钟调整加函数:入口b 需要调整的时钟数据位置 { switch(b) { case 1: //年数据加1调整,范围00-99
{
timer[1]+=0x01;
if((timer[1]& 0x0f)==0x0A) {
timer[1]=((timer[1]&0xF0)+0x10);
if(timer[1]>0x99) timer[1]=0x00;
}
};break; case 2:
//月数据加1调整,范围1-12
{
timer[2]+=0x01;
if(timer[2]==0x13) timer[2]=0x01; if((timer[2]&0x0f)==0x0A) { timer[2]=((timer[2]&0xF0)+0x10);
}
};break; case 3:
//日数据加1调整,范围1-30,暂未考虑31日
{
timer[3]+=0x01;
if(timer[3]>0x30) timer[3]=0x01; if((timer[3]&0x0f)==0x0A) { timer[3]=((timer[3]&0xF0)+0x10);
}
};break; case 4: //时数据加1调整,范围0-24
{
timer[4]+=0x01;
if(timer[4]==0x24) timer[4]=0x00; if((timer[4]&0x0f)==0x0A) { timer[4]=((timer[4]&0xF0)+0x10);
}
};break;
case 5: //分数据加1调整,范围0-59
{
timer[5]+=0x01;
if((timer[5]&0x0f)==0x0A) { timer[5]=((timer[5]&0xF0)+0x10); if(timer[5]>0x59) timer[5]=0x00;
}
};break; case 7:
//星期数据加1调整,范围1-7
{
timer[7]+=0x01;
if(timer[7]>0x07) timer[7]=0x01; };break; default:;break;
}
}
void dec_timer(uchar b) //时钟调整减函数:入口b 需要调整的时钟数据位置 { switch(b) { case 1: //年数据减1调整,范围00-99
{
timer[1]-=0x01;
if((timer[1]&0x0f)==0x0F) { timer[1]=(timer[1]&0xF9); if(timer[1]>0x99)timer[1]=0x99;
}
};break; case 2:
//月数据减1调整,范围1-12
{
timer[2]-=0x01;
if(timer[2]==0x00)timer[2]=0x12; if((timer[2]&0x0f)==0x0F) { timer[2]=(timer[2]&0xF9);
}
};break; case 3:
//日数据减1调整,范围1-30,暂未考虑31日
{
timer[3]-=0x01;
if(timer[3]==0x00)timer[3]=0x30; if((timer[3]&0x0f)==0x0F) { timer[3]=(timer[3]&0xF9);
}
};break; case 4:
//时数据减1调整,范围0-24
{
timer[4]-=0x01;
if(timer[4]>0x24)timer[4]=0x23; if((timer[4]&0x0f)==0x0f) { timer[4]=(timer[4]&0xF9);
}
};break; case 5: //分数据减1调整,范围0-59
{
timer[5]-=0x01;
if((timer[5]&0x0f)==0x0F) { timer[5]=(timer[5]&0xF9); if(timer[5]>0x59)timer[5]=0x59;
}
};break; case 7:
//星期数据减1调整,范围1-7
{
timer[7]-=0x01;
if(timer[7]
}
}
/*************************************** * 按键读取判断函数 * * 函数功能:判断按键是否按下 * * 入口参数:无
*
* 返 回 值:无键按下0,有键按下为1-8 * * 说 明:需要在初始化函数中将接口置 * * 为输入
*
***************************************/ uchar rd_key(void) { uchar a,b; a=PINA; if(a==0xFF) return(0); else
{ a=~a; switch(a) { case 0x01:b=1;break; case 0x02:b=2;break; case 0x04:b=3;break; case 0x08:b=4;break; case 0x10:b=5;break; case 0x20:b=6;break; case 0x40:b=7;break; case 0x80:b=8;break; default:b=0;break;
}
return(b); //返回的1-8分别对应按键S0-S7
}
}
//定时器1:每秒从DS1302中读取4次数据,更新显示 void timer1_init(void) //定时器1初始化:250毫秒定时,预分频256
{
TCCR1B = 0x00; //停止定时器 TCNT1H = 0xFC;
//初值高字节
TCNT1L = 0x2F;
//定时初值低字节
TCCR1A = 0x00; TCCR1B = 0x04; //启动定时器
}
#pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) //定时器1中断入口:250MS 中断一次
{
TCNT1H = 0xFC; TCNT1L = 0x2F;
//重装初值
ds1302_read_time(); Process(xs);
//读出当前时钟 //显示数据转换
}
/* 定时器0中断配置函数 预分频数:256 定时时间: 5mSec
实际时间: 4.864mSec (2.7%) 功能:用于LED 数码管显示扫描*/ void timer0_init(void) {
TCCR0 = 0x00;
TCNT0 = 0xED;
OCR0 = 0x13; TCCR0 = 0x04; }
/* 定时器0中断入口函数 */
#pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) {
TCNT0 = 0xED; PORTB=255; SPI_595_Out(s[sel]); PORTB=~BIT(sel); sel++; if(sel>3)sel=0; if(k2==0)
{
//先关闭定时器 //装初值
//这个是比较值? //启动定时器
//重装初值
//先关显示
//送显示数据 //再开相应位显示
set_flag=0; //清调整标志 TCCR1B = 0x04;
//启动定时器1
} else
k2--;
}
/************************************* * 主函数
*
*************************************/ void main(void) {
uchar a=1,b=0;
DDRA=0x00; //设置按键A 口为带上拉输入:接按键 PORTA=0xFF; DDRC=255;
//定义C 口为输出 DDRB=255;
//定义B 口为输出
PORTB=255; DDRD=0xFB; //定义D 口为输出:PD2为输入,中断按钮 PORTD=0x04;
//PD2上拉
xs=4;
//初始显示内容:时、分
SPI_MasterInit(); //初始化SPI 接口 CLI();
//先关闭所有中断
timer0_init(); //设定定时器0 timer1_init();
//设定定时器1
MCUCR = 0x00; GICR = 0x00;
TIMSK = 0x05;
//允许定时器0、定时器1中断
SEI(); //开总中断
while(1) { if(rd_key()!=0) { k1=rd_key();
delay(20);
if(rd_key()==k1) {
key=rd_key(); switch(key) { case 1: {
if(set_flag==0) { set_flag=1; a=1;
k2=4000;
TCCR1B = 0x00; set_timer_xs(1,timer[1]);
}
else {
set_flag=0;
}
};break;
//调整和结束调整处理
//停止定时器1 //年数据调整显示
TCCR1B = 0x04;
//启动定时器
case 2:
//调整数据切换
{
if(set_flag==1) { a++; if(a==6)a=7; if(a>=8)a=1;
set_timer_xs(a,timer[a]); k2=4000;
}
};break;
case 3:
{
if(set_flag==1) {
dec_timer(a);
set_timer_xs(a,timer[a]); k2=4000;
}
};break;
case 4:
{
if(set_flag==1) {
add_timer(a);
set_timer_xs(a,timer[a]); k2=4000;
}
};break;
case 5:
{
//数据减1调整
//数据加1调整
//显示内容转换减
if(set_flag!=1) { xs--;
if(xs==0)xs=6;
}
};break;
case 6:
{
if(set_flag!=1) { xs++; if(xs==7)xs=1;
}
};break;
case 7:
{
if(set_flag==1)
{
ds1302_write_time();
set_flag=0;
TCCR1B = 0x04; b=1;
}
};break; case 8: { if(b==1) {
start_ds1302();
b=0;
//显示内容转换加
//写入调整后的时钟并暂停
//写入调整后的时钟并暂停
//启动定时器
//启动时钟
}
}
;break; default:;break;
}
while(rd_key()!=0) { delay(20); }
} }
}
5 系统调试
5.1 硬件调试
主要检查了电路板有无虚焊、短路、连线是否正常,尤其是单片机的各使能端的接线,I/O接口连线是否有误。由于我们采用了四个数码管并联接入P 2口的段选端,因此接线较多,经常容易出现管脚间短路现象。这是硬件设计不足之处,今后将注意元件的选配使设计更简洁实用。图5-1所示。
图5-1 实物电路
5.2 软件调试
主要是把源程序通过软件接到ISP 口下载到ATMEGA16芯片当中,测试数字时
钟的功能及显示。对定时中断程序、显示子程序、按键中断子程序进行了分段调试,结果功能正常。
6 结论
一、实现功能
本论文主要研究了数字时钟的设计和制作过程以及数字时钟的显示与校准进行设计,并用数码管进行显示,主要显示
二、主要元件
此篇毕业论文主要是应用ATMEGA16芯片、LED 发光二极管、数码管显示、开关、U S B 接口。应用了C 语言编程,实现时钟的显示,调整。
三、编程思想
采用汇编语言编程,包括主程序、子程序等。编程思想为:(1)定义程序入口,通过运行主程序,初始化。(2)调整显示程序和时间调整程序,最后通过复位按钮对当前状态进行恢复。(3)调整分、秒单元与60进行比较,调整小时单元与24进行比较。
四、优点
综合应用和C 语言,使此设计具有显示和调整数字时钟的功能。它具有体积小携带方便,安全性高。
五、系统的展望
对于此设计还可以增加记时功能,闹钟功能,使此简易数字时钟,功能更齐全。 总之,通过这次对数字时钟的设计过程,通过针对性地查找资料,我了解了许多电子方面的知识。这使得我既增长了自己的见识,补充了最新的专业知识,又提高了自己的应用能力。
年、月、日、时、分、秒。
第 28 页 共30页
28
参考文献
[1] 丁辉、姚庆文. 实用单片机电子钟的设计[M ].上海:上海科学技术出版社. 1998:9. [2] 于海生.微型计算机控制技术[M ].北京:清华大学出版社.1999:8. [3] 孙涵芳.单片机原理及应用[M ] .北京:北京航空航天大学出版社.1996:4. [4] 黄正谨.综合电子设计与实践[M ] .南京:东南大学出版社.2002:26 [5] 杨欣等.电子设计从零开始[M ] .北京: 清华大学出版社.2005:10 [6] 谢嘉奎.电子线路[M ] .北京. 高等教育出版社.2003: 25
[7] 夏路易,石宗义.电路原理图与电路设计教程PROTEL 99S E [M ] .北京. 北京希望电子出版社.2002: 23
[8]张友德. 单片微型机原理应用与实验[M ].上海: 复旦大学出版社.1992:12
第 29 页 共30页
29
致 谢
在设计过程中,通过针对性地查找资料,了解了些电子方面的资料,既增长了自己见识,补充最新的专业知识,又提高了自己的应用能力。
我要感谢我的指导老师李老师,本学位论文是在我的指导老师李国军老师的亲切关怀与细心指导下完成的。从课题的选择到论文的最终完成,李老师始终都给予了细心的指导和不懈的支持,并且在耐心指导论文之余,李老师仍不忘拓展我们的文化视野,让我们感受到了文学的美妙与乐趣。对学生认真负责,在他的身上,我们可以感受到一个学者的严谨和务实,这些都让我们获益菲浅,并且将终生受用无穷。毕竟“经师易得,人师难求”,希望借此机会向李老师表示最衷心的感谢!同时我要感谢郝老师,他耐心的指导我做事物模型,提供我技术知识等方面的知识,使我的动手能力大大增强。在遇到问题时郝老师总是悉心指导和鼓励。还要感谢帮助和鼓励我的同学。
总之这次毕业设计让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合、个人作用和集体协作相结合等方面全面的培养学生的全面素质。这些在我今后的学习和工作当中都会有很大的帮助。
第 30 页 共30页
30