您好,欢迎来到微智科技网。
搜索
您的当前位置:首页多功能时钟

多功能时钟

来源:微智科技网


课设报告

福建工程学院软件学院题 目:时钟 班 级: 姓 名: 学 号:

指导老师:日 期: 年 日

目录

1摘要

本次设计主要以ATC51芯片为核心,辅助以必要的外围电路,设计了一

个简易的多功能电子时钟。现代的电子时钟是基于单片机的一种计时工具,采用延时程序进行一定的延时,采用定时计数器产生一定的时间计数中断,用于一秒的定义,通过计数方式进行通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零,到零秒分钟借一,到零分小时进一,到零时小时自动变为23时。从而达到计时的功能,是人民日常生活中不可缺少的工具。在硬件方面,除了CPU以外,使用八个七段LED数码管来进行显示,LED数码管采用的是动态扫描显示,使用蜂鸣器进行时钟整点报时。通过LED能够比较准确显示时、分、秒,三个简单的按键实现对时间的自加、自减和清0调整。软件方面采用C语言编写程序,整个多功能电子时钟系统能完成时间显示,自加和自减调时,整点报时,时钟复位清0等功能。

关键词:ATC51,LED数码管,蜂鸣器

2设计要求

2.1

功能需求

2.1.1 基本功能

(1) 设置当前时间,(按键或键盘设置),在数码管上显示,如设置显示 12-23-33 ;

(2)从当前设置的时间开始走时,每一秒自动加1,当59秒后自动向分进位1、59分后自动向时进位1。在23:59:59后自动跳转为时间00:00:00。

2.1.2扩展功能

(1)从当前设置的时间开始走时,每一秒自动减1,当00秒后自动向分位借位1、00分后自动向时位借位1。在时钟计数到00:00:00后自动跳转为显示23:59:59;

(2)实现按下一个按键后得到复位清0的功能;

(3)利用蜂鸣器编程实现正在跳动的时钟具有整点报时的功能。

2.2 设计要求 (用哪些部件实现功能需求)

2.2.1 单片机芯片部件功能

通过对多种单片机性能的分析,最终认为ATC51是最理想的电子时钟开发芯片。C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的C51是一种高效微控制器,而且它与MCS-51兼

容,且具有4K字节可编程闪烁存储器和1000写/擦循环,数据保留时间为10年等特点,是最好的选择。

2.2.2 数码管显示器部件功能

数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起,即所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8 位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。此实验运用8位七段数码管共阴极动态扫描法显示时间。

2.2.3 按键部件功能

该实验设计只用了三个按键,但实现的功能却是比较完善,减少了硬件资源的损耗,其中三个按键可以实现时钟的调节自加、自减以及复位清0。直接将按键KEY1按下松开,则可以通过按键实现分钟的自加,按一次分钟自动无限循环自加一;直接将按键KEY2按下松开,则可以通过按键实现分钟的自减,按一次分钟自动无限循环自减一;同样直接将按键KEY3一次按下松开,则可以通过按键实现时间的复位清0功能;就这样通过三个简单的按键得以实现从而达到时间调节的目的。

2.2.4 蜂鸣器部件功能

蜂鸣器是一种把警示电信号转换成人耳能够感知的电声转换装置。根据蜂鸣器的不同种类,其工作电源也不同,有的接直流,如汽车上用的电喇叭;有的接交流,有的需要接在特定的电子电路中。即蜂鸣器是一种能将音频信号转化为声音信号的发音器件,在家用电器上,在银行、的报警系统中,在电子玩具、游戏机中都得到普遍应用。在此时钟实验中就是利用C语言编写来控制蜂鸣器作为整点报时的。

3硬件设计及描述

3.1

总体描述(整体实现的功能简述)

从C语言程序中设置初始按键当前时间,在数码管上显示,,再利用三个按键的不同功能设置显示的时间,例如设置12-23-33 ;按下按键KEY1从当前设置的时间开始走时,每一秒自动加1,当59秒后自动向分进位1、59分后自动向时进位1,在23:59:59后自动跳转为时间00:00:00。按下按键KEY2从当前设置的时间开始走时,每一秒自动减1,当00秒后自动向分位借位1,00分后自动向时位借位1,在时钟计数到00:00:00后自动跳转为显示23:59:59;实现按下按键KEY3后得到复位清0的功能;并且利用蜂鸣器编程实现正在跳动的时钟具有整点报时的功能。

