写一个51单片机百毫秒定时器代码实现以下功能:用两位数码管显示时间,最小计时单位为“百毫秒”,计时范围为:0.1s-9.9s。计时功能键第一次被按下,实现功能1:秒表开始计时并显示;计时功能键第二次被按下,实现功能2:停止计时,并显示,如果停止计时的时间恰好为9.9s,则清零,以便下一次从0开始;计时功能键第3次被按下,实现功能3:秒表清零。再按一次计时功能健,则重复上述过程。
时间: 2024-02-17 17:02:38 浏览: 23
好的,以下是51单片机百毫秒定时器代码实现。
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 数码管段码
uchar code table[]={
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
// 定义全局变量
uint cnt = 0; // 计时器计数器
uint sec = 0; // 秒数
uchar flag = 0; // 计时器状态标志,0表示停止,1表示计时中
uchar key = 0; // 按键状态标志,0表示未按下,1表示按下
// 数码管位选函数
void display(uchar num1, uchar num2)
{
uchar i;
for (i = 0; i < 8; i++)
{
P2 = 0xff;
P0 = table[num1];
P2 = ~(1 << i);
delay(1); // 延时1ms
P2 = 0xff;
P0 = table[num2];
P2 = ~(1 << i);
delay(1); // 延时1ms
}
}
// 延时函数
void delay(uint ms)
{
uint i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
// 定时器0中断函数
void timer0() interrupt 1
{
TH0 = (65536 - 1000) / 256; // 1ms
TL0 = (65536 - 1000) % 256;
cnt++;
if (cnt == 100) // 每100ms计数一次
{
cnt = 0;
if (flag == 1) // 计时器计数
{
sec++;
if (sec == 100) // 计时到9.9s,清零
{
sec = 0;
flag = 0; // 停止计时
}
}
}
}
// 按键扫描函数
uchar keyscan()
{
if (P1 != 0xff) // 判断是否有按键按下
{
delay(5); // 延时去抖动
if (P1 != 0xff) // 再次判断是否有按键按下
{
switch (P1)
{
case 0xfe: // K1
return 1;
case 0xfd: // K2
return 2;
case 0xfb: // K3
return 3;
default:
return 0;
}
}
}
else
return 0;
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位自动重装载)
TH0 = (65536 - 1000) / 256; // 1ms
TL0 = (65536 - 1000) % 256;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while (1)
{
key = keyscan(); // 按键扫描
if (key == 1) // 计时功能键第一次被按下
{
if (flag == 0) // 未计时状态
{
flag = 1; // 开始计时
}
}
else if (key == 2) // 计时功能键第二次被按下
{
if (flag == 1) // 计时中状态
{
flag = 0; // 停止计时
if (sec == 100) // 计时到9.9s,清零
sec = 0;
}
}
else if (key == 3) // 计时功能键第三次被按下
{
flag = 0; // 停止计时
sec = 0; // 秒数清零
}
display(sec / 10, sec % 10); // 显示时间
}
}
```
这段代码实现了功能1、功能2、功能3,并且可以重复计时。