```c
#include
sbit D1 = P2^0; // 定義數碼管引腳
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
void delay(unsigned int t) // 延時函數
{
unsigned int i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(unsigned int time) // 數碼管顯示函數
{
unsigned int i;
unsigned int digit[4]; // 數碼管的四位數值
digit[0] = time / 1000; // 千位
digit[1] = (time % 1000) / 100; // 百位
digit[2] = (time % 100) / 10; // 十位
digit[3] = time % 10; // 個位
for(i = 0; i < 4; i++)
{
switch(i)
{
case 0: D1 = 1; D2 = 0; D3 = 0; D4 = 0; break; // 顯示千位
case 1: D1 = 0; D2 = 1; D3 = 0; D4 = 0; break; // 顯示百位
case 2: D1 = 0; D2 = 0; D3 = 1; D4 = 0; break; // 顯示十位
case 3: D1 = 0; D2 = 0; D3 = 0; D4 = 1; break; // 顯示個位
}
P0 = digit[i]; // 設置數碼管顯示的數值
delay(1); // 延時1ms
P0 = 0x00; // 關閉數碼管
}
}
void main()
{
unsigned int time = 0; // 路燈亮的時間,單位為秒
while(1)
{
display(time); // 顯示路燈亮的時間
delay(1000); // 延時1秒
time++; // 時間加1秒
}
}
```
上述程序使用了8051系列單片機,通過控制P0口的輸出來控制數碼管的顯示。程序中的`delay`函數用於延時,`display`函數用於顯示數碼管的數值。`main`函數中的循環不斷更新時間並顯示在數碼管上。
該程序的原理是每隔1秒更新壹次時間,並將時間的四位數值分別顯示在數碼管的四位上。其中,千位顯示在D1引腳,百位顯示在D2引腳,十位顯示在D3引腳,個位顯示在D4引腳。通過控制這四個引腳的高低電平,以及P0口的輸出,實現數碼管的顯示。
需要註意的是,上述程序只是壹個簡單的示例,實際應用中可能需要根據具體的數碼管型號和單片機型號進行適當的修改。同時,還需要根據實際需求添加其他功能,比如通過按鍵控制時間的增減、設置亮燈時間等。