1、打开Proteus软件,出现如下界面。右边的一个大块是绘图窗口,左边的一个小视图窗口靠近组件SHU列表和控制按钮。
2、单击菜单栏中的“文件”,并从下拉菜单中选择“打开设计”。这里的设计图已经提前准备好了。
3、然后选择。DSN类型文件(Proteus默认的软件类型)。
4、打开后,图纸窗口有图纸。右边是数码管,左边是AT89C51单片机。
5、双击AT89C51单片机在绘图窗口d出窗口。需要根据硬件参数修改时钟周期,这里是12MHz,然后选择程序文件,即十六进制文件。
6、在这里加载十六进制文件。
7、再回到小窗口,其他可根据需要修改,一般设为默认即可。单击OK。
8、现在所有设置都完成了,通过单击左下角的小三角形开始模拟。你可以看到数码管亮在绘图窗口。
其实不用定时中断也能实现功能:
#include<reg51h> 主函数
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组
unsigned int tmp;定义变量
void delay(unsigned int xms)定义延时函数
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定义子函数
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;给时钟初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小时显示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分钟显示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒显示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒进一位,到60清0
{
m++;
s=00;
}
while(m==60)分钟进一位,到60清0
{
h++;
m=00;
}
while(h==24)小时进一位,到24清0
{
h=00;
}
}
}
电子钟相关毕业设计
·数字电子钟的电路设计 (字数:9242,页数:22 )·数字电子钟的设计与制作 (字数:8017,页数:22 )·数字钟的设计 (字数:6208,页数:21 )·基于8051单片机的数字钟 (字数:21638,页数:50)·基于单片机的电子时钟控制系统 (字数:7935,页数:42 )·数字电路数字钟设计 (字数:4846,页数:21 )·电子闹钟设计 (字数:4094,页数:19 )·定时闹钟设计 (字数:5714,页数:24 )·智能定时闹钟设计 (字数:3826,页数:18 )·下棋定时钟设计 (字数:5290,页数:24 )·多功能数字钟设计与制作 (字数:13129,页数:34)·基于单片机的电子钟设计 (字数:7710,页数:24 )·基于单片机的数字电子钟设计 (字数:10301,页数:42)·基于Labview的虚拟数字钟设计 (字数:17457,页数:32)·电子日历钟 (字数:10677,页数:33)·数字钟的设计与制作 (字数:4922,页数:23 )·单片机数字钟设计 (字数:15355,页数:47)·基于单片机的数字钟设计 (字数:12541,页数:27)·单片机定时闹钟设计 (字数:8450,页数:24 )·万年历可编程电子钟控电铃 (字数:14371页数:41)·数字定时闹钟设计 (字数:7770,页数:28 )·基于EDA技术的数字电子钟设计 (字数:12247,页数:32)·多功能时钟打点系统设计 (字数:8353,页数:31 )·智能音乐闹钟设计 (字数:10002,页数:37)·基于AT89S51单片机的数字电子钟设计 (字数:14560,页数:39)
数字电子钟的设计
一、 绪论
(一)引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。尤其在医院,每次护士都会给病人作皮试,测试病人是否对药物过敏。注射后,一般等待5分钟,一旦超时,所作的皮试试验就会无效。手表当然是一个好的选择,但是,随着接受皮试的人数增加,到底是哪个人的皮试到时间却难以判断。所以,要制作一个定时系统。随时提醒这些容易忘记时间的人。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
(二)论文的研究内容和结构安排
本系统采用石英晶体振荡器、分频器、计数器、显示器和校时电路组成。由LED数码管来显示译码器所输出的信号。采用了74LS系列中小规模集成芯片。使用了RS触发器的校时电路。总体方案设计由主体电路和扩展电路两大部分组成。其中主体电路完成数字钟的基本功能,扩展电路完成数字钟的扩展功能。论文安排如下:
1、绪论 阐述研究电子钟所具有的现实意义。
2、设计内容及设计方案 论述电子钟的具体设计方案及设计要求。
3、单元电路设计、原理及器件选择 说明电子钟的设计原理以及器件的选择,主要从石英晶体振荡器、分频器、计数器、显示器和校时电路五个方面进行说明。
4、绘制整机原理图 该系统的设计、安装、调试工作全部完成。
二、设计内容及设计方案
(一)设计内容要求
1、设计一个有“时”、“分”、“秒”(23小时59分59秒)显示且有校时功能的电子钟。
2、用中小规模集成电路组成电子钟,并在实验箱上进行组装、调试。
3、画出框图和逻辑电路图。
4 、功能扩展:
(1)闹钟系统
(2)整点报时。在59分51秒、53秒、55秒、57秒输出750Hz音频信号,在59分59秒时,输出1000Hz信号,音像持续1秒,在1000Hz音像结束时刻为整点。
(3)日历系统。
(二)设计方案及工作原理
数字电子钟的逻辑框图如图1所示。它由石英晶体振荡器、分频器、计数器、译码器显示器和校时电路组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计数器的输出分别经译码器送显示器显示。计时出现误差时,可以用校时电路校时、校分。
图1 数字电子钟逻辑框图
三、单元电路设计、原理及器件选择
(一)石英晶体振荡器
1、重要概念的解释
(1) 反馈:将放大电路输出量的一部分或全部,通过一定的方式送回放大电路的输入端。
(2) 耦合:是指信号由第一级向第二级传递的过程。
2、石英晶体振荡器的具体工作原理
石英晶体振荡器的特点是振荡频率准确、电路结构简单、频率易调整。它被广泛应用于彩电、计算机、遥控器等各类振荡电路中。它还具有压电效应:在晶体某一方向加一电场,晶体就会产生机械变形;反之,若在晶片的两侧施加机械压力,则在晶片相应的方向上将产生电场,这种物理现象称为压电效应。在这里,我们在晶体某一方向加一电场,从而在与此垂直的方向产生机械振动,有了机械振动,就会在相应的垂直面上产生电场,从而使机械振动和电场互为因果,这种循环过程一直持续到晶体的机械强度限制时,才达到最后稳定,这种压电谐振的频率即为晶体振荡器的固有频率。
用反相器与石英晶体构成的振荡电路如图2所示。利用两个非门G1和G2 自我反馈,使它们工作在线性状态,然后利用石英晶体JU来控制振荡频率,同时用电容C1来作为两个非门之间的耦合,两个非门输入和输出之间并接的电阻R1和R2作为负反馈元件用,由于反馈电阻很小,可以近似认为非门的输出输入压降相等。电容C2是为了防止寄生振荡。例如:电路中的石英晶体振荡频率是4MHz时,则电路的输出频率为4MHz。
图2 石英晶体振荡电路
(二)分频器
1、8421码制,5421码制
用四位二进制码的十六种组合作为代码,取其中十种组合来表示0-9这十个数字符号。通常,把用四位二进制数码来表示一位十进制数称为二-十进制编码,也叫做BCD码,见表1。
表1
8421码 5421码
0 0000 0000
1 0001 0001
2 0010 0010
3 0011 0011
4 0100 0100
5 0101 1000
6 0110 1001
7 0111 1010
8 1000 1011
9 1001 1100
2、分频器的具体工作原理
由于石英晶体振荡器产生的频率很高,要得到秒脉冲,需要用分频电路。例如,振荡器输出4MHz信号,通过D触发器(74LS74)进行4分频变成1MHz,然后送到10分频计数器(74LS90,该计数器可以用8421码制,也可以用5421码制),经过6次10分频而获得1Hz方波信号作为秒脉冲信号。(见图3)
图3 分频电路
3、图中标志的含义
CP——输入的脉冲信号
C0——进位信号
Q——输出的脉冲信号
(三)计数器
秒脉冲信号经过6级计数器,分别得到“秒”个位、十位,“分”个位、十位以及“时”个位、十位的计时。“秒”、“分”计数器为60进制,小时为24进制。
1、60进制计数器
(1) 计数器按触发方式分类
计数器是一种累计时钟脉冲数的逻辑部件。计数器不仅用于时钟脉冲计数,还用于定时、分频、产生节拍脉冲以及数字运算等。计数器是应用最广泛的逻辑部件之一。按触发方式,把计数器分成同步计数器和异步计数器两种。对于同步计数器,输入时钟脉冲时触发器的翻转是同时进行的,而异步计数器中的触发器的翻转则不是同时。
(2)60进制计数器的工作原理
“秒”计数器电路与“分”计数器电路都是60进制,它由一级10进制计数器和一级6进制计数器连接构成,如图4所示,采用两片中规模集成电路74LS90串接起来构成的“秒”、“分”计数器。
图4 60进制计数电路
IC1是十进制计数器,QD1作为十进制的进位信号,74LS90计数器是十进制异步计数器,用反馈归零方法实现十进制计数,IC2和与非门组成六进制计数。74LS90是在CP信号的下降沿翻转计数,Q A1和 Q C2相与0101的下降沿,作为“分”(“时”)计数器的输入信号,通过与非门和非门对下一级计数器送出一个高电平1(在此之前输出的一直是低电平0)。Q B2 和Q C2计数到0110,产生的高电平1分别送到计数器的清零R0(1), R0(2),74LS90内部的R0(1)和R0(2)与非后清零而使计数器归零,此时传给下一级计数器的输入信号又变为低电平0,从而给下一级计数器提供了一个下降沿,使下一级计数器翻转计数,在这里IC2完成了六进制计数。由此可见IC1和 IC2串联实现了六十进制计数。
其中:74LS90——可二/五分频十进制计数器
74LS04——非门
74LS00——二输入与非门
2、24进制计数器
小时计数电路是由IC5和IC6组成的24进制计数电路,如图5所示。
当“时”个位IC5计数输入端CP5来到第10个触发信号时,IC5计数器自动清零,进位端QD5向IC6“时”十位计数器输出进位信号,当第24个“时”(来自“分”计数器输出的进位信号)脉冲到达时,IC5计数器的状态为“0100”,IC6计数器的状态为“0010”,此时“时”个位计数器的QC5和“时”十位计数器的QB6输出为“1”。把它们分别送到IC5和IC6计数器的清零端R0(1)和R0(2),通过7490内部的R0(1)和R0(2)与非后清零,从而完成24进制计数。
图5 24进制计数电路
(四) 译码与显示电路
1、显示器原理(数码管)
数码管是数码显示器的俗称。常用的数码显示器有半导体数码管,荧光数码管,辉光数码管和液晶显示器等。
本设计所选用的是半导体数码管,是用发光二极管(简称LED)组成的字形来显示数字,七个条形发光二极管排列成七段组合字形,便构成了半导体数码管。半导体数码管有共阳极和共阴极两种类型。共阳极数码管的七个发光二极管的阳极接在一起,而七个阴极则是独立的。共阴极数码管与共阳极数码管相反,七个发光二极管的阴极接在一起,而阳极是独立的。
当共阳极数码管的某一阴极接低电平时,相应的二极管发光,可根据字形使某几段二极管发光,所以共阳极数码管需要输出低电平有效的译码器去驱动。共阴极数码管则需输出高电平有效的译码器去驱动。
2、译码器原理(74LS47)
译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路成为译码器。译码器输出与输入代码有唯一的对应关系。74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用,表2列出了74LS47的真值表,表示出了它与数码管之间的关系。
表2
输 入 输 出 显示数字符号
LT(——) RBI(——-) A3 A2 A1 A0 BI(—)/RBO(———)
a(—) b(—) c(—) d(—) e(—) f(—) g(—)
1 1 0 0 0 0 1 0 0 0 0 0 0 1 0
1 X 0 0 0 1 1 1 0 0 1 1 1 1 1
1 X 0 0 1 0 1 0 0 1 0 0 1 0 2
1 X 0 0 1 1 1 0 0 0 0 1 1 0 3
1 X 0 1 0 0 1 1 0 0 1 1 0 0 4
1 X 0 1 0 1 1 0 1 0 0 1 0 0 5
1 X 0 1 1 0 1 1 1 0 0 0 0 0 6
1 X 0 1 1 1 1 0 0 0 1 1 1 1 7
1 X 1 0 0 0 1 0 0 0 0 0 0 0 8
1 X 1 0 0 1 1 0 0 0 1 1 0 0 9
X X X X X X 0 1 1 1 1 1 1 1 熄灭
1 0 0 0 0 0 0 1 1 1 1 1 1 1 熄灭
0 X X X X X 1 0 0 0 0 0 0 0 8
(1)LT(——):试灯输入,是为了检查数码管各段是否能正常发光而设置的。当LT(——)=0时,无论输入A3 ,A2 ,A1 ,A0为何种状态,译码器输出均为低电平,若驱动的数码管正常,是显示8。
(2)BI(—):灭灯输入,是为控制多位数码显示的灭灯所设置的。BI(—)=0时。不论LT(——)和输入A3 ,A2 ,A1,A0为何种状态,译码器输出均为高电平,使共阳极数码管熄灭。
(3)RBI(——-):灭零输入,它是为使不希望显示的0熄灭而设定的。当对每一位A3= A2 =A1 =A0=0时,本应显示0,但是在RBI(——-)=0作用下,使译码器输出全为高电平。其结果和加入灭灯信号的结果一样,将0熄灭。
(4)RBO(———):灭零输出,它和灭灯输入BI(—)共用一端,两者配合使用,可以实现多位数码显示的灭零控制。
3、译码器与显示器的配套使用
译码是把给定的代码进行翻译,本设计即是将时、分、秒计数器输出的四位二进制数代码翻译为相应的十进制数,并通过显示器显示,通常显示器与译码器是配套使用的。我们选用的七段译码驱动器(74LS47)和数码管(LED)是共阳极接法(需要输出低电平有效的译码器驱动)。译码显示电路如图6所示。
图6 译码显示电路
(五)校时电路
1、RS触发器(见图7)
图7 基本RS触发器
R(—) S(—)
Q Q(—)
说 明
0 1
1 0
1 1
0 0 0
1
0或1
1 1
0
1或0
1 置0
置1
保持原来状态
不正常状态,0信号消失后,触发器状态不定
2、无震颤开关电路
无震颤开关电路的原理:(见图8)当开关K的刀扳向1点时,S(—)=0,R(—)=1,触发器置1。S(—)端由于开关K的震颤而断续接地几次时,也没有什么影响,触发器置1后将保持1状态不变。因为K震颤只是使S(—)端离开地,而不至于使R(—)端接地,触发器可靠置1。
当开关K从S(—)端扳向R(—)端时,有同样的效果,触发器可靠置0。从Q端或Q(—)端反映开关的动作,输出电平是稳定的。
3、校时电路的实现原理
当电子钟接通电源或者计时发现误差时,均需要校正时间。校时电路分别实现对时、分的校准,由于4个机械开关具有震颤现象,因此用RS触发器作为去抖动电路。采用RS基本触发器及单刀双掷开关,闸刀常闭于2点,每搬动一次产生一个计数脉冲,实现校时功能,电路如图8所示。
图8 校时电路
(六)调 试
毕满清等电子技术实验与课程设计北京:机械工业出
版社,1995131~132
这本书上很全
没有定时器的不过有数字钟的
你可以参考下
其中可有有用的
摘要
本题给出基于单片机的数字中的设计,设计由单片机作为核心控制器,通过频率计数实现计时功能,将实时时间经由单片机输出到显示设备——数码管上显示出来,并通过键盘来实现启动、停止、复位和调整时间的功能。
关键词: 单片机、数字钟、AT89S52、LED
1 引言
在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,五脏俱全”。
现在是一个知识爆炸的新时代。新产品、新技术层出不穷,电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们一旦遇到重要的事情而忘记了时间,这将会带来很大的损失,因此我们需要一个计时系统来提醒这些忙碌的人。 然而,随着科技的发展和社会的进步,人们对时钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能上还是在样式上都发生了质的变化,如电子闹钟、数字闹钟等等。 单片机在多功能数字钟中的应用已是非常普遍的,基于单片机的数字钟给人们带来了极大的方便。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。本文利用单片机实现数字时钟计时功能的主要内容,其中AT89S52是核心元件同时采用数码管动态显示“时”,“分”,“秒”的现代计时装置。与传统机械表相比,它具有走时精确,显示直观等特点。它的计时周期为24小时,显满刻度为“23时59分59秒”,另外具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
2 方案论证
21 方案一
数字钟采用FPGA作为主控制器。由于FPGA具有强大的资源,使用方便灵活,易于进行功能扩展,特别是结合了EDA,可以达到很高的效率。此方案逻辑虽然简单一点,但是一块FPGA的价格很高,对于做电子钟来说有一点浪费,而且FPGA比较难掌握,本设计中不作过多研究,也不采用此方案。
22 方案二
数字钟由几种逻辑功能不同的CMOS数字集成电路构成,共使用了10片数字集成电路,其原理图如图21所示。它是由秒信号发生器(时基电路)、小时分钟计数器及译码和驱动显示电路3部分组成,其基本工作过程是:时基电路产生精确周期的脉冲信号,经过分频器作用给后面的计数器输送1HZ的秒信号,最后由计数器及驱动显示单元按位驱动数码管时间显示,但是这样设计的电路比较复杂,使用也不灵活,而且价格比较高,故不采用此方案。
图21 方案二原理示意图
23 方案三
AT89S52是一种低功耗、高性能CMOS 8位微控制器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。它具有串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑 *** 作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
基于AT89S52单片机来实现系统的控制,外围电路比较简单,成本比较低,此系统控制灵活能很好地满足本课题的基本要求和扩展要求,因此选用该方案。其硬件框图如图22所示,原理图见附录图61。
图22 数字钟硬件框图
24 电路组成及工作原理
本文数字时钟设计原理主要利用AT89S52单片机,由单片机的P0口控制数码管的位显示,P2口控制数码管的段显示,P1口与按键相接用于时间的校正。在设计中引入220V交流电经过整流、滤波后产生+5V电压,用于给单片机及显示电路提供工作电压。
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。在本设计中,24小时时钟显示、秒表的设计和显示都是依靠单片机中的定时器完成。使用定时器T0产生1s的中断,在中断程序中完成每一秒数字的变化,并在主程序中动态显示该字符。其功能框图如图23所示。
图23 秒表外中断的功能示意图
数字钟的电路设计主要功能是提供单片机和外部的LED显示、273地址锁存和片选以及外部存储器2764的接口电路,此外还需要设计相关的LED驱动电路。
(1)电路原理和器件选择
本实例相关的关键部分的器件名称及其在数字钟电路中的主要功能:
89S52:单片机,控制LED的数据显示。
LED1--LED6:用于显示单片机的数据,其中三个采用7段显示用于显示时、分、秒的十位,另三个采用8段显示用于显示时、分、秒的个位。
74LS273:锁存器,LED显示扩展电路中的段码和位码使用了两片74LS273,上升沿锁存。
74LS02:与非门,与单片机的读写信号一起使用,选中外部的74LS273,决定LED的字段和字位的显示内容。
7407:驱动门电路,提供数码管显示的驱动电流。
74LS04:非门,对单片机的片选信号取反,并和读写信号一起使用,决定74LS273的片选。
L1--L4:发光二极管,通过单片机的P14--P17控制,用以显示秒表和时钟的时间变化。
BUZZER:扬声器,在程序规定的情况下,发出声音,提示计时完毕。
74LS373:地址锁存器,将P0口的地址和数据分开,分别输入到2764的数据和地址端口。
2764:EPROM,为单片机提供外部的程序存储区。
开关K0、K1、K2分别调整秒、分、时。
按键RESET:在复位电路中,起到程序复位的作用。
按键PULSE:提供单脉冲,从而实现单片机对外部脉冲的计数功能,利用单脉冲实现相应位加1。
(2)地址分配和连接
P27:和写信号一起组成字位口的片选信号,字位口的对应地址位8000H
P26:和写信号一起组成字段口的片选信号,字段口的对应地址位4000H
D0--D7:单片机的数据总线,LED显示的内容通过D0--D7数据线从单片机传送到LED
P20--P25:单片机的P2口,和2764的高端地址线相连,决定2764中的存储单元的地址。
P14--P17:单片机的P1口,和反光二极管L1--L4相连,通过单片机的P14--P17控制,用以显示秒表和时钟的时间变化。
(3)功能简介
LED显示模块与单片机的连接中,对LED显示模块的读写和字位、字段通道的选择是通过单片机的P26、P27口完成。其中,P26、P27口的片选信号需要和读写信号做一定的逻辑 *** 作,以保证字位和字段选择的正确性。
外部存储器2764是通过74LS373和单片机相连,并且通过P2口的相关信号线进行地址的分配。地址范围为0000H--1FFFH。
3 各电路设计和论证
31电源电路设计
在各种电子设备中,直流稳压电源是必不可少的组成部分,它不仅为系统提供多路电压源,还直接影响到系统的技术指标和抗干扰性能。要想得到我们所要的+5V输出电压,就需将交流220V的电压经过二极管全波整流、电容滤波、7805稳压输出稳定的5V直流电压为整个电路提供电源。
图31 电源电路图
4个IN4004组成桥式整流电路,电容(104uf)用于滤波,LM7805将经过整流滤波的电压稳定在5V输出。
32 晶体振荡器
51系列单片机内部有一个时钟电路(其核心时一个反相放大器),但并没有形成时钟的振荡信号,因此必须外接谐振器才能形成振荡。如何用这个内部放大器,可以根据不同的场合做出不同的选择。这样就对应了单片机时钟产生的不同方式:若采用这个放大器,产生振荡即为内部方式;若采用外部振荡输入,即为外部方式。
方案一、内部方式
如果在51单片机的XTAL1和XTAL2引脚之间外接晶体谐振器,便会产生自激振荡,即可在内部产生与外加晶体同频率的振荡时钟。
最常见的内部方式振荡图如图32所示。
图32 晶体振荡电路
不同单片机最高工作频率不一样,如AT89C51的最高工作频率为24MHZ,AT89S51的最高工作频率可达33MHZ。由于制造工艺的改进,现在单片机的工作频率范围正向两端延伸,可达40MHZ以上。振荡频率越高表示单片机运行的速度越快,但同时对存储器的速度和印刷电路板的要求也就越高。频率太高有时反而会导致程序不好编写(如延时程序)。一般来说,不建议使用很高频率的晶体振荡器。51系列的单片机应用系统一般都选用频率为6~12MHZ的晶振。
这个电路对C1、C2的值没有严格的要求,但电容的大小多少会影响振荡器的稳定性、振荡器频率的高低、起振的快速性等。一般外接晶体时,C1、C2的值通常选为20~100PF。
晶体振荡器是数字钟的核心。振荡器的稳定度和频率的精确度决定了数字钟计时的准确程度,通常采用石英晶体构成振荡器电路。一般说来,振荡器的频率越高,计时的精度也就越高。在此设计中,信号源提供1HZ秒脉冲,它是采用晶体分频得到的。AT89S52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件,XTAL2可以不接,而从XTAL1接入,由于外部时钟信号经过二分频触发后作为外部时钟电路输入的,所以对外部时钟信号的占空比没有其它要求,最长低电平持续时间和最少高电平持续时间等还是要符合要求的。反相放大器的输入端为XTAL1,输出端为XTAL2,两端连接石英晶体及两个电容形成稳定的自激振荡器。电容通常取30PF左右。振荡频率范围是12~12MHz。
晶体振荡器的振荡信号从XTAL2端输出到片内的时钟发生器上。时钟发生器为二分频器。向CPU提供两相时钟信号P1和P2。每个时钟周期有两个节拍(相)P1和P2,CPU就以两相时钟P1和P2为基本节拍指挥AT89S52单片机各部件协调工作。在本次设计中取石英晶体的振荡频率为110592MHz。
另外在设计电路板时,晶振、电容等均应尽量靠近单片机芯片,以减小分布电容,进一步保证振荡器的稳定性。
方案二、外部方式
在较大规模的应用系统中可能会用到多个单片机,为保证各单片机之间时钟信号的同步,应当引入唯一的公用外部脉冲信号作为各单片机的共同的振荡脉冲,也就是要采用外部方式,外部振荡信号直接引入XTAL1和XTAL2引脚。
由于HMOS、CHMOS单片机内部时钟进入的引脚不同,因此外部振荡信号的接入方式也不一样。所以不选用此方案。
33 校时电路
当数字钟走时出现误差时,需要校正时间。校时控制电路实现对“秒”、“分”、“时”的校准。其电路图如图33所示:
图33 校时电路
34 译码显示电路
译码电路的功能是将“秒”、“分”、“时” 计数器中每个计数器的输出状态(8421码),翻译成七段(或八段)数码管能显示十进制数所要求的电信号,然后再经数码管把相应的数字显示出来。译码器采用74LS248译码/驱动器。显示器采用七段共阴极数码管。显示部分是整个电子时钟最为重要的部分,共需要6位LED显示器。采用动态显示方式,所谓动态显示方式是时间数字在LED上一个一个逐个显示,它是通过位选端控制在哪个LED上显示数字,由于这些LED数字显示之间的时间非常的短,使的人眼看来它们是一起显示时间数字的,并且动态显示方式所用的接口少,节省了CPU的管脚。由于端口的问题以及动态显示方式的优越性,在此设计的连接方式上采用共阴级接法。显示器LED有段选和位选两个端口,首先说段选端,它由LED八个端口构成,通过对这八个端口输入的不同的二进制数据使得它的时间显示也不同,从而可以得到我们所要的时间显示和温度。但对于二十个管脚的AT89S52来说,LED八个段选管脚太多,于是我选用2764芯片来扩展主芯片的管脚,74LS164是数据移位寄存器,还选用了74LS373作为数据缓存器。
选用器件时应注意译码器和显示器的匹配,包括两个方面:一是功率匹配,即驱动功率要足够大。因为数码管工作电流较大,应选用驱动电流较大的译码器或OC输出译码器。二是逻辑电平匹配。例如,共阴极型的LED数码管采用高电平有效的译码器。推荐使用的显示译码器有74LS48、74LS49、CC4511。
35 显示电路结构及原理
(1)单片机中通常用七段LED构成 “8” 字型结构,另外,还有一个小数点发光二极管以显示小数位!这种显示器有共阴和共阳两种!发光二极管的阳极连在一起的(公共端)称为共阳极显示器,阴极连在一起的称为共阴极显示器。
一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划,另一个发光二极管为小数点为。当在某段发光二极管上施加一定的正向电压时,该段笔画即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。
在本设计中时、分、秒的十位采用七段显示,个位采用八段显示,使得更易于区分时、分、秒。
(2)LED显示器接口及显示方式
LED显示器有静态显示方式和动态显示方式两种。静态显示就是当显示器显示某个字符时,相应的段恒定的导通或截止,直到显示另一个字符为止。LED显示器工作于静态显示方式时,各位的共阴极接地;若为共阳极则接+5V电源。每位的段选线分别与一个8位锁存器的输出口相连,显示器中的各位相互独立,而且各位的显示字符一经确定,相应锁存的输出将维持不变。
正因为如此,静态显示器的亮度较高。这种显示方式编程容易,管理也较简单,但占用I/O口线资源较多。因此,在显示位数较多的情况下,一般都采用动态显示方式。
由于所有6位段皆由一个I/O口控制,因此,在每一瞬间,6位LED会显示相同的字符。要想每位显示不同的字符,就必须采用扫描方法流点亮各位LED,即在每一瞬间只使某一位显示字符。在此瞬间,段选控制I/O口输出相应字符段选码(字型码),而位选则控制I/O口在该显示位送入选通电平(因为LED为共阴,故应送低电平),以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。
在多位LED显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制。而共阴(共阳)极公共端分别由相应的I/O口线控制,实现各位的分时选通。
段选码,位选码每送入一次后延时2MS,因人的视觉暂留效应,给人看上去每个数码管总在亮。
图34 六位LED动态显示电路
36 键盘部分
它是整个系统中最简单的部分,根据功能要求,本系统共需三个按键:分别对时、分、秒进行控制。并采用独立式按键。
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低后者寿命长。目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路。这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。在本套设计中由于只需要几个功能键,此时,可采用独立式按键结构。
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图35 所示。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
图35 独立式按键结构图
37 复位电路
复位时使CPU和系统中的其他功能部件都处于一个确定的初始状态,复位后计算机就从这个状态开始工作。在复位期间,CPU并没有开始执行程序,是在做准备工作。
无论时在计算机刚上电时、断电后、还是系统出现故障时都需要复位。
51单片机的复位条件靠外部电路实现。当时钟电路工作时,只要在单片机的RESET引脚上持续出现2个TP以上的高电平就可以使单片机复位。但时间过短往往使复位部可靠。为了确保复位,RESET引脚上的高电平一般要维持大约10ms以上。
常见的复位电路有上电复位和按键复位电路。在此我们选用按键复位电路。
(1)上电复位电路
上电复位电路是利用电容充电来实现的。在接通电源的瞬间,RESET端的电位与VCC相同,都是+5V。随着RC电路的充电,RESET的电位逐渐下降,只要保证RESET为高电平的时间大于10ms就能正常复位了。如图36(1)所示。
图36(1)上电复位电路
(2)按键复位电路
在单片机已经通电的情况下,只需要按下图36(2)的K键也可以复位,此时VCC经过电阻Rs、Rk分压,在RESET端产生一个复位高电平。
在图36(2)的电路中,干扰容易窜入复位端,虽然在大多数情况下不会造成单片机的错误复位,但可能会引起内部某些寄存器的错误复位。这时可在RESET端接上一个去耦电容。
另外有些单片机应用系统中的外围芯片也需要复位,如果这些复位端的复位电平要求和单片机的复位要求一致,则可以直接与之相连。常将RC电路接施密特电路后再接入单片机的复位端。这样系统可以有多个复位端,以便保证外部芯片和单片机可靠地同步复位。
图36(2) 按键复位电路
4 软件设计
41 程序流程
程序整体设计:定时模块,显示模块,时间调整模块,状态调整模块。
(1)总体介绍:此部分主要介绍定时模块,和显示模块。定时部分采用经典的定时器定时。它实现了数字钟的主要部分和秒表的主要部分,以及进行定时设置。显示模块是实现数字钟的又一重要部分,其模块的独立程度直接影响到数字钟的可视化程度。在此部分的设计中,设置专用显示数据缓冲区,与分、时及其他数据缓冲区数据区别,在其中存放的是显示段码,而其他缓冲区存放的是时间数据。在显示时,首先将时间十进制数据转化为显示段码,然后送往数码管显示。显示段码采用动态扫描的方式。在要求改变显示数据的类别时,只须改变指向数据缓冲区的指针所指向的十进制数据缓冲区即可。
(2)时间调整:时间调整有多种方式。一、可以直接进入相关状态进行有关 *** 作,二、将调整分两步,先进入状态,然后执行 *** 作,这两步分别由两个键控制。方式一,比较直接,设计思想也比较简单,但是,这种方式存在 *** 作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度(显示部分可以采用8279芯片来控制,可以解决此问题)。 当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。如果采用二的方式,就不会出现这种情况。因为状态的调整,与状态的 *** 作可以分别由两个键控制,其状态的调整数可以多达256个(理论上), *** 作的完成是这样的,一键控制状态的调整,一键控制数据的调整。以上两种方式的实现都可以采用查询和中断的方式。两种方式必须注意的问题是两者进行相关 *** 作的过程不能太长否则会影响显示的扫描。利用查询的方式,方法传统,对此就不作过多的讨论,以下是采用中断的方式实现的数字钟的一些讨论和有关问题作的一些处理。基于以上的讨论可以设计如下:将调整分为状态调整和数据调整两部分,每次进入中断只执行一次 *** 作,然后返回,这样,就不必让中断处于调整等待状态,这样,可以使中断的耗时很小。将定时器中断的优先级设置为最高级,那么中断的方式和查询的方式一样不会影响到时钟的记数。
(3)中断方式应注意的问题:
采用中断的方式,最好将定时器中断的优先级设置为最高级,关于程序数据的稳定性应注意两个问题:一、在低优先级中断响应时,应在入栈保护数据时禁止高优先级的中断响应。二、在入栈保护有关数据后,对中断程序执行有影响的状态位,寄存器,必须恢复为复位状态的值。例如,在用到了十进制调整时,在中断进入时,需将PSW中的AC,CY位清零,否则,十进制调整出错。
(4)定时准确性的讨论:
程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔01秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时间就造成了定时器定时的误差。如果在前述定时器不关的情况下,在中断程序的一开始就给定时器置数,此时误差最小,误差大约为:每01秒,误差7—12个机器周期。当然这是在定时器定时刚好为01秒时的情况,由以上分析,如果数字钟设计为查询的方式或是在中断的方式下将定时器中断设置为最高级,我们在定时值设置时,可以适当的扣除9个机器周期的时间值。但如果在中断的情况下,没有将定时器中断设置为最高级,那就要视中断程序的大小,在定时值设置时,扣除相应的时间值。
(5)软件消抖:
消抖可以采用硬件(施密特触发器)的方式如图44所示,也可以采用软件的方式。在此只讨论软件方式。软件消抖有定时器定时,和利用延时子程序的方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。
如果,设计时采用的是中断的方式来完成有关 *** 作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。
411 系统主程序流程图
图41 主程序流程图
412 各子程序流程图
图42 时钟调整子程序流程图
基于CPLD的VHDL语言数字钟(含秒表)设计
利用一块芯片完成除时钟源、按键、扬声器和显示器(数码管)之外的所有数字电路功能。所有数字逻辑功能都在CPLD器件上用VHDL语言实现。这样设计具有体积小、设计周期短(设计过程中即可实现时序仿真)、调试方便、故障率低、修改升级容易等特点。
本设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和VHDL语言输入—各模块程序设计)实现数字钟的设计、下载和调试。
一、 功能说明
已完成功能
1 完成秒/分/时的依次显示并正确计数;
2 秒/分/时各段个位满10正确进位,秒/分能做到满60向前进位;
3 定时闹钟:实现整点报时,又扬声器发出报时声音;
4 时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行调整;
5 利用多余两位数码管完成秒表显示:A、精度达10ms;B、可以清零;C、完成暂停
可以随时记时、暂停后记录数据。
待改进功能:
1 闹钟只是整点报时,不能手动设置报时时间,遗憾之一;
2 秒表不能向秒进位,也就是最多只能记时100ms;
3 秒表暂停记录数据后不能在原有基础上继续计时,而是复位重新开始。
注意秒表为后来添加功能,所以有很多功能不成熟!
二、 设计方案
1 数字钟顶层设计
外部输入要求:输入信号有1kHz/1Hz时钟信号、低电平有效的秒/微秒清零信号CLR、低电平有效的调分信号SETmin、低电平有效的调时信号SEThour;
外部输出要求:整点报时信号SOUND(59分51/3/5/7秒时未500Hz低频声,59分59秒时为1kHz高频声)、时十位显示信号h1(a,b,c,d,e,f,g)、时个位显示信号h0(a ,b,c,d,e,f,g)、分十位显示信号m1及分个位m0、秒十位s1及秒个位s0、微秒十位ms1及微秒个位ms0;数码管显示位选信号SEL0/1/2等三个信号。
2 内部功能模块主要有:
Fenp分频模块:主要是整点报时用的1kH与500Hz的脉冲信号,这里的输入信号是1KHz信号,所以只要一个二分频即可;时间基准采用1Hz输入信号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用硬件频率信号。
实现带有100进制进位和清零功能,暂定等功能的微秒模块MINSECONDB输入为1Hz脉冲和低电平的清零信号CLR与暂定信号STOP,输出微秒个位、十位及进位信号CO(虽然没有实现进位功能,但还是编写了这个端口,只是在连线时悬空)。
实现60进制带有进位和清零功能的秒计数模块SECOND,输入为1Hz脉冲和低电平有效的清零信号CLR,输出秒个位、时位及进位信号CO。
实现60进制带有进位和置数功能的分计数模块MINUTE,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位及进位信号CO。
实现24进制的时计数模块HOUR,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位。
实现分时复用功能模块SELTIME,输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和显示控制信号SEL。
实现整点报时功能模块ALERT,输入为分/秒信号,输出为高频声控Q1K和Q500。
实现译码显示功能模块DISPLAY,输入为D,输出为Q
三、 设计框图
四、 模块说明(含程序代码)
1 分频模块
采用原理图输入方式实现2分频与1000分频,但这里并没有用到1000分频,因为后来考虑到精度问题,将千分频用直接输入了。程序如图:利用三个7490进行硬
件分频!
2 微秒模块
采用VHDL语言输入方式,以时钟clk,清零信号clr以及暂停信号STOP为进程敏感变量,程序如下:
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
entity MINSECONDb is
port(clk,clrm,stop:in std_logic;----时钟/清零信号
secm1,secm0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------输出/进位信号
end MINSECONDb;
architecture SEC of MINSECONDb is
signal clk1,DOUT2:std_logic;
begin
process(clk,clrm)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---计数
VARIABLE COUNT2 :INTEGER RANGE 0 TO 10 ;
begin
IF CLK'EVENT AND CLK='1'THEN
IF COUNT2>=0 AND COUNT2<10 THEN
COUNT2:=COUNT2+1;
ELSE COUNT2:=0;
DOUT2<= NOT DOUT2;
END IF;
END IF;
if clrm='1' then----当clr为1时,高低位均为0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if stop='1' then
cnt0:=cnt0;
cnt1:=cnt1;
end if;
if cnt1="1001" and cnt0="1000" then----当记数为98(实际是经过59个记时脉冲)
co<='1';----进位
cnt0:="1001";----低位为9
elsif cnt0<"1001" then----小于9时
cnt0:=cnt0+1;----计数
--elsif cnt0="1001" then
--clk1<=not clk1;
else
cnt0:="0000";
if cnt1<"1001" then----高位小于9时
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
secm1<=cnt1;
secm0<=cnt0;
end process;
end SEC;
3 秒模块程序清单
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
entity SECOND is
port(clk,clr:in std_logic;----时钟/清零信号
sec1,sec0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------输出/进位信号
end SECOND;
architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---计数
begin
if clr='1' then----当ckr为1时,高低位均为0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then----当记数为58(实际是经过59个记时脉冲)
co<='1';----进位
cnt0:="1001";----低位为9
elsif cnt0<"1001" then----小于9时
cnt0:=cnt0+1;----计数
else
cnt0:="0000";
if cnt1<"0101" then----高位小于5时
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end SEC;
4 分模块程序清单
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;
architecture MIN of MINUTE is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;
end process;
end MIN;
5 时模块程序清单
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
entity HOUR is
port(clk,en:in std_logic;----输入时钟/高电平有效的使能信号
h1,h0:out std_logic_vector(3 downto 0));----时高位/低位
end HOUR;
architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);----记数
begin
if clk'event and clk='1' then---上升沿触发
if en='1' then---同时“使能”为1
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";----高位/低位同时为0时
cnt0:="0000";
elsif cnt0<"1001" then----低位小于9时,低位记数累加
cnt0:=cnt0+1;
else
cnt0:="0000";
cnt1:=cnt1+1;-----高位记数累加
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;
end process;
end hour_arc;
6 动态扫描模块
library ieee;
use ieeestd_logic_1164all;
use ieeestd_logic_unsignedall;
use ieeestd_logic_arithall;
entity SELTIME is
port(
clk:in std_logic;------扫描时钟
secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分别为秒个位/时位;分个位/
daout:out std_logic_vector(3 downto 0);----------------输出
sel:out std_logic_vector(2 downto 0));-----位选信号
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);----计数信号
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="111") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"111"=>daout<= secm0;----秒个位
when"110"=>daout<= secm1;----秒十位
when"101"=>daout<= sec0;----分个位
when"100"=>daout<= sec1;----分十位
when"011"=>daout<=min0; ----时个位
when"010"=>daout<=min1;----时十位
when"001"=>daout<=h0;
when others =>daout<=h1;
end case;
end process;
end fun;
7 报时模块
library ieee;
use ieeestd_logic_1164all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);------输入秒、分高/低位信号
clk:in std_logic;------高频声控制
q500,qlk:out std_logic);----低频声控制
end ALERT;
architecture sss_arc of ALERT is
begin
process(clk)
begin
if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then----当秒高位为5,低位为9时且分高位为5
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then---当分的低位为1或3或5或7时
q500<='1';----低频输出为1
else
q500<='0';----否则输出为0
end if;
end if;
if m1="0101" and m0="1001" and s1="0101" and s0="1001" then---当秒高位为5,低位为9时且分高位为5,----分低位为9时,也就是“59分59秒”的时候“报时”
qlk<='1';-----高频输出为1
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
8 显示模块
library ieee;
use ieeestd_logic_1164all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);----连接seltime扫描部分d信号
q:out std_logic_vector(6 downto 0));----输出段选信号(电平)
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin
case d is
when"0000" =>q<="0111111";--显示0
when"0001" =>q<="0000110";--显示1
when"0010" =>q<="1011011";--显示2
when"0011" =>q<="1001111";--显示3
when"0100" =>q<="1100110";--显示4
when"0101" =>q<="1101101";--显示5
when"0110" =>q<="1111101";--显示6
when"0111" =>q<="0100111";--显示7
when"1000" =>q<="1111111";--显示8
when others =>q<="1101111";--显示9
end case;
end process;
end disp_are;
9 顶层文件(原理图输入)
10波形仿真(时序图)
五、 结论与建议
1主要是从网上下载,借鉴后自己再根据已学的知识做检查和补充,发挥部分尚不完善。
2微秒进位还需要改进秒模块结构以及一部分逻辑电路组成。
3模块化设计有思路清晰、检查方便、扩展功能容易等诸多优势,且部分已经在本设计过程中得以体现。
4如果能与单片机相结合,相信会有更好的效果,但有些时候CPLD功能比单片机强大得多。
5总体来讲,要独立开发系统为时尚早,还需要不断学习相关EDA设计知识与技能。
六、 参考文献
1徐向民 数字系统设计及VHDL实践 北京 机械出版社 200710
2谢自美 电子线路设计 实验 测试(第二版) 武汉 华中科技大学出版社 2002
文件名说明:
Clockgdf为不含秒表模块的顶层文件;
Clock02gdf为含秒表模块的顶层文件;
因已经硬件上实现功能,故这里没有仿真文件;
各模块文件名相同,但目录不同。
; IC=AT89S52 F=12MHz T=1uS
; WRITER:COCOLI
; 定时器T0、T1溢出周期为50MS(10MS),T0为秒计数用,T1为调整时闪烁用,
; P10、P11、P12为调整按钮,P0口为字符输出口,采用共阳显示管。
; 中断程序入口
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳到标号INTT0执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1 ;跳到标号INTT1执行
ORG 0023H ;串行口中断程序入口
RETI ;串行口中断程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 主程序 ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0030H ;
START:LCALL ST ;上电显示年月日及班级学号
MOV R0,#70H ;清70H~7AH共11个内存单元
MOV R7,#0BH ;
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H ;清20H , 标志用
MOV 7AH,#0AH ;放入“熄灭符”数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H ;50MS定时初值,T0计时用
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值,T1闪烁定时用
MOV TH1,#3CH ;50MS定时初值
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1 S定时用初值50MS20
START1:
LCALL DISPLAY ;调用显示子程序
JNB P33,SETMM1 ;P33口为0时,转时间调整程序
JNB P34,FUNSS ;秒表功能,P34按键调时时作减1 *** 作
JNB P35,FUNPT ;STOP,PUSE,CLR
SJMP START1 ;P33口为1时跳回START1
SETMM1:
LJMP SETMM ;转到时间调整程序SETMM
FUNSS:
LCALL DS20MS ;
JB P34,START1 ;
WAIT11: ;
JNB P34,WAIT11 ;
CPL 03H ;
MOV 70H,#00H ;
MOV 70H,#00H ;
MOV 70H,#00H
MOV 70H,#00H ;
MOV 70H,#00H ;
MOV 70H,#00H ;
AJMP START1 ;
FUNPT: ;
LCALL DS20MS ;
JB P35,START1 ;
WAIT22: ;
JNB P35,WAIT21 ;
CLR ET0 ;
CLR TR0 ;
WAIT33: ;
JB P35,WAIT31 ;
LCALL DS20MS ;
JB P35,WAIT33 ;
WAIT66:
JNB P35,WAIT61
MOV R0,#70H ;清70H~79H共10个内存单元
MOV R7,#0AH
CLEARP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARP
WAIT44:
JB P35,WAIT41
LCALL DS20MS
JB P35,WAIT44
WAIT55:
JNB P35,WAIT51
SETB ET0
SETB TR0
AJMP START1
WAIT21:
LCALL DISPLAY
AJMP WAIT22
WAIT31:
LCALL DISPLAY
AJMP WAIT33
WAIT41:
LCALL DISPLAY
AJMP WAIT44
WAIT51:
LCALL DISPLAY
AJMP WAIT55
WAIT61:
LCALL DISPLAY
AJMP WAIT66
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; 1 s计时程式 ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; T0中断服务程序
INTT0:
PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关定时器T0
JB 03H,FSS ;标志为1转秒表处理程序,,10MS定时
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值,,低8位修正值
MOV A,#3CH ;高8位初值修正
ADDC A,TH0
MOV TH0,A ;重装初值,, 高8位修正值
SETB TR0 ;开启定时器T0
DJNZ R4,OUTT0;20次中断未到中断退出
ADDSS:
MOV R4,#14H ;20次中断到,重赋初值,,1S
MOV R0,#71H ;指向秒计时单元71H~72H
ACALL ADD1 ;调用加1程序,,加1S *** 作
MOV A,R3 ;秒数据放入A,,R3为2位十进制数组合
CLR C ;清进位标志
CJNE A,#60H,ADDMM
ADDMM:
JC OUTT0 ;短于60S时中断退出
ACALL CLR0 ;长于或者等于60S时对秒计数单元清0
MOV R0,#77H ;指向分计时单元,,76H~77H
ACALL ADD1 ;分计时单元加1
MOV A,R3 ;分数据放入A
CLR C ;清进位标志
CJNE A,#60H,ADDHH ;秒表时最大为99
ADDHH:
JC OUTT0 ;短于60min时中断退出
ACALL CLR0 ;长于或者等于60min时对分计数单元清0
MOV R0,#79H ;指向分计时单元,,78H~79H
ACALL ADD1 ;小时计时单元加1h
MOV A,R3 ;时数据放入A
CLR C ;清进位标志
JB 03H,OUTT0 ;秒表时最大为99
CJNE A,#24H,HOUR
HOUR:
JC OUTT0 ;短于24h时中断退出
ACALL CLR0 ;长于或者等于24h时对计时单元清0
OUTT0:
MOV 72H,76H ;中断退出时将分\时计时单元数据移
MOV 73H,77H ;入对应显示单元
MOV 74H,78H
MOV 75H,79H
POP PSW ;恢复状态字出栈
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI
;秒表计时程序(10min加1),低2位为01、001秒,中间2位为秒,最高2位为分
;最大计数值为99分5999秒
FSS: MOV A,#0F7H
ADD A,TL0
MOV TL0,A
MOV A,#0D8H
ADDC A,TH0
MOV TH0,A
SETB TR0
MOV R0,#71H
ACALL ADD1
CLR C
MOV A,R3
JZ FSS1
SETB C
FSS1: AJMP ADDMM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 闪动调时程式 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; T1中断服务程序,用作时间调整单元闪烁指示
INTT1: PUSH ACC
PUSH PSW
MOV TL1,#0B0H
MOV TH1,#3CH
DJNZ R2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:
POP PSW
POP ACC
RETI
FLASH1: JB 01H,FLASH2
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
FLASH2: MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
ADD1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
ADD A,#01H ;A加1 *** 作
DA A ;十进制调整
MOV R3,A ;移入R3中暂存数据
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当前地址单元中
MOV A,R3 ;返回
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 分减1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SUB1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
JZ SUB11
DEC A ;A减1 *** 作
SUB111: MOV R3,A ;移入R3中暂存数据
ANL A,#0FH ;高四位变0
CLR C ;清进位标志
SUBB A,#0AH
SUB1111:
JC SUB1110
MOV @R0,#09H ;大于等于0AH,为9
SUB110:
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当前地址单元中
RET ;返回
SUB11: MOV A,#59H
AJMP SUB111
SUB1110:
MOV A,R3 ;移入R3寄存器
ANL A,#0FH
MOV @R0,A
AJMP SUB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时减1子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SUBB1: MOV A,@R0 ;取当前计时单元数据到A
DEC R0 ;指向前一地址
SWAP A ;A中数据高四位与低四位交换
ORL A,@R0 ;前一地址中数据放入A中低四位
JZ SUBB11 ;00减1为23H
DEC A ;A减1 *** 作
SUBB111:MOV R3,A ;;移入R3中暂存数据
ANL A,#0FH ;高四位变0
CLR C ;清进位标志
SUBB A,#0AH ;时个位大于9为9
SUBB1111:
JC SUBB1110
MOV @R0,#09H ;大于等于0AH,为9
SUBB110:
MOV A,R3 ;取回R3中暂存数据
INC R0 ;指向当前地址单元
SWAP A ;A中数据高四位与低四位交换
ANL A,#0FH ;高四位变0
MOV @R0,A ;数据放入当前地址单元中
RET ;返回
;
SUBB11:
MOV A,#23H
AJMP SUBB111
SUBB1110:
MOV A,R3 ;时个位小于0A不处理
ANL A,#0FH ;高四位变0
MOV @R0,A ;个位移入
AJMP SUBB110
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清0程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复0用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;当调时按键按下时进入此程序
SETMM: CLR ET0 ;关定时器T0中断
CLR TR0 ;关闭定时器T0
LCALL DL1S ;调用1S延时程序
JB P33,CLOSEDIS ;键按下时间短于1S,关闭显示,,省电
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
SETB ET1 ;允许T1中断
SETB TR1 ;开启T1定时器
SET2:
JNB P33,SET1 ;P33口为0时,等待,,键未释放
SETB 00H ;键释放,分调整闪烁标志置1
SET4: ;等待键按下
JB P33,SET3 ;等待键按下
LCALL DL05S ;有键按下,延时05S
JNB P33,SETHH ;按下时间长于05S,转调小时状态
MOV R0,#77H ;按下时间短于05S,加1min *** 作
LCALL ADD1 ;调用加1子程序
MOV A,R3 ;取调整单元数据
CLR C ;消位标志
CJNE A,#60H,HHH ;调整单元数据与60比较
HHH: JC SET4 ;调整单元数据小于60,转SET4循环
LCALL CLR0 ;调整单元数据大于或等于60时,清0
CLR C ;清进位0
AJMP SET4 ;跳转到SET4循环
CLOSEDIS:
SETB ET0 ;省电状态,开T0中断,,LED灯不显示
SETB TR0 ;开启T0中断
CLOSE:
JB P33,CLOSE ;无键按下,等待
LCALL DISPLAY ;有键按下,调用显示子程序延时消抖
JB P33,CLOSE ;是干扰,返回CLOSE等待
WAITH:
JNB P33,WAITH ;等待键释放
LJMP START1 ;返回主程序,,LED数据显示亮
SETHH: CLR 00H ;分闪烁标志清除,,进入调小时状态
SETHH1: JNB P33,SET5 ;等待键释放
SETB 01H ;小时调整标志置1
SET6: JB P33,SET7 ;等待键按下
LCALL DL05S ;有键按下,延时05S
JNB P33,SETOUT ;按下时间长于05S,退出时间调整
MOV R0,#79H ;按下时间短于05S,加1h *** 作
LCALL ADD1 ;调用加1子程序
MOV A,R3
CLR C
CJNE A,#24H,HOUU ;计时单元数据与24比较
HOUU: JC SET6 ;小于24,转SET6循环
LCALL CLR0 ;大于或等于24时,清0 *** 作
AJMP SET6 ;跳到SET6处循环
SETOUT: JNB P33,SETOUT1 ;调时退出程序等待键释放
LCALL DISPLAY ;延时消抖
JNB P33,SETOUT ;是抖动,返回SETOUT再等待
CLR 01H ;清调小时标志
CLR 00H ;清调分标志
CLR 02H ;清闪烁标志
CLR TR1 ;关闭定时器T1
CLR ET1 ;关定时器T1中断
SETB TR0 ;开启定时器T0
SETB ET0 ;开启定时器T0中断,,计时开始
LJMP START1 ;跳回主程序
SET1: LCALL DISPLAY ;键释放等待调时用显示程序
AJMP SET2 ;防止键按下时无时钟显示
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
JNB P33,FUNSUB ;减1分 *** 作
AJMP SET4 ;调分等待
SET5: LCALL DISPLAY ;键释放等待调时用显示程序
AJMP SETHH1 ;防止键按下时无时钟显示
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
JNB P33,FUNSUBB ;小时减1 *** 作
AJMP SET6 ;调时等待
SETOUT1:LCALL DISPLAY ;退出时钟整时键释放等待
AJMP SETOUT ;防止键按下时无时钟显示
;FUNSUB,分减1程序?
FUNSUB: LCALL DISPLAY ;延时消抖
JB P33,SET41 ;干扰,返回调分等待
FUNSUB1:JNB P33,FUNSUB1 ;等待键放开
MOV R0,#77H
LCALL SUB1 ;分减1程序
LJMP SET4 ;返回调分等待
;
SET41: LJMP SET4
;FUNSUB,时减1程序?
FUNSUBB:LCALL DISPLAY ;消抖动
JB P34,SET61 ;干扰,返回调时等待
FUNSUBB1:JNB P34,FUNSUBB1
MOV R0,#79H
LCALL SUBB1
LJMP SET6
;
SET61: LJMP SET6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示数据在70H~75H单元内,用六位LED共阳数码管显示。
;扫描控制,每个LED数码管亮1mS时间。
DISPLAY:
MOV R1,#70H ;指向显示数据首址
MOV R5,#0DFH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
MOV A,R5
JB ACC_1,LOOP5 ;小数点处理
CLR P07
LOOP5: JB ACC_3,LOOP6
CLR P07
LOOP6: LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC_0,ENDOUT ;ACC0=0时,一次显示结束
RR A ;A中数据循环左移
MOV R5,A ;放回R5内
MOV P0,#0FFH
AJMP PLAY ;跳回:PLAY循环
ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共阳段码表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。
;
;SDISPLAY,上电显示程序
;不带小数点,有A、— 显示功能
SDISPLAY:
MOV R5,#0DFH ;扫描控制字初值
SPLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TABS ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
MOV A,R5
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC_0,ENDOUTS ;ACC0=0时,一次显示结束
RR A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP SPLAY ;跳回:PLAY循环
ENDOUTS:MOV P2,#0FFH ;一次显示结束,P2口复位
MOV P0,#0FFH ;P0口复位
RET ;子程序返回
TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;STAB表,启动时显示2003-12-07、A01-2-28
;
STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH
DB 07H,00H,0CH
DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH
;注:0A不亮,0B显示“A”,0C显示“-”
;ST子程序,上电时显示年月日用,采用移动显示
ST: MOV R0,#40H ;将显示内容移入40H~50H单元
MOV R2,#20H
MOV R3,#00H
CLR A
MOV DPTR,#STAB
SLOOP:
MOVC A,@A+DPTR
MOV @R0,A
MOV A,R3
INC A
MOV R3,A
INC R0
DJNZ R2,SLOOP ;移入完毕
MOV R1,#5AH
MOV R3,#1BH ;显示27个单元
SSLOOP:
MOV R2,#32H ;控制移动速度
SSLOOP1:
LCALL SDISPLAY
DJNZ R2,SSLOOP11
MOV A,R1
SUBB A,#07H ;显示首址修正为低1个单元
MOV R1,A
DJNZ R3,SSLOOP
RET
SSLOOP11:
MOV A,R1 ;指针修正为原值
SUBB A,#06H
MOV R1,A
AJMP SSLOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;; 延时程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;1ms延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET;20MS延时程序,采用调用显示子程序,以改善LED的显示闪烁现象
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET;延时程序,用作按键时间的长短判断
DL1S:
LCALL DL05S
LCALL DL05S
RET
DL05S:
MOV R3,#20H ;8ms32=0196s
DL05S1:
LCALL DISPLAY
DJNZ R3,DL05S1
RET;
END ;程序结束
以上就是关于如何在eda软件中打开之前仿真好的仿真文件全部的内容,包括:如何在eda软件中打开之前仿真好的仿真文件、用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设计的电路图、数字钟的毕业论文摘要等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)