基于单片机电子钟的方案设计 3.docx
- 文档编号:24984458
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:24
- 大小:195.35KB
基于单片机电子钟的方案设计 3.docx
《基于单片机电子钟的方案设计 3.docx》由会员分享,可在线阅读,更多相关《基于单片机电子钟的方案设计 3.docx(24页珍藏版)》请在冰豆网上搜索。
基于单片机电子钟的方案设计3
基于单片机的电子钟的设计
学院:
班级:
姓名:
学号:
小组成员:
姓名:
学号:
指导老师:
一、设计要求
1、准确计时,以数字形式显示时、分、秒的时间。
2、小时以24小时计时形式,分秒计时为60进位。
3、校正时间功能,即能随意设定走时时间。
4、设计5V直流电源,系统时钟电路、复位电路。
二、设计方案和论证
本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:
键盘、芯片、扬声器、LED显示即可满足设计要求。
(一)总设计原理框图如下图所示:
微型控制器
时钟电路
声光报时
校时输入
数据显示
(二)设计方案的选择
1.计时方案
方案1:
采用实时时钟芯片
现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等。
这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。
因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。
方案2:
使用单片机内部的可编程定时器。
利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,但程序设计较为复杂。
2.显示方案
对于实时时钟而言,显示显然是另一个重要的环节。
通常LED显示有两种方式:
动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。
但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。
需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。
当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。
LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。
一.电路原理图和设计程序流程图
单片机模块
驱动模块
按键模块
LED显示模块
时钟模块
电源模块
图一流程图
系统由51系列单片机AT89C51、按键、数码管显示、电源等部分构成。
单片机部分包括时钟电路、复位电路;按键部分能够实现对时间的调整、设定。
三个按键的功能分别为:
小时的调整,分钟的调整,复位。
电源部分(USB充电器)可输出5V电压,给系统供电。
1.单片机芯片选择方案
方案一:
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器。
主要性能有:
与MCS-51单片机产品兼容、全静态操作:
0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器、八个中断源、全双工UART串行通道、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符、易编程。
方案二:
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM)。
主要性能有:
兼容MCS51指令系统、32个双向I/O口、256x8bit内部RAM、3个16位可编程定时/计数器中断、时钟频率0-24MHz、2个串行中断、可编程UART串行通道、2个外部中断源、6个中断源、2个读写中断口线、3级加密位、低功耗空闲和掉电模式、软件设置睡眠和唤醒功能。
从单片机芯片主要性能角度出发,本数字电子钟单片机芯片选择设计采用方案一。
2.时钟主程序流程图
时钟主程序流程图如图二所示。
进入系统后首先实现程序的初始化,然后进入主程序,定时器开始计时,当定时器发生中断时刷新数码管同时显示,之后实现中断与显示的循环。
图二时钟主程序流程图
3.按键扫描程序流程图
按键扫描程序流程图如图三所示。
主程序进入键盘扫描程序后判断是否按下了P1.0。
若是按下了P1.0为了去除抖动再进行确认是否按下P1.0,当确认按下了P1.0后判断按下P1.0的次数,若按了一次则进行秒调整,若按了两次则进行分调整,若按了三次则进行时调整。
然后进入显示程序段进行显示刷新。
图三按键扫描流程图
4.时钟程序流程图
时钟程序流程如图四所示。
设计中,采用51单片机的定时器的方式一定时,所以如图所示,当程序产生定时溢出中断时要重新赋初值。
然后进行是否到一秒的判断,若到一秒则秒加一,若未到则直接退出中断。
一秒到了加一以后进行是否秒到六十的判断,若秒到六十则秒清零,同时分加一,若秒未到六十则退出中断。
分加一以后进行分是否到六十的判断,若未到六十则退出中断,若分到六十则分清零,同时小时加一。
小时加一后进行小时是否到二十四的判断,若未到二十四则退出中断,若到二十四则清零,然后退出中断。
图四时钟程序流程图
二.设计方案分析
1.时钟电路
时钟电路由外接谐振器的时钟振荡器、时钟发生器及关断控制信号等组成。
时钟振荡器是单片机的时钟源,时钟发生器对振荡器的输出信号进行二分频。
CPU的时钟振荡信号有两个来源:
一是采用内部振荡器,此时需要在XTAL1和XTAL2脚连接一只频率范围为0—33MHZ的晶体振荡或陶瓷振荡器及两只30pf电容。
二是采用外部振荡,此时应将外部振荡器的输出信号接至XTAL1脚,将XTAL2脚浮空。
利用单片机内部的定时功能来实现时钟的走时,通过编程实现每50毫秒产生一次中断,中断20次后,秒单元加1,秒单元加到60时,跳回到零再继续加,同时分单元加1;当分单元加到60时,跳到零再继续加,同时时单元的个位加1,以次类推,从而实现秒、分、小时的走时。
本次设计中采用的是内部振荡器,频率为12MHZ的晶体振荡器及30pf瓷片电容。
2.复位电路
复位是指在规定的条件下,单片机自动将CPU以及与程序运行相关的主要功能部件、I/O口等设置为确定初始状态的过程。
如果电路参数不符合规定的条件或干扰导致单片机不能正确的复位,系统将无法进行正常的工作,因此,复位电路除了要符合厂家规定的参数外,还要滤除可能的干扰。
AT89S51单片机内部有一个由施密特触发器等组成的复位电路。
复位信号是从其9脚,即RST脚输入的。
AT89S51单片机规定,当其处于正常工作基于51单片机的数字时钟的设计状态,且振荡器工作稳定后,在RST端有从高电平到低电平,且高电平时间大于两个机器周期的复位信号时,CPU将完成对系统的复位。
有两点需要注意:
一、复位信号是高电平有效,二、高电平的保持时间必须大于两个机器周期,可见高电平保持时间与振荡频率有关。
上电复位是指在系统上电时,RST端自动产生复位所需要的信号将单片机复位。
上电时,RST端高电平的维持时间取决于R(1k)和C(22uF)的值。
要使单片机可靠的复位,设计中使其维持的时间足够长。
(二)设计方案的选择
1.计时方案
方案1:
采用实时时钟芯片
现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等。
这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。
因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。
方案2:
使用单片机内部的可编程定时器。
利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,但程序设计较为复杂。
2.显示方案
对于实时时钟而言,显示显然是另一个重要的环节。
通常LED显示有两种方式:
动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。
但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。
需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。
当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。
LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。
(三)硬件部分
1、STC89C51单片机介绍
STC89C51单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器[5]。
STC89C51单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。
这些部件通过内部总线联接起来,构成一个完整的微型计算机。
其管脚图如图所示。
STC89C51单片机管脚结构图
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口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器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)。
2、上电按钮复位电路
本设计采用上电按钮复位电路:
首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被电路放电;按键松开时,VCC对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,单片机芯片正常工作。
其中电阻R2决定了电容充电的时间,R2越大则充电时间长,复位信号从VCC回落到0V的时间也长。
3、晶振电路
本设计晶振电路采用12M的晶振。
晶振的作用是给单片机正常工作提供稳定的时钟信号。
单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了,电容范围在20-40pF之间,这里连接的是30pF的电容。
机器周期=10*晶振周期=12*系统时钟周期
4.显示电路
方案一:
采用动态显示这种工作方式是分时轮流选通数码管的公共端,使得各个数码管轮流导通。
当所有数码管依次显示一遍后,软件控制循环,使每位显示器分时点亮,外接7407组成显示电路。
这种方式不但能提高数码管的发光效率,并且由于各个数码管的字段线是并联使用的,因而大大简化了硬件线路。
各个数码管虽然是分时轮流通电,但由于发光数码管具有余辉特性及人眼具有视觉暂留作用,所以适当选取循环扫描频率时,看上去所有数码管是同时点亮的,察觉不出有闪烁现象。
方案二:
采用静态显示数码管工作在静态显示方式下,共阴极或共阳极点连接在一起接地或高电平。
每位的段选线与一个8位并行口相连。
只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。
该工作方式常采用串行口设定方式0输出,外接74LS164移位寄存器构成显示电路。
综合考虑,采用动态显示,采用一片7407芯片作为缓冲,分时选中三片数码管,从编程和提供的硬件等方面综合考虑后,决定采用动态显示的方法,
图五显示电路LED显示器的结构与原理
5.LED的结构与原理
一般数码管内部有共阴和共阳两种连接方式。
共阴就是将各个发光二极管的阴极接地,共阴极数码管如图所示。
图中一个发光二极管就相当于一个数码段。
若给某段加上高电平,那么相对的段就会亮。
根据要想显示的数值给各段数码管加上相应的高电平就可以显示不同的数值了。
共阳就是将各个发光二极管的阴极一起接在高电平上。
从图中可以看出共阳的显示器与共阴的显示器有一点区别,就是它将阳极连接在一起接到高电平上。
这样在想显示某个数的时候,各个发光二极管赋低电平而不是在共阴时的高电平了,这就是共阴共阳的区别。
图六LED的引脚图
由于它内部构造不同,在显示时代码也有所不同,共阴七段LED段选码表。
共阴七段LED段选码
显示字符
数显代码
显示字符
数显代码
0
0x3f
5
0x6d
1
0x06
6
0x7d
2
0x5b
7
0x07
3
0x4f
8
0x7f
4
0x66
9
0x6f
三.程序仿真
在proteus中画出原理图导入.hex文件,画出原理电路图。
图七proteus仿真电路图
四.心得体会
做了两周的课程设计,有很多的心得体会,有关于单片机的,也有关于模电数电等基础科目的。
因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。
有些知识会迁移和联系模电数电。
课堂教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。
而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
我们正面临就业问题,这次课设给了我们一个机会去试验。
单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。
实践中获得的知识能让我对单片机的知识有更好的认识和理解。
虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。
这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。
附一:
源程序
#include
unsignedcharled[12]={0x3f,0x09,0xb3,0x9b,0x8d,0x9e,0xbe,0x0b,0xbf,0x9f,0x80,0x00};//用一维数组定义0-9、横杠、全灭
unsignedchara[6];
unsignedcharsecond=0,minute=0,hour=12;//初始值
unsignedcharhour1=0,minute1=0;//闹钟初始值
unsignedcharb[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//扫描
unsignedchark=0;
unsignedinttemp;//记录毫秒为秒的变量
unsignedcharM,Shanshuo;//M模式、Shanshuo闪烁标志
sbitMiaoshan=P1^0;
sbitK1=P3^2;
sbitK2=P3^3;
sbitK3=P3^5;
sbitBeep=P3^6;
voiddelay(unsignedn)//延时,可根据n调节
{intx,y;
for(x=0;x for(y=0;y<24;y++); } voidinit() {M=0; Miaoshan=0;//秒闪标志位 Shanshuo=0;//闪烁标志 Beep=0;//整点报时 TMOD=0x10;//定时器以方式1定时 TH1=0xfd; TL1=0xff; EA=1;//打开总中断 ET1=1;//允许定时器中断 TR1=1;//开启定时器 } voidtime1()interrupt3//定时器中断函数 {TH1=0xfe;//定时ms TL1=0x0c; temp++; if(temp==500) Miaoshan=! Miaoshan; if(temp==1000)//配合定时器定时s {temp=0; second++; Miaoshan=! Miaoshan; } if(second==59) {second=0; if(minute<59) minute++; else{minute=0; hour++; hour%=24; } } if(temp%500==0)Shanshuo=! Shanshuo;//闪烁标志位取反 if((hour>7&&hour<23&&minute==0&&second<1)||(hour1==hour&&minute1==minute&&second<10&&temp%500==0)) Beep=! Beep;//整点报时、闹钟响铃 if(k==6) k=0; P0=a[k]; P2=b[k++]; delay (1); P2=0x3f; } voiddisplay() {switch(M) { case0: {a[0]=led[hour/10]; a[1]=led[hour%10]; a[2]=led[minute/10]; a[3]=led[second%10]; a[4]=led[second/10]; a[5]=led[minute%10]; }break; case1: {if(Shanshuo==1) {a[0]=led[hour/10]; a[1]=led[hour%10]; } else {a[0]=led[11]; a[1]=led[11]; } a[2]=led[minute/10]; a[5]=led[minute%10]; a[4]=led[second/10]; a[3]=led[second%10]; }break; case2: {a[0]=led[hour/10]; a[1]=led[hour%10]; if(Shanshuo==1) {a[2]=led[minute/10]; a[5]=led[minute%10]; } else {a[2]=led[11]; a[5]=led[11]; } a[4]=led[second/10]; a[3]=led[second%10]; }break; case3: {a[0]=led[hour/10]; a[1]=led[hour%10]; a[2]=led[minute/10]; a[5]=led[minute%10]; if(Shanshuo==1) {a[4]=led[second/10]; a[3]=led[second%10]; } else {a[4]=led[11]; a[3]=led[11]; } }break; case4: {if(Shanshuo==1) {a[0]=led[hour1/10]; a[1]=led[hour1%10]; } else {a[0]=led[10]; a[1]=led[10]; } a[2]=led[minute1/10]; a[5]=led[minute1%10]; }break; case5: {a[0]=led[hour1/10]; a[1]=led[hour1%10]; if(Shanshuo==1) {a[2]=led[minute1/10]; a[5]=led[minute1%10]; } else {a[2]=led[10]; a[5]=led[10]; } }break; } } voidkey_prc()//按键
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于单片机电子钟的方案设计 基于 单片机 电子钟 方案设计