请编程实现单片机控制程序:让单片机开发板上后两位数码管从0开始,以间隔0.5s加1,加到99时,自动回0,重新加1。
时间: 2024-03-16 07:43:14 浏览: 70
这里提供一个基于51单片机的控制程序实现:
```c
#include <reg51.h>
// 数码管显示的段码值,0~9各自占据一个字节
unsigned char code LED[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98};
// 数码管显示的位码值,每个位码值控制一个数码管
unsigned char code LED_POS[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
// 定时器0的初值,计算方式为65536-50000=15536
#define TH0_INIT 0x3c
#define TL0_INIT 0xaf
// 开始显示的数字和初始计数值
unsigned char num = 0;
unsigned char count = 0;
// 定时器0中断处理函数,每500ms中断一次
void timer0_isr() interrupt 1 {
TH0 = TH0_INIT;
TL0 = TL0_INIT;
count++; // 记录计数值
if (count == 100) { // 如果计数值达到100,则重新从0开始计数
count = 0;
num = 0;
}
}
void main() {
unsigned char i;
// 定时器0的工作方式为模式1,16位定时器,不启用自动重装功能
TMOD = 0x01;
TH0 = TH0_INIT;
TL0 = TL0_INIT;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while (1) {
for (i = 0; i < 8; i++) { // 依次控制每个数码管
P2 = LED_POS[i]; // 先控制位码
P0 = LED[num / 10]; // 显示十位数字
delay(5); // 延时一段时间,让数字稳定显示
P0 = 0xff; // 关闭数码管
P2 = LED_POS[i]; // 再控制位码
P0 = LED[num % 10]; // 显示个位数字
delay(5); // 延时一段时间,让数字稳定显示
P0 = 0xff; // 关闭数码管
}
num++; // 数字加1
}
}
// 延时函数,大约延时1ms左右
void delay(unsigned int t) {
unsigned int i;
while (t--) {
for (i = 0; i < 120; i++);
}
}
```
这个程序使用定时器0来实现中断,每500ms中断一次。在中断处理函数中,记录计数值并判断是否达到100,如果达到100则重新从0开始计数。
在程序的主循环中,依次控制每个数码管的位码和段码,显示当前的数字。数字通过变量`num`来表示,初始为0,每次循环加1,加到99时自动回0,重新加1。程序中的`delay`函数用来进行延时,让数字可以稳定显示。
阅读全文