单片机数字时钟实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字时钟实验报告
一、实验目的
1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。
2、学习用单片机对数字时钟控制、按键扫描及LED数码管显示的设计方法。
3、了解键盘的结构以及工作原理,通过单片机的定义实现对数码管时钟的调整。
二、实验要求
1、可以正常准确的显示时间.
2、可以通过键盘输入来对时间进行调整.
3、能够以两种时钟表示方式显示时间.
4、自由发挥其他功能.
三、实验基本原理
利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为0,每中断一次中断计数初值加1,当加到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断
是否1h到了。采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对
应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期
很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。
利用键盘实现对时钟的调整,定义四个按键,按下第一个按键位置跳变到“分”,在按定义的第二个键每按一次数字加一,当数字到59时再按一次,直接跳变到00;
用第三个键控制“时”的12小时制还是24小时制,对键盘扫描,如果发现该键被
按下,则表示为12进制,每按一次第四个按键数字加一,当到达12时,再按一次直接跳到1,如果没有发现该按键,则默认为24小时制,当数字是23时,再按一
次跳变到00,再按一下第一个键退出对事件的调整。
四、实验设计分析
针对要实现的功能,采用AT89S51单片机进行设计,AT89S51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000
次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准
MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又
能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,
秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用
这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储
单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部
分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要
显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解汇编语言的编程
方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是
软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是
软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查
软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电
路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功
能扩展,在已经正确的设计基础上,添加额外的功能!
以下为具体的数字时钟实现程序段:
#include
#define uchar unsigned char
#define uint unsigned int
uchar sec,sec1,min,min1,hou,hou1,t,num,temp;
uint num1,num2,num3,n,k=0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};
void init();
uchar keyscan();
void control();
void display(uchar ,uchar ,uchar ,uchar ,uchar ,uchar ,uchar ,uchar ); void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(){
init();
while(1){
TR0=0;
keyscan();
control();
TR0=1;
if(t==20){
t=0;
num1++;
if(num1==60){
num1=0;
num2++;
if(num2==60){
num2=0;
num3++;
if(num3>23)
num3=0;
}
}
}
sec1=num1/10;
sec=num1%10;
min1=num2/10;
min=num2%10;
hou1=num3/10;
hou=num3%10;
display(hou1,hou,10,min1,min,10,sec1,sec);
}
}
void init(){
t=0; num1=0,num2=0,num3=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar k,uchar h) {