3.2系统总体框图

蜂鸣器 按键模块 多功能时钟 复位模块 3.3Proteus电路图

显示模块

图1-2 系统整体Protues仿真图

3.4各部分硬件介绍 (proteus截图+解释)

图1-3 晶振Protues仿真图

晶体振荡电路用于产生单片机工作时所需的时钟信号,从而保证各部分工作的同步。单片机内部有一个高增益反相反大器,只要在输入端XTAL1与输出XTAL2之间挂一个晶体振荡器和微调电容就可以构成一个稳定的自激震荡器并在单片机内部产生的时钟脉冲信号。振荡电路见图1-3,电容器C1与C2用于稳定频率和快速起振。

图1-4 数码管Protues仿真图

LED显示器如图1-4所示就是通常所说的LED显示器由七个发光二极管组成,因此也称作七段LED显示器,通过七段发光二极管的不同组合,可以显示多种数字、字母或其它符号。LED的接法,共阴极接法是指把发光二极管的阴极连接在一起构成公共阴极,使用时公共阴极接地,阳极输入高电平段的二极管则会导通发光,而输入低电平的则不会亮。其显示方式为动态显示是指依次轮流点亮显示器的各个位,每隔一段时间则点亮一次,设置足够短的时间,利用人的视觉暂停效应和发光二极管的熄灭时的余辉,达到多个字符同时显示的效果。运行这种显示方式可以降低成本与功耗,但需要较大的驱动电流。本设计中采用的共阴极连接方式。

图1-5 按键Protues仿真图

键盘接口电路如图1-5所示,与通用单片机相比,单片机应用系统中的键盘种类很多,键盘中按键数量设置依系统操作要求而定。单片机应用系统中的键盘

有式和行列式两种。式键盘中,每个按键占用一个I/O口线,每个按键相对。I/O口通过按键与地相连,无按键按下时,引脚端为高电平,有按键按下时,引脚为低电平,I/O口内部有上拉电阻外部不可接上拉电阻。行列式键盘用I/O口线组成行列结构,按键设置在交叉点上,在按键数目较多时运用这种连接方式,可节省I/O口连线。行列式键盘的标识最常用的两种方法:行扫描法和线反转法。本次设计中由于按键较少,采用三按键式键盘即可满足需要式键盘。

图1-6 上拉电阻Protues仿真图

在此设计中P0需外加上拉电阻如上图1-6所示,才能构成完整电路。

图1-7 C51芯片Protues仿真图

VCC:电源。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能

接收输

出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为ATC51的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不

变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是

ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

图1-8 上电按钮复位电路Protues仿真图

本设计采用上电按钮复位电路:首先经过上电复位,当按下按键时,开关直接与VCC相连,为高电平形成复位,同时电解电容被电路放电;按键松开时,VCC

对电容充电,充电电流在电阻上,开关依然为高电平,仍然是复位,充电完成后,电容相当于开路,开关为低电平,单片机芯片正常工作。其中电阻R2决定了电容充电的时间,R2越大则充电时间长,复位信号从VCC回落到0V的时间也长。

图1-9 74HC138Protues仿真图

74HC138的作用是八位二进制译十进制译码器,74HC138是一款高速CMOS器

件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A, B和C),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。74HC138特有3个使能输入端:两个低有效(E1和E2)和一个高有效(E3)。除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。利用这种复合使能特性,仅需4片74HC138芯片和1个反相器,即可轻松实现并行扩展,组合成为一个1-32(5线到32线)译码器。任选一个低有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自合适的高有效或低有效状态。

图1-10 74HC573Protues仿真图

