电子钟设计文档格式.docx
《电子钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《电子钟设计文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
VSS(20引脚):
接地
STC89C52引脚图如图3-2所示。
P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;
而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
P1口特点是输出锁存器,输出时没有条件。
输入缓冲,输入时有条件,即需要先将该口设为输入状态,先输出1。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)
P3口为准双向口。
可以字节访问,也可以位访问。
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,外部数据存储器读选通。
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
ALE(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
XTAL1(19引脚):
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
图3-2STC89C52引脚图
3.2上电按钮复位电路
复位是单片机的初始化操作,其主要作用是把PC初始化为0000H。
除了进入系统的正常初始化之外,当由于程序运行出错或操作失误使系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
除使PC归零外,复位操作还对其他一些专用寄存器有影响。
通常因为系统运行等的需要,常常需要人工按钮复位,复位电路如图3-3所示。
只需要一个常开按钮开关并联于上电复位电路,按下开关一定时间就能使RES引脚端高电平,从而使单片机复位。
复位脉冲应保持宽度大于2个机器周期,复位脉冲过后,有内部下拉电阻保证RST端为低电平(无效)。
上电复位电路如图3-3所示。
图3-3上电按钮复位电路
3.3振荡电路
CPU工作时都必须有一个时钟脉冲。
本次单片机最小系统采用的是12MHz晶振,由STC89C52单片机内部电路产生时钟脉冲。
有两种方式可以向单片机提供时钟脉冲:
一是外部时钟方式,即使用外部电路向单片机提供时钟脉冲;
二是内部时钟方式,即使用晶振由STC89C52单片机内部电路产生时钟脉冲。
一般常用第二种方法,本次设计也采用内部时钟方式,应尽量保证振荡器稳定和可靠地工作。
晶振电路连接如图3-4所示。
图3-4振荡电路
3.4数码管显示电路
数码管通过74HC573芯片的驱动电路来驱动,采用共阴极接法。
位选由一片74HC573芯片控制,数码管显示出的字形,取决于单片机对位选通电路的控制。
因为设计选择的是一个四位一体的数码管,所以要想使数码管点亮,则应给对应位码一个值,将需要显示的数码管的选通控制打开,该位就显示出字形。
但由于是数码管是动态扫描且演延时时间较短所以我们看到的是四个数码管同时显示。
3.5按键电路
按键电路由4个开关组成。
4个开关分别设置当前时间(时分秒)、切换显示当前时间、设定闹钟时间、切换显示闹钟时间和当前时间。
在电路板上分别与P3.2,P3.3,P3.4,P3.5相连。
按键电路如图3-5所示。
图3-5 按键电路
3.6报警电路
报警电路由PNP三极管,蜂鸣器以及电阻构成,当定时时间到时蜂鸣器鸣叫4s,提醒人们此项程序结束。
报警电路如图3-6所示。
图3-6 报警电路
3.7系统电路原理图
硬件清单:
STC89C52单片机,2片74HC573锁存器芯片,4位数码管一排,独立按键4个,蜂鸣器1个,电阻三个,发光二极管2个,电容一个。
系统电路原理图如图3-7所示。
图3-7系统电路原理图
四、软件设计
4.1主程序设计
主程序是时钟系统的主体,用独立按键来控制时分和分秒的切换,当前时间和闹钟的切换以及对当前时间和闹钟的调整。
根据功能对硬件功能进行分配:
本系统由P0口做段码口,P2口做位码口,P3.0为启停键,P3.1,P3.2为调时键,其中P3.1为取码键(选择要调的位),P3.2为加一键(对选的位进行加1操作)。
流程图如图4-1所示。
图4-1主函数流程图
4.2子程序设计
(1)按键扫描子程序
按键扫描子程序主要是由if函数实现的,通过延时实现去抖。
用while循环等待按键释放,通过独立按键控制要求功能的实现。
P3.0为启停键,P3.1,P3.2为调时键,其中P3.1为取码键(选择要调的位),P3.2为加一键(对选的位进行加1操作)。
流程图如图4-2所示。
图4-2按键扫描流程图
(2)数码管的动态显示子程序
本设计选用共阴极数码管,当某个发光二极管的对应的引脚加入高电平时对应的二极管就会发光。
因此要显示想要的字形就应使该字形的相应段码点亮,实际上就是单片机把要显示的数转化为数码管段码来显示,此数据为字符的段码,但要注意扫描的速度。
图4-3数码管的动态显示子程序流程图
五、源程序
#include<
reg51.h>
unsignedcharled[12]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
//数码管段码
unsignedcharled2[12]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xc0,0x80};
unsignedchara[8];
unsignedcharsecond=0,minute=0,hour=0;
unsignedcharminute1=0,hour1=0;
unsignedcharb[4]={0xfe,0xfd,0xfb,0xf7};
//缓存
unsignedchark=0;
unsignedinttemp;
//记录毫秒为秒的变量
unsignedcharX,N,M,S_flag;
//模式,更新时间的种模式加上正常模式S_flag标志
sbitdula=P2^0;
sbitwela=P2^1;
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
sbitK4=P3^3;
sbitBEEP=P2^6;
voiddelay(unsignedn)//0.2毫秒
{
intx,y;
for(x=0;
x<
n;
x++)
for(y=0;
y<
24;
y++);
}
voidinit()
{
M=0;
S_flag=0;
//闪烁标志位
TMOD=0x10;
//定时器以方式定时
TH1=0xfc;
TL1=0x18;
EA=1;
//打开总中断
ET1=1;
//允许定时器中断
TR1=1;
//开启定时器(开始定时计数)
}
voidtime1()interrupt3//定时器中断函数
{
//定时
temp++;
if(temp==1000)//配合定时器定时
{temp=0;
second++;
if(second==59)
{second=0;
if(minute<
59)
minute++;
else{minute=0;
hour++;
hour%=24;
}
BEEP=1;
if(hour1==hour&
&
minute1==minute&
second<
5)//闹钟时间到
{
BEEP=!
BEEP;
}
if(temp%250==0)//每ms
S_flag=!
S_flag;
//闪烁标志位取反
if(k==8)k=0;
dula=1;
P1=a[k];
dula=0;
wela=1;
P1=b[k++];
wela=0;
delay
(1);
P1=0xff;
}
voiddisplay()
switch(M)
case0:
{if(N==0)
{a[3]=led[minute/10];
a[2]=led2[minute%10];
a[1]=led[second/10];
a[0]=led[second%10];
if(N==1)
{a[3]=led[hour/10];
a[2]=led2[hour%10];
a[1]=led[minute/10];
a[0]=led[minute%10];
if(N==2)
{a[3]=led[hour1/10];
a[2]=led2[hour1%10];
a[1]=led[minute1/10];
a[0]=led[minute1%10];
}break;
case1:
{
if(S_flag==1)
{
a[3]=led[hour/10];
}
else
a[3]=led[11];
a[2]=led[11];
a[0]=led2[minute%10];
case2:
a[3]=led[hour/10];