设计一个最大范围10s的秒表。按键P3.7有三重功能,包含开始/暂停/清零。第一次按下,秒表开始计时,SEG72显示毫秒,SEG71显示秒。第二次按下,暂停计时。第三次按下,两个数码管数据显示为0。利用proteus使用一个AT89C51芯片,两个数码管分别接P0P2
时间: 2024-05-10 15:18:55 浏览: 77
首先,我们需要定义一些变量和函数来实现秒表的功能。
```c
#include <reg51.h>
#define FREQ 11059200UL // 定义晶振频率
#define MS_PER_TICK 1 // 定义每个计时周期的毫秒数
#define MAX_TIME 10000 // 定义计时最大值,即10秒
unsigned int msec = 0; // 记录毫秒数
unsigned int sec = 0; // 记录秒数
unsigned int running = 0; // 标记秒表是否正在运行
unsigned int paused = 0; // 标记秒表是否被暂停
// 延时函数,参数为毫秒数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < FREQ / 12 / 1000; j++);
}
}
// 更新数码管显示内容,参数为要显示的数字
void update_display(unsigned int num) {
// 将数字转换为数码管对应的编码
unsigned char code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
unsigned char high = num / 10; // 获取十位数
unsigned char low = num % 10; // 获取个位数
// 显示十位数
P0 = 0xFF; // 先全部置1,避免影响其他数码管
P2 = code[high]; // 设置对应的编码
P0 = ~(1 << 2); // 打开第一个数码管
// 稍微延时一下,避免闪烁
delay(1);
// 显示个位数
P0 = 0xFF;
P2 = code[low];
P0 = ~(1 << 3);
// 稍微延时一下,避免闪烁
delay(1);
}
// 计时函数,每个计时周期执行一次
void tick() {
if (running && !paused) { // 如果秒表正在运行且没有被暂停
msec += MS_PER_TICK; // 毫秒数增加
if (msec >= 1000) { // 如果毫秒数达到1000,即一秒
sec++; // 秒数增加
msec = 0; // 毫秒数清零
}
if (sec >= MAX_TIME) { // 如果超过了最大计时值,停止计时
running = 0;
sec = MAX_TIME;
msec = 0;
}
}
}
// 中断处理函数,P3.7按键按下时触发
void interrupt_handler() interrupt 0 {
if (!running) { // 如果秒表还没有开始计时
running = 1;
} else if (!paused) { // 如果秒表正在计时且没有被暂停
paused = 1;
} else { // 如果秒表正在计时且被暂停
paused = 0;
msec += MS_PER_TICK; // 因为上一次计时已经执行过,所以需要再加上一个计时周期的时间
}
if (!P37) { // 如果按键被按下,需要等待松开
delay(50);
while (!P37);
delay(50);
}
}
void main() {
TMOD = 0x01; // 设置计时器0为模式1
TH0 = 0xFC; // 计时器0初始值为65536-4587,每个计时周期为1毫秒
TL0 = 0x67;
ET0 = 1; // 允许计时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动计时器0
while (1) {
tick(); // 每个计时周期执行一次计时函数
update_display(sec * 100 + msec / 10); // 更新数码管显示内容
}
}
```
在Proteus中,我们需要添加一个AT89C51芯片、两个数码管和一个按键。将数码管分别接到P0和P2上,按键接到P3.7上。在AT89C51芯片的属性中,需要勾选“允许中断”和“仿真中断”,以便在Proteus中模拟中断。同时,我们需要设置计时器0的初始值为65536-4587,以便每个计时周期为1毫秒。运行程序后,按下P3.7可以开始、暂停和清零秒表。
阅读全文