以下是基于Keil开发环境的C51单片机代码,实现数码管显示1-9999的变化功能:
```c
#include <reg51.h>
sbit D1 = P0^0; // 数码管D1
sbit D2 = P0^1; // 数码管D2
sbit D3 = P0^2; // 数码管D3
sbit D4 = P0^3; // 数码管D4
void delay(unsigned int time) // 延时函数
{
unsigned int i, j;
for(i = time; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(unsigned int num) // 数码管显示函数
{
unsigned int temp;
unsigned char digit[4];
digit[0] = num / 1000; // 千位
digit[1] = (num / 100) % 10; // 百位
digit[2] = (num / 10) % 10; // 十位
digit[3] = num % 10; // 个位
temp = 0xFF; // 关闭所有数码管
P2 = temp;
temp &= ~(1 << 0); // 打开D1数码管
temp |= (digit[0] << 4); // 设置D1数码管显示的数字
P2 = temp;
delay(5);
temp = 0xFF; // 关闭所有数码管
P2 = temp;
temp &= ~(1 << 1); // 打开D2数码管
temp |= (digit[1] << 4); // 设置D2数码管显示的数字
P2 = temp;
delay(5);
temp = 0xFF; // 关闭所有数码管
P2 = temp;
temp &= ~(1 << 2); // 打开D3数码管
temp |= (digit[2] << 4); // 设置D3数码管显示的数字
P2 = temp;
delay(5);
temp = 0xFF; // 关闭所有数码管
P2 = temp;
temp &= ~(1 << 3); // 打开D4数码管
temp |= (digit[3] << 4); // 设置D4数码管显示的数字
P2 = temp;
delay(5);
}
void main()
{
unsigned int num = 1; // 要显示的数字
while(1)
{
display(num); // 显示数字
delay(1000); // 延时1s
num++; // 数字加1
if(num > 9999) // 数字大于9999时重新从1开始
num = 1;
}
}
```
此代码通过4个IO口控制4位共阳极数码管的显示,利用延时函数来控制数码管的刷新频率。主函数中通过一个无限循环不断改变要显示的数字,实现1-9999的变化功能。