芯片74HC573是8位三态锁存器,可锁存地址,数据,可作缓冲器用。主要用于数码管、按键等等的控制八进制,是3 态非反转透明锁存器。74HC573高性能硅门CMOS器件,74HC573 跟LS/AL573的管脚一样的器件。74HC573跟LS/AL573的管脚一样。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。输入是和标准 CMOS 输出兼容的;加上拉电阻,他们能和 LS/ALSTTL 输出兼容。74HC573锁存器在数码管显示时作用的确是为了节省IO口, 用编程过程说明其作用:单片机P0口先发送abcdefg hp段选信号。使用一个74HC573将段选信号保存住。 单片机P0口再发送位选信号,此时单片机P0口信号不影响被锁存住 的段选信号。使用另一个74HC573锁存住位选信号。 按以上1至4步循环,显示8位数码管只需要10个IO口。

图1-2 蜂鸣器Protues仿真图

蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的。因此需要一定的电流才能驱动它,单片机IO口输出的电流较小,其TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。程序中通过改变单片机对应IO口输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变其占空比,也可以控制蜂鸣器的声音大小。可以有两种驱动方式,即用PNP或NPN三极管电流放大电路驱动。本电路通过一个NPN三极管来放大驱动蜂鸣器,基极连接R4,发射极E连接一个VCC,集电极C连接蜂鸣器后接地。单片机在复位后的个I/O口是高电平,此时三极管是截止的,编写程序使选定的I/O为低电平,此时三极管导通,导通后蜂鸣器与电源正极连通,构成一个工作回路,从而发出滴滴的响声。其中电阻R4在电路里起分压限流的作用,NPN三极管起到模拟开关的作用。也就是说当输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制IO口输出的电平来使蜂鸣器发出声音和关闭,从而实现各种可能音响的产生。

4 软件设计流程及描述

4.1 程序流程图

主程序主要完成系统的初始化和按键的捕获,在按键没有按下时,调用显示子程序,程序流程图如下图4.1

开始 显示时间 加时 N Y 执行加时 模块 减时 Y N 是否为 整时 Y N 执行减时 模块 Y 复位 N 执行复位 模块 N 是否为整时 蜂鸣器响,继续执行加时 Y N 是否为整时 Y 蜂鸣器响,保持复位状态 蜂鸣器响,继续执行减时 执行中断,结束 图4.1

4.2函数模块及功能

4.2.1 函数头模块

函数开头定义数组,定义按键端口位置,定义时钟的初始显示时间值,定义定时计数器Count初始值和定义程序中最核心的数组部分,具体程序代码如下: #include

#define uchar unsigned char #define uint unsigned int #define INT8U unsigned char #define INT16U unsigned char

sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; sbit BEEP = P3^7;

int a=12,b=59,c=55; int t=0; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段值 uchar Count = 0;

4.2.2 定时器模块

定时器定义了EA和ET0开中断,利用Count++实现自动计数功能,TH0和TL0计算设置得出时钟每隔100ms跳动一次,具体程序代码如下: Time0_Init() { TMOD=0x01;

TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; }

void timer0_int(void)interrupt 1 {

Count++;

TH0=(65536-10000)/256; TL0=(65536-10000)%256; }

4.2.3 延时模块

