时、分、秒计时器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六时、分、秒计时器的设计
班级物联0901 姓名李王张学号200908888888 指导老师袁文澹
一、实验目的
掌握数码管动态显示的基本方法;
掌握键盘按键控制的实现方法;
根据已知电路和设计要求在实验板上实现时、分、秒计时器。
二、实验内容
1、在STC89C52实验平台上实现时、分、秒时钟,4位数码管上显示分、秒或者时、分。
2、应用键盘控制时间的显示。键盘按键控制“切换时分、分秒显示”、“启动停止”、“加秒显示内容”、“加分显示内容”、“加时显示内容”。
3、根据已知电路和设计要求在PROTEUS平台仿真实现时钟系统。
三、实验原理
三、程序代码汇集:
/*时钟及显示程序,适用于寻迹小车实验板*/
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳七段编码
uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1
uchar miao=00; //定义时钟变量,当temp计数加20(20x50ms=1s)时,miao加1
uchar fen=00; //定义时钟变量,当miao计数加60(60x20x50ms=60s)时,fen加1
uchar shi=00; //定义时钟变量,当fen计数加60时,shi加1 sbit P0_6=P0^6 ;//定义P0端口
/*--定时计数器T0及其中断初始化函数--*/
void timer0init(void)
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值
TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
/*----------延时函数---------------*/
void delay(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=124;j>0;j--);
}
/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/
void time0() interrupt 1
{
TH0=(65536-50000)/256;//重装初值
TL0=(65536-50000)%256;
if(temp==20)
{
temp=0;
if(miao==59)
{miao=0;
if(fen==59)
{fen=0;
if(shi==23) shi=0;
else shi++;
}
else fen++;
}
else miao++;
}
else temp++;
}
/*--------------显示函数------------*/
void display(void)
{
/*P1=0xfe;*/P1=0x7f;//输出秒的个位的位码 P0=table[miao%10]; //输出秒的个位的段码 delay(5); //亮5ms
/*P1=0xfd;*/P1=0xbf;//输出秒的十位的位码 P0=table[miao/10]; //输出秒的十位的段码 delay(5); //亮5ms
/*P1=0xfb;*/P1=0xdf;
P0=0xbf;
delay(5);
/*P1=0xf7;*/ P1=0xef; //输出分的个位的位码P0=table[fen%10]; //输出分的个位的段码
delay(5);
/*P1=0xef;*/P1=0xf7; //输出分的十位的位码P0=table[fen/10]; //输出分的十位的段码
delay(5);
/*P1=0xdf;*/P1=0xfb;
P0=0xbf;
delay(5);
/*P1=0xbf;*/P1=0xfd; //输出时的个位的位码P0=table[shi%10]; //输出时的个位的段码
delay(5);
/*P1=0x7f;*/P1=0xfe; //输出时的十位的位码P0=table[shi/10]; //输出时的十位的段码
delay(5);
}
/*----------主函数-----------------*/
void main(void)
{
timer0init();//调用初始化函数对定时计数器进行初始化
while(1)
{
display();//调用显示函数显示时间
}
四、仿真调试:
在完成程序仿真调试过程中,出现了很多小问题,这些问题虽然简单,但真正解决起来还是比较棘手的。例如,数码管显示时、分、秒的位置错乱,或者是某一位数码管不亮,这样的问题对于高手来说就是小菜一碟,一看就知道是哪出了问题,可我却找了半天才查到,原来是显示函数模块中送入位码时位码的编码出错,为了解决这个下问题,我将每一个数码管的位码都重新编写一次。这个问题解决后,再次仿真时钟并没有按要求显示出来,而是出现下图一样的错误显示,通过仔细观察发现,只是小时与分、分与秒之间的那两位数码管显示错误,于是直接检查那两个标志位数码管的段码,发现原来是输送段码时只是将g段送了个0,以致显示时标志位总是跟随前一位数码管显示。