单片机的数字时钟设计实验报告551909王健Word文档格式.docx
《单片机的数字时钟设计实验报告551909王健Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机的数字时钟设计实验报告551909王健Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
锻炼分析、解决电子电路问题的实际本领,通过此综合训练,为以后毕业设计打下一定的基础。
89C51单片机简介
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编程和校验时接收高八位地址信号和控制信号。
图2.189C51单片机
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)。
设计要求
自制一个单片机最小系统,包括串口下载、复位电路,采用内部定时器计时,或者采用外部时钟芯片DS1302,设计一个具有秒、分、日、月、年的数字时钟,采用四位一体数码管显示相关信息,秒、分显示一页,日、月显示一页,年显示一页。
系统设计
数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,该数字钟电路主要由译码显示器、“时”,“分”,“秒”和振荡器组成。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”、计数器的输出状态送到六段显示译码器译码,通过六位LED六段显示器显示出来。
该数字电子钟主体电路由以下几部分组成:
通过分频器产生标准秒信号;
60进制分秒计数器以及24小时计数器;
分、时的译码显示部分。
1.框图设计
2.知识点
学会使用并了解89C51的管脚,会利用编程设计数字电子时钟。
在设计的过程中要了解上电复位的概念上电后通过LED数码管来显示时分秒,并通过按键来进行设计时间的作用。
硬件设计
1电路图设计
2晶振与复位电路
3输入部分
4显示部分
软件设计
程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
voiddelayms(uint);
voiddisplay(uchar,uchar,uchar,uchar);
ucharm1=0,m=0,f=0,s=0,r=29,y=5,x;
uintn=2014;
ucharmge,mshi,fshi,fge,rshi,rge,yshi,yge,nqian,nbai,nshi,nge;
sbitkey1=P3^4;
//显示月日
sbitkey2=P3^5;
//显示年
sbitkey3=P3^6;
//时间调整按钮
sbitkey4=P3^7;
//实现加一
sbitkey5=P3^2;
//实现减一
ucharcodetable[]={//共阴极数字编码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voidkeyscan();
voidsg()
{
nqian=n/1000;
nbai=n/100%10;
nshi=n%100/10;
nge=n%10;
yshi=y/10;
yge=y%10;
rshi=r/10;
rge=r%10;
fshi=f/10;
fge=f%10;
mshi=m/10;
mge=m%10;
}
voidqr()//定时器部分
{if(m1==20)
{m1=0;
m++;
if(m==60)
{m=0;
f++;
}
if(f==60)
{f=0;
s++;
if(s==24)
{s=0;
r++;
if(y==2)
{if(r==29)
{r=1;
y++;
}
}
elseif(y==4||6||9||11)
{if(r==31)
else
{if(r==32)
}
if(y==13)
{y=1;
n++;
}
}
}
voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)//数码管显示部分
sg();
P2=0xfe;
P0=table[qian];
delayms(5);
P2=0xfd;
P0=table[bai];
P2=0xfb;
P0=table[shi];
P2=0xf7;
P0=table[ge];
voidinit()//初始函数
{TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
voidkeyscan()//时间调整按钮选择
{sg();
if(key1==0)
{delayms(10);
while(!
key1)
display(yshi,yge,rshi,rge);
key1);
}}
if(key2==0)
if(key2==0)
key2)
display(nqian,nbai,nshi,nge);
key2);
if(key3==0)
if(key3==0)
{x++;
TR0=0;
if(x==6)
{x=0;
TR0=1;
while(!
key3);
if(x!
=0)//定义时间调整范围
{switch(x)
{case1:
if(key4==0)
{delayms(10);
if(key4==0)
{m++;
if(m==60)
{m=0;
f++;
while(!
key4)
{display(fshi,fge,mshi,mge);
}
if(key5==0)
{m--;
if(m==-1)
{m=59;
f--;
key5)
case2:
{f++;
if(f==60)
{f--;
if(f==-1)
{f=59;
s--;
case3:
{r++;
if(r==32)
{r=1;
y++;
{display(yshi,yge,rshi,rge);
{r--;
if(r==0)
{r=31;
y--;
case4:
{y++;
{y=1;
{y--;
if(y==0)
{y=12;
case5:
{n++;
{display(nqian,nbai,nshi,nge);
{n--;
}}
voidmain()
{init();
while
(1)
display(fshi,fge,mshi,mge);
keyscan();
voiddelayms(uintxms)//延时函数
{uinti,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
voidT0_time()interrupt1//定时中断
{m1++;
qr();
经验体会
在盘老师的教导下,通过一周的学习基本懂得了数字时钟的原理和设计,通过这次的设计使我认识到本人对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分,也让我了解了关于数字钟的原理与设计理念,要设计一个电路先进行软件模拟仿真再进行实际的电路制作。
但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解。
在今后的其他工作中,也可以把这次设计中的收获运用进去,这是我此次课程设计得到的最大财富。
课程设计是大学生活中重要阶段的工作,是真正考验我们能力的一项教学内容,在这个过程中我认真思考,不断尝试,收获了很多在平时的课堂上收获不到的东西。
课程设计即将结束,我会吸取课程设计中的经验和教训,在今后的工作中少走弯路。
实物图