定义Delay延时,具体程序代码如下: void Delay(uint del) { uint i,j;

for(i=0; i4.2.4 时间显示模块

void time()

{ Delay(1); P0=0x40; P2=5;

Delay(1); P0=0x40; P2=2;

Delay(1); //秒显示

P0 = table[c%10]; //数码管段值 P2 = 7; //点亮某一位数码管 Delay(1); if(c==60) {c=0; b++ ; }

else if(c==-1) {c=59; b--; }

P0 = table[c/10]; //数码管段值 P2 = 6; Delay(1); //分显示

P0 = table[b%10]; //数码管段值 P2 = 4; //点亮某一位数码管 Delay(1); if(b==60) { b=0; a++; }

else if(b==-1) {

b=59; a--; }

P0 = table[b/10]; //数码管段值 P2 = 3; Delay(1); //时显示

P0 = table[a%10]; //数码管段值 P2 = 1; //点亮某一位数码管 Delay(1); if(a==24) {

a=0; }

else if(a==-1) {

a=23; b=59; c=59; }

P0 = table[a/10]; //数码管段值 P2 = 0; Delay(0); }

4.2.4 蜂鸣器模块

void play(uint g) {

BEEP=~BEEP; Delay(g); BEEP=0; }

4.2.5 main主函数模块

void Main(void) {

Time0_Init(); while(1) { time();

if(KEY1==0 ) //计时开始 {

t=1; TR0=1; //Beep(1); Delay(0); }

if(Count == 100) { Count=0;

if(t==1) //t=1时为加法 c++;

else if(t==0) c--; }

if(b==0&&c==0) {

play(1); Delay(1); }

if(KEY3==0 ) //改变加减法 { a=0; b=0; c=0; TR0=0;

// Beep(3); Delay(20); }

if(KEY2==0 ) //计时开始 { t=0; TR0=1; //Beep(2); Delay(0); } } }

5 功能实现(功能介绍+照片)

5.1.1程序烧入显示

5.1.2时间自加

5.1.3时间自减

5.1.4时间复位

6 心得体会

经过两周的课程设计,不断的测试与分析,最终完成了电子时钟的设计与制作。在实验的设计及仿真测试时,当没有得出正确的实验现象时,必须冷静、沉着的思考问题的来源,切勿太过紧张。在程序的调试中,须仔细再仔细,不要太过于急躁,切勿乱了头绪。这样才能在编程过程中减少许多不必要的错误。本次设计主要是程序设计部分,在程序设计过程中,出现了很多的问题,经过和搭档的多次讨论与研究、,并参阅了一些电子资料,解决的很多难题。

此课程设计主要考察了对单片机技术原理及程序设计基础等知识。理论结合实践,使得在平时学习的单片机技术知识有了一个新的认识。

此次设计的电子时钟是一个典型的单片机应用实例。通过本次设计,使得对单片机技术有了进一步的认识,并且对此产生了浓厚的兴趣,为以后的学习打下了坚实基础。 通过和搭档的共同努力,成功的完成此次课程设计,在排除问题过程中,体验了程序设计及电路设计制作的艰辛,更能够体会到成功的喜悦。

7源程序代码:

#include

#define uchar unsigned char #define uint unsigned int #define INT8U unsigned char #define INT16U unsigned char

sbit KEY1 = P3^2;

sbit KEY2 = P3^3; sbit KEY3 = P3^4; sbit BEEP = P3^7;

int a=12,b=59,c=55; int t=0; uchar code table[10]

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段值 uchar Count = 0;

Time0_Init() { TMOD=0x01;

TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; }

void timer0_int(void)interrupt 1 {

Count++;

TH0=(65536-10000)/256; TL0=(65536-10000)%256; }

void Delay(uint del) { uint i,j;

for(i=0; ivoid time()

{ Delay(1); P0=0x40; P2=5;

Delay(1); P0=0x40; P2=2;

Delay(1); //秒显示

P0 = table[c%10]; //数码管段值 P2 = 7; //点亮某一位数码管 Delay(1); if(c==60) {c=0; b++ ;

=

}

else if(c==-1) {c=59; b--; }

P0 = table[c/10]; //数码管段值 P2 = 6; Delay(1); //分显示

P0 = table[b%10]; //数码管段值 P2 = 4; //点亮某一位数码管 Delay(1); if(b==60) { b=0; a++; }

else if(b==-1) {

b=59; a--; }

P0 = table[b/10]; //数码管段值 P2 = 3; Delay(1); //时显示

P0 = table[a%10]; //数码管段值 P2 = 1; //点亮某一位数码管 Delay(1); if(a==24) {

a=0; }

else if(a==-1) {

a=23; b=59; c=59; }

P0 = table[a/10]; //数码管段值 P2 = 0; Delay(0); }

void play(uint g)

{

BEEP=~BEEP; Delay(g); BEEP=0; }

void Main(void) {

Time0_Init(); while(1) { time();

if(KEY1==0 ) //计时开始 { t=1; TR0=1; //Beep(1); Delay(0); }

if(Count == 100) { Count=0;

if(t==1) //t=1时为加法 c++;

else if(t==0) c--; }

if(b==0&&c==0) {

play(1); Delay(1); }

if(KEY3==0 ) //改变加减法 { a=0; b=0; c=0; TR0=0;

// Beep(3); Delay(20); }

if(KEY2==0 ) //计时开始 {

} } }

t=0; TR0=1; //Beep(2); Delay(0);

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务