51单片机八段数码管计时
时间: 2023-12-06 10:34:14 浏览: 37
51单片机八段数码管计时是一种基于AT89C51单片机的计时器,使用74LS273(8位D触发器)和74LS47(7段数码管驱动器)进行7段数码管倒计时显示。该计时器利用单片机内部定时器产生的定时中断信号,分别利用P0口和P2口来完成八段数码管的显示。在显示数字时,需要同时使用位码和段码,例如P1输入#00H,P2输入#40H,在数码管的第一位会显示“-”。该计时器可以广泛应用于各种计时场合,例如比赛计时、考试计时等。
相关问题
c51单片机四位数码管计时器
以下是一个基于C51单片机的四位数码管计时器的示例程序:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P2^0; // 数码管第一位
sbit D2 = P2^1; // 数码管第二位
sbit D3 = P2^2; // 数码管第三位
sbit D4 = P2^3; // 数码管第四位
uchar code table[] = { // 数码管显示0-9的编码
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
uchar mon = 6, mon0 = 0, day = 26, day0 = 0, hour = 23, hour0 = 0, min = 15, min0 = 0, sec = 0, sec0 = 10, temp0 = 0;
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() { // 数码管显示函数
D1 = 1; D2 = 1; D3 = 1; D4 = 1; // 全部关闭
P0 = table[sec0 % 10]; // 第一位显示秒个位
D1 = 0; delay(5); D1 = 1; // 打开并延时
P0 = table[sec0 / 10]; // 第二位显示秒十位
D2 = 0; delay(5); D2 = 1;
P0 = table[min0 % 10]; // 第三位显示分个位
D3 = 0; delay(5); D3 = 1;
P0 = table[min0 / 10]; // 第四位显示分十位
D4 = 0; delay(5); D4 = 1;
}
void main() {
while (1) {
display(); // 显示当前时间
delay(1000); // 延时1秒
sec0++; // 秒数加1
if (sec0 == 60) { // 如果秒数达到60
sec0 = 0; // 秒数清零
min0++; // 分钟数加1
if (min0 == 60) { // 如果分钟数达到60
min0 = 0; // 分钟数清零
hour0++; // 小时数加1
if (hour0 == 24) { // 如果小时数达到24
hour0 = 0; // 小时数清零
day0++; // 天数加1
if (day0 == 32) { // 如果天数达到32
day0 = 1; // 天数重置为1
mon0++; // 月份加1
if (mon0 == 13) { // 如果月份达到13
mon0 = 1; // 月份重置为1
}
}
}
}
}
if (sec0 == sec && min0 == min && hour0 == hour && day0 == day && mon0 == mon) { // 如果计时结束
for (temp0 = 0; temp0 < 10; temp0++) { // 蜂鸣器响10次
P1 = 0x01; // 打开蜂鸣器
delay(100); // 延时0.1秒
P1 = 0x00; // 关闭蜂鸣器
delay(100); // 延时0.1秒
}
}
}
}
```
该程序通过循环计时并在数码管上显示时间。当计时结束时,蜂鸣器会响10次。
51单片机使数码管计时
好的,您可以使用51单片机来驱动数码管进行计时。首先,需要连接数码管到单片机的I/O口,并且需要编写相应的程序来驱动数码管。
以下是一个简单的程序示例,可以实现让数码管显示从0开始的计时秒数:
```
#include <reg51.h>
// 数码管的引脚连接方式
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P2^3;
sbit key1 = P3^1;
unsigned char code smgduan[17] = { // 数码管段码表
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00
};
unsigned char code table[] = { // 数码管位选码表
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
unsigned long sec = 0; // 秒数计数器
// 延时函数
void delay(unsigned int i){
while(i--);
}
// 数码管显示函数
void display(unsigned char num, unsigned char pos){
dula = 1;
P0 = smgduan[num];
dula = 0;
wela = 1;
P0 = table[pos];
wela = 0;
}
// 计时函数
void timer(){
while(1){
display(sec % 10, 0);
display(sec / 10 % 10, 1);
display(sec / 100 % 10, 2);
display(sec / 1000 % 10, 3);
delay(1000); // 延时1秒
sec++; // 秒数加1
}
}
// 主函数
void main(){
timer();
}
```
在上面的程序中,我们通过定义数码管的引脚连接方式以及数码管的段码表和位选码表,来实现了数码管的显示功能。在计时函数中,我们使用了一个while循环来不断更新数码管的显示,同时使用delay函数来实现1秒钟的延时,以达到计时的效果。