|
本帖最后由 段智刚 于 2025-6-21 15:26 编辑
可能是某个项目废板,元件不缺但是坏的,当时顺手买一个闲时画出草图,无意间找到坏件改个程序好使了,又购10片修好,仅有一片缺划显示,学到不少够用一阵了。程序还不能独立编写,有瑕疵给指点指点
include <reg51.h>//100秒流水灯程序,加入蜂鸣功能
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// 共阳数码管段选码(P2口)
uchar code seg_table[] = {
0x84, // 0
0x9F, // 1
0xA1, // 2
0x91, // 3
0x9A, // 4
0xD0, // 5
0xC0, // 6
0x9D, // 7
0x80, // 8
0x90 // 9
};
// 位选(P1.0-P1.2)
sbit BIT_100 = P1^0; // 百位
sbit BIT_10 = P1^1; // 十位
sbit BIT_1 = P1^2; // 个位
sbit fengming=P3^4;
// LED灯(P0口,高电平点亮)
uchar led_count = 0; // 记录999秒触发次数
// 定时器0中断变量
uint count = 0; // 50ms计数
uint sec = 0; // 秒数(0-999)
// 延时函数(12MHz晶振)
void delay_ms(uint ms) {
uint i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 123; j++);
}
// 数码管动态显示(带高位消隐)
void display(uint num) {
uchar bai, shi, ge;
bai = num / 100;
shi = num % 100 / 10;
ge = num % 10;
// 显示百位(若为0且不是个位数则不显示)
BIT_100 = 0;
BIT_10 = 1;
BIT_1 = 1;
if (num >= 100) {
P2 = seg_table[bai];
} else {
P2 = 0xFF; // 不显示
}
delay_ms(2);
// 显示十位(若为0且不是个位数则不显示)
BIT_100 = 1;
BIT_10 = 0;
BIT_1 = 1;
if (num >= 10) {
P2 = seg_table[shi];
} else {
P2 = 0xFF; // 不显示
}
delay_ms(2);
// 显示个位(始终显示)
BIT_100 = 1;
BIT_10 = 1;
BIT_1 = 0;
P2 = seg_table[ge];
delay_ms(2);
}
void main() {
uchar i;
// 初始化
P0 = 0x00; // LED全灭(高电平点亮)
P1 = 0xFF; // 位选关闭
P2 = 0xFF; // 段选关闭
fengming=0;
// 上电LED闪烁两次(全亮→全灭→全亮→全灭)
for (i = 0; i < 2; i++) {
P0 = 0xFF; // LED全亮
delay_ms(500);
P0 = 0x00; // LED全灭
delay_ms(500);
}
// 定时器0初始化(50ms中断一次)
TMOD = 0x01; // 定时器0,模式1
TH0 = 0x3C; // 50ms定时(12MHz)
TL0 = 0xB0;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
while (1) {
display(sec); // 显示当前秒数(0-999)
// 999秒触发LED闪烁
if (sec == 999) {
led_count++; // 触发次数+1
sec = 0; // 秒数归零
fengming=1;
delay_ms(250);
fengming=0; // 熄灭
// 第1-8次:依次点亮P0.0-P0.7
if (led_count <= 8) {
P0 = (1 << (led_count - 1)); // 高电平点亮对应LED
}
// 第9次:全灭并重置计数
else if (led_count == 9) {
P0 = 0x00;
led_count = 0;
}
}
}
}
// 定时器0中断服务函数
void timer0() interrupt 1 {
TH0 = 0x3C; // 重装初值
TL0 = 0xB0;
count++;
if (count >= 2) { // 20*50ms = 1s
count = 0;
sec++;
if (sec > 999) sec = 0; // 999秒后归零
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|