51单片机,共阳
时间: 2023-07-24 20:17:49 浏览: 94
16-共阳数码管静态显示(51单片机C语言实例Proteus仿真和代码)
好的,以下是基于51单片机的秒表程序代码,使用4个共阳数码管显示时间,按下按键开始计时,再次按下按键暂停计时。请将共阳数码管连接到P0口,将按键连接到P3.2口。
```
#include <reg52.h>
#define DIGIT P0
#define KEY P3
unsigned char code DisplayTable[] = { // 共阳数码管显示字符表,0-F分别对应0x3F-0xFF
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0xFF
};
unsigned char code TimeTable[] = { // 每个数码管对应的时间变量
0x00, 0x01, 0x02, 0x03
};
bit Running = 0; // 计时器是否在运行
unsigned long TimeCount = 0; // 时间计数器,单位为10毫秒
void delay_ms(unsigned int ms) { // 毫秒级延时函数
unsigned int i, j;
for(i = 0; i < ms; ++i) {
for(j = 0; j < 114; ++j); // 1ms延时,需要根据实际情况调整
}
}
void Display(unsigned long time) { // 数码管显示函数
unsigned char i, j, digit;
for(i = 0; i < 4; ++i) {
digit = (time / TimeTable[i]) % 10; // 获取当前数码管应该显示的数字
DIGIT = DisplayTable[digit]; // 将数字转换为对应的数码管编码
for(j = 0; j < 4; ++j) {
if(j == i) { // 设置该数码管的选通位
P2 = ~(0x01 << j);
} else {
P2 = 0xFF;
}
delay_ms(5); // 稍作延时,消除闪烁
}
}
}
void Timer0_Init() { // 定时器0初始化函数,用于定时10毫秒
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void main() {
unsigned char key_state = 0, last_state = 1; // key_state表示按键状态,last_state表示上一次按键状态
Timer0_Init();
while(1) {
key_state = KEY & 0x04; // 检测按键状态
if(key_state != last_state && key_state == 0) { // 检测到按键按下
Running = ~Running; // 切换计时器状态
if(Running) {
TimeCount = 0; // 开始计时,时间清零
}
}
last_state = key_state;
if(Running) {
Display(TimeCount); // 显示时间
}
}
}
void Timer0_ISR() interrupt 1 { // 定时器0中断服务程序,每10毫秒执行一次
TH0 = 0xFC;
TL0 = 0x67;
TimeCount += 1; // 时间计数器加1
}
```
注意事项:
1. 由于51单片机的定时器精度较低,需要根据实际情况调整延时函数中的参数,以消除数码管闪烁现象。
2. 该程序中使用的时间计数器单位为10毫秒,如果需要更高的计时精度,可以将定时器中断周期缩短,但同时需要增加延时函数的延时时间,以保证数码管的稳定显示。
阅读全文