请用QX-MCS51开发板制作一份简易秒表,要求用到独立按键,数码管,流水灯,蜂鸣器。并写出实验报告与代码
时间: 2023-08-06 21:02:20 浏览: 52
实验报告:
一、实验目的
本实验的目的是使用QX-MCS51开发板,设计并实现一个简易秒表,通过独立按键控制启动、停止、复位,通过数码管显示时间,通过流水灯和蜂鸣器进行提示。
二、实验原理
1.秒表原理
秒表是一种计时器,可以用来测量时间间隔。在本实验中,我们使用单片机作为计时器,通过定时器中断来实现时间的计算和更新。
2.独立按键原理
独立按键是一种开关元件,通过按下和松开按键来实现电路的开关。在本实验中,我们使用独立按键来控制启动、停止、复位秒表。
3.数码管原理
数码管是一种数字显示器件,可以显示数字和一些字母。在本实验中,我们使用数码管来显示秒表的时间。
4.流水灯原理
流水灯是一种LED灯的组合,可以实现类似于水流一样的效果。在本实验中,我们使用流水灯来进行提示。
5.蜂鸣器原理
蜂鸣器是一种声音发生器,可以发出不同的声音。在本实验中,我们使用蜂鸣器来进行提示。
三、实验步骤
1.接线
将独立按键的一个端口连接到P1.0,连接到P1.1,连接到P1.2;将数码管的A~G端口连接到P2.0~P2.6,连接DP端口到P2.7;将流水灯的LED1~LED8端口连接到P0.0~P0.7;将蜂鸣器的正极连接到P3.5,负极连接到VCC。
2.编写程序
首先定义一些常量和变量,包括计时器、秒数、分数、小时数、是否启动、是否停止等。然后编写定时器中断函数,在其中更新计时器和时间。接着编写启动、停止、复位函数,通过设置标志位来控制秒表的状态。最后在主函数中循环调用启动、停止、复位函数,并控制流水灯和蜂鸣器。
3.下载程序
将程序下载到QX-MCS51开发板中。
4.测试
按下启动键开始计时,再按下停止键停止计时并显示时间,再按下复位键可以重新开始计时。
四、实验代码
```
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P0
#define KEY P1
#define DIG P2
sbit BEEP = P3^5;
uchar code Table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};
uchar hour = 0;
uchar min = 0;
uchar sec = 0;
uchar msec = 0;
bit Start = 0;
bit Stop = 0;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delayus(uint xus)
{
while(xus--);
}
void Timer0Init()
{
TMOD |= 0x01;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Timer0() interrupt 1
{
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
msec++;
if(msec == 10)
{
msec = 0;
sec++;
if(sec == 60)
{
sec = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24)
hour = 0;
}
}
}
}
uchar KeyScan()
{
uchar key = 0;
if(KEY == 0x07)
{
delayms(10);
if(KEY == 0x07)
{
key = 1;
while(KEY == 0x07);
}
}
else if(KEY == 0x0B)
{
delayms(10);
if(KEY == 0x0B)
{
key = 2;
while(KEY == 0x0B);
}
}
else if(KEY == 0x0D)
{
delayms(10);
if(KEY == 0x0D)
{
key = 3;
while(KEY == 0x0D);
}
}
return key;
}
void DisplayTime()
{
DIG = 0xFE;
LED = Table[hour/10];
delayus(1000);
DIG = 0xFD;
LED = Table[hour%10];
delayus(1000);
DIG = 0xFB;
LED = Table[min/10];
delayus(1000);
DIG = 0xF7;
LED = Table[min%10];
delayus(1000);
DIG = 0xEF;
LED = Table[sec/10];
delayus(1000);
DIG = 0xDF;
LED = Table[sec%10];
delayus(1000);
}
void StartTimer()
{
Start = 1;
}
void StopTimer()
{
Stop = 1;
}
void ResetTimer()
{
hour = 0;
min = 0;
sec = 0;
msec = 0;
Start = 0;
Stop = 0;
LED = 0x00;
}
void main()
{
uchar key = 0;
Timer0Init();
while(1)
{
key = KeyScan();
if(!Start && key == 1)
StartTimer();
if(Start && !Stop && key == 2)
StopTimer();
if((Start || Stop) && key == 3)
ResetTimer();
if(Start)
DisplayTime();
if(sec == 30 && msec == 0)
{
BEEP = 1;
LED = 0xff;
delayms(500);
BEEP = 0;
LED = 0x00;
}
}
}
```
五、实验总结
通过本次实验,我们学会了使用QX-MCS51开发板设计并实现一个简易秒表,掌握了独立按键、数码管、流水灯和蜂鸣器的使用方法。同时,我们还深入理解了定时器和定时器中断的原理,加深了对单片机系统的认识。