TX-1C 郭天祥开发板实现精度为 0.01s秒表

该实验通过STC89C52单片机,利用定时器中断设计了一个精度为0.01s的秒表,显示范围从00.00s到59.99s。实验中,通过键盘控制秒表启动、停止,并用数码管动态显示时间。遇到的问题包括数码管显示重影,解决办法是添加消影操作。实验强调了对单片机中断系统和数码管显示技术的理解与应用。
摘要由CSDN通过智能技术生成

一、实验目的

1、通过所学单片机定时器计数器中断知识,设计秒表,从而实现 00.00s~59.99s 的计时。

2、该实验通过单片机的延时设计及内部中断设计,实现简单的计时器系统。

3、通过所学数码管显示段选位选知识,设计出秒表的显示。

4、综合运用所学的理论知识,通过实践加强对所学知识的理解,具备设计单片 机应用系统的能力,加深对课程的全面认识。

二、实验内容

结合键盘,中断和数码管相关知识,实现一个精度为 0.01s 的秒表,并用数码管 前四位显示。详细要求如下:

1)利用定时器/计数器 T0 的工作方式 1

2)秒表的变化范围是 0.00s~59.99s (必须有小数点)

3)用独立键盘或矩阵键盘控制秒表的启动和停止

三、实验器材(设备、元器件)

硬件:TX-1C 实验板(STC89C52 开发板) 软件:keil uvision4

四、实验原理

1、52 单片机内部带有定时器系统,通过设置与其相关的特殊功能寄存器来选择 启用定时器或计时器,CPU 一旦设置开启定时功能后,定时器便在晶振的作用 下自动开始计时,当计数器记满后,会产生中断,即通知 CPU 进行相关处理。

2、通过调用独立键盘来控制秒表启动、停止及清零功能 3、通过使用数码管动态显示完成秒表记时显示

五、算法流程图

通过流程图,反映出算法设计的逻辑和关键步骤

六、实验结论

include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^5;
sbit key2=P3^4;
//uchar code table3[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xc0};//共阳极
数码管段表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar t2=58,t3=99,s1=0,s2=0,m1=0,m2=0,a=0;
void delay(uint z) //延时子函数
{
uchar i;
while(z--) for(i=0;i<200;i++);
}
void count()
{
if(a==1)
{
a=0;
t3++;
if(t3==99)
{
t3=0;
t2++;
if(t2==59)
{
t2=0;
}
}
}
}
void fenli()
{
m1=t2/10;
m2=t2%10;
s1=t3/10;
s2=t3%10;
}
void display(uchar m1,uchar m2,uchar s1,uchar s2)
{
dula=1;
P0=table[m1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(2);//m1
dula=1;
P0=table2[m2];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//m2
dula=1;
P0=table[s1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(2);//s1
dula=1;
P0=table[s2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(2);//s2
}
void init()
{
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=0;
}
void main()
{
init();
while(1)
{
if(key1==0)
{
//暂停继续
if(key1==0)
{
delay(15);//按键消抖
if(key1==0)
{
TR0=~TR0;//按键按下取反 init()
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
while(!key1);
}
}
//清?零?
}
if(key2==0)
{
delay(15);
if(key2==0)
{
while(!key2);
TR0=0;//一按下去就中断
t2=0;//数据清零
t3=0;
//fenli();
//display( m1, m2, s1,s2);
}
}
fenli();
display( m1, m2, s1,s2);
}
}
void timer0() interrupt 1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
a++;
count();
}

实验效果

 

七、实验结论

学会了秒表(定时中断)设计需求:使用定时器中断,实现每秒共阳极 数码管自加 1。

八、心得体会

实现一个简单的秒表要运用单片机中断函数的知识,以及了解单片机内 部构造(数码管显示)。在写 display()数码管显示模块中,忘记在位选后加 P0=0xff;,导致数码管显示重影。所以要记得消影。

九、对本实验过程及方法、手段的改进建议

希望能有更简单的方式实现计数及四位数分离函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值