用51单片机写一个数码管循化显示123456789的程序
时间: 2023-05-28 18:08:03 浏览: 292
以下是使用51单片机和共阴数码管实现循环显示123456789的程序:
#include <reg52.h>
// 数码管位选控制(共阴数码管使用低电平激活)
sbit DIG1 = P1^0;
sbit DIG2 = P1^1;
sbit DIG3 = P1^2;
sbit DIG4 = P1^3;
// 数码管段选控制(共阴数码管使用高电平激活)
sbit SEG_A = P0^0;
sbit SEG_B = P0^1;
sbit SEG_C = P0^2;
sbit SEG_D = P0^3;
sbit SEG_E = P0^4;
sbit SEG_F = P0^5;
sbit SEG_G = P0^6;
sbit SEG_DP = P0^7;
// 数码管段码数据(共阴数码管使用低电平表示)
unsigned char code SEG_TABLE[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++);
}
}
// 显示数字到数码管
void display(unsigned char num) {
// 数码管位选控制
DIG1 = 1;
DIG2 = 1;
DIG3 = 1;
DIG4 = 1;
// 数码管段选控制
SEG_A = SEG_TABLE[num % 10] & 0x01;
SEG_B = (SEG_TABLE[num % 10] >> 1) & 0x01;
SEG_C = (SEG_TABLE[num % 10] >> 2) & 0x01;
SEG_D = (SEG_TABLE[num % 10] >> 3) & 0x01;
SEG_E = (SEG_TABLE[num % 10] >> 4) & 0x01;
SEG_F = (SEG_TABLE[num % 10] >> 5) & 0x01;
SEG_G = (SEG_TABLE[num % 10] >> 6) & 0x01;
SEG_DP = 0;
DIG1 = 0;
// 延时一段时间
delay(5);
// 数码管段选控制
SEG_A = SEG_TABLE[num % 100 / 10] & 0x01;
SEG_B = (SEG_TABLE[num % 100 / 10] >> 1) & 0x01;
SEG_C = (SEG_TABLE[num % 100 / 10] >> 2) & 0x01;
SEG_D = (SEG_TABLE[num % 100 / 10] >> 3) & 0x01;
SEG_E = (SEG_TABLE[num % 100 / 10] >> 4) & 0x01;
SEG_F = (SEG_TABLE[num % 100 / 10] >> 5) & 0x01;
SEG_G = (SEG_TABLE[num % 100 / 10] >> 6) & 0x01;
SEG_DP = 0;
DIG2 = 0;
// 延时一段时间
delay(5);
// 数码管段选控制
SEG_A = SEG_TABLE[num % 1000 / 100] & 0x01;
SEG_B = (SEG_TABLE[num % 1000 / 100] >> 1) & 0x01;
SEG_C = (SEG_TABLE[num % 1000 / 100] >> 2) & 0x01;
SEG_D = (SEG_TABLE[num % 1000 / 100] >> 3) & 0x01;
SEG_E = (SEG_TABLE[num % 1000 / 100] >> 4) & 0x01;
SEG_F = (SEG_TABLE[num % 1000 / 100] >> 5) & 0x01;
SEG_G = (SEG_TABLE[num % 1000 / 100] >> 6) & 0x01;
SEG_DP = 0;
DIG3 = 0;
// 延时一段时间
delay(5);
// 数码管段选控制
SEG_A = SEG_TABLE[num / 1000] & 0x01;
SEG_B = (SEG_TABLE[num / 1000] >> 1) & 0x01;
SEG_C = (SEG_TABLE[num / 1000] >> 2) & 0x01;
SEG_D = (SEG_TABLE[num / 1000] >> 3) & 0x01;
SEG_E = (SEG_TABLE[num / 1000] >> 4) & 0x01;
SEG_F = (SEG_TABLE[num / 1000] >> 5) & 0x01;
SEG_G = (SEG_TABLE[num / 1000] >> 6) & 0x01;
SEG_DP = 0;
DIG4 = 0;
// 延时一段时间
delay(5);
}
void main() {
unsigned char i = 1;
while (1) {
display(i);
i++;
if (i > 9) {
i = 1;
}
}
}
该程序使用了一个延时函数来控制数码管的刷新频率,以达到看起来连续不断的效果。其中,delay(5)
表示延时5毫秒,可以根据需要进行调整。同时,由于共阴数码管使用低电平激活,因此需要在代码中将相应的控制引脚设置为高电平,如DIG1 = 1
。在数码管段选控制中,我们需要将相应的位选和段选控制引脚设置为正确的电平来控制数码管的显示。最后,在主函数中我们使用一个循环来不断显示数字,并在数字达到9时重新从1开始显示。
相关推荐















