数字钟实验报告
目 录
一、实验整体思路框图及电路图………………………..1
二、模块分析……………………………………………..2
1. 晶振电路…………………………………………2
2. AT89C51单片机…………………………………2
3. 显示电路………………………………………….2
三、软件设计……………………………………………...3
四、仿真实验调试…………………………………………4
五、总结体会………………………………………………5
六、参考文献………………………………………………6
七、附录……………………………………………………6
一、实验整体思路框图及电路图
数字钟是将时钟信号送入单片机内部,再经单片机输出到显示电路上显示时钟的实验装置。
图1 整体框图
数字钟实验是利用片外晶振电路产生12MHZ 的振荡频率,并送入AT89C51单片机作为时钟的控制频率。将1s 分为20个等分,则每个等分为50ms ,设定片内定时器初值,使其定时50ms ,则20次后给秒针加一,再20次再给秒针加一,60s 满给分针进一,60min 满给时针加一,24h 满数字钟清零重新计数。最后将信号送入六位的7段数码显示管显示。
还可实现开始、暂停、复位、置数等功能。
二、模块分析
1. 晶振电路
晶体振荡器电路给数字钟提供一个频稳定
准确的12MHz 的方波信号, 可保证数字钟的
走时准确及稳定. 不管是指针式的电子钟还
是数字显示的电子钟都使用了晶体振荡器
电路.
图2 晶振电路
2.AT89C51单片机 接口分配电路设计如右图2
所示:
P2口:P2口为一个内部上拉电阻
的8位双向I/O口,P2口缓冲器可接收,
输出4个TTL 门电流,当P2口被写“1”
时,其管脚被内部上拉电阻拉高,且作
为输入。并因此作为输入时,P2口的管
脚被外部拉低,将输出电流。这是由于
内部上拉的缘故。P2口当用于外部程序
存储器或16位地址外部数据存储器进
行存取时,P2口输出地址的高八位。在
给出地址“1”时,它利用内部上拉优势,
当对外部八位地址数据存储器进行读
写时,P2口输出其特殊功能寄存器的内
容。这里只用到了P2.0~P2.5六个端口,
都是作为输出端口控制显示电路的寄存器选择、读写信号和使能端口。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,在这里用到了P3.3 /INT1(外部中断1)、 P3.6 /WR(外部数据存储器写选通)、P3.7 /RD(外部数据存储器读选通)。
图3 单片机接口电路
3. 显示电路
接口分配设计如图4所示:
选用7段共阳极
数码显示管
1接口控制数码管
的十位,2接口控制数
码管的个位,高电平时
读入数据,低电平无
效。
三、软件设计
程序流程图如图所示
四、 仿真实验调试
1. 打开Keil 软件,菜单栏选择“project ”中的“new project ”,在弹出的窗口中选“Ateml AT89C51”,然后新建,编写程序,然后保存后缀为“***.c”的程序。
2. 选择“Target ”中“Output ”中的“HEX ”, 菜单栏选择“project ”中的“build target ”,如果程序无误即编译成功,否则修改程序直至编译成功。
3. 打开Proteus 软件,新建文件File →New Design,同样在弹出的原理图编辑窗口中绘制原理图,然后保存。
4. 加载程序,双击AT89C51加载程序,在弹出的对话框中点击“program file”选择在Keil 软件中编写保存的程序如“***.HEX”,点击“OK ”即加载成功。
5. 在Proteus 软件中的左下方点击图标
试的结果。
仿真调试开始,即可看到仿真调
五、 总结与体会
这虽然是一个数字钟的设计但是实际上就是一个进制数的程序设计。虽然这个单片机的课题比较简单,但是从中我还是学到了许多新东西。在之前的学习过程中没有用到Proteus 这个软件,所以刚刚开始的时候一边在百度里看Proteus 入门教程一边实践操作Proteus 这个软件,举一反三的在短时间内把Proteus 磕磕碰碰学会了。想想我们在大学里速学软件还是比较有心得:在一两周内只学这个软件,或许还算不上熟练但是入门还是可以了。
在Proteus 软件部分的设计中也让我感受良多。以前做的单片机的设计都只是写写程序,下载到单片机上运行,都只是编程方面的工作,很少涉及选择单片机试验台上已有芯片以外的芯片,更不用说芯片的一些管脚作用。
在局部电路图中遇到很多问题,通过查阅大量资料以及老师和同学的帮助讲解才逐渐懂得如何应用。如在Proteus 软件中仿真选用了最常用的7段共阳极数码显示管。这种方法是平时很少注意到的基础性知识运用,在这次的课程设计中让我又有了新的收获。
虽然整个过程有点不顺利,总的来说结果还是完成了设计任务,而且还是温故而知新,对单片机有了一种新的认识。
六、 参考文献
a) 倪云峰. 单片机原理与应用. 西安电子科技大学出版社
b) 王迎旭. 单片机原理与应用. 机械工业出版社
c) 周向红.51系列单片机应用与实践教程. 北京航空航天大学出版社 d) 何立民. 单片机应用系统设计. 北京航空航天大学出版社
七、 附录
1. 程序清单
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit p21=P2^1;
sbit p20=P2^0;
sbit p22=P2^2;
sbit p23=P2^3;
sbit p24=P2^4;
sbit p25=P2^5;
sbit F_J=P3^3;
sbit S_J=P3^4;
sbit K_Q=P3^5;
sbit K_F=P3^6;
uchar m,f,s,k;
uchar mg,ms,fg,fs,sg,ss;
const uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void delay(void)
{ uint i;
for(i=100;i>0;i--);
}
void time0_server_(void) interrupt 1
{
//1MS
TH0=(65536-50000)/256; TL0=(65536-50000)%256; k++;
}
void F_ADD(void)
{ f++;
if(f==60)
f=0;
while(!F_J);
}
void S_ADD(void)
{ s++;
if(s==24)
s=0;
while(!S_J);
}
void display(void)
{ ss=s/10;
sg=s%10;
fs=f/10;
fg=f%10;
ms=m/10;
mg=m%10;
P1=tab[ss];
p20=1;
delay();
p20=0;
P1=tab[sg];
p21=1;
delay();
p21=0;
P1=tab[fs];
p22=1;
delay();
p22=0;
P1=tab[fg];
p23=1;
delay();
p23=0;
P1=tab[ms];
p24=1;
delay();
p24=0;
P1=tab[mg];
p25=1;
delay();
p25=0;
}
void main()
{ k=0;m=0;f=0;s=0;
while(K_Q)
{ if(F_J==0)
{ delay();
if(F_J==0)
F_ADD();}
if(S_J==0)
{ delay();
if(S_J==0)
S_ADD();}
display();
}
while(!K_Q);
TMOD=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;
ET0=1;
TR0=1;
while(1)
{
if(K_F==1)
TR0=1;
if(k==20)
{
k=0;
m++;
if(m==60)
{ m=0;
f++;
if(f==60)
{f=0;
s++;
if(s==24)
s=0;
}
}
if(F_J==0)
F_ADD();
if(S_J==0)
S_ADD();
if(K_F==0)
{m=0;f=0;s=0;TR0=0;}
}
display();
}
}
2. 原理电路图
11
12