用数码管显示路灯亮的时间,用C语言写单片机程序

用数码管显示路灯(红黄蓝亮的时间),怎么样用次程序编写。红灯亮30s。黄灯5s,绿灯30s

数码管显示路灯亮的时间是一个常见的应用场景,可以通过单片机来实现。下面是一个简单的C语言程序示例,用于控制数码管显示路灯亮的时间。
```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口的输出,实现数码管的显示。
需要注意的是,上述程序只是一个简单的示例,实际应用中可能需要根据具体的数码管型号和单片机型号进行适当的修改。同时,还需要根据实际需求添加其他功能,比如通过按键控制时间的增减、设置亮灯时间等。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-26
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

bit red,green,yellow,turnred;//定义红绿黄灯标志位

code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;

P1=0xfc; //红灯亮
red =1;
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0;
delay(300); //短暂延时
P0=Dis_Gewei; //显示个位
P2=1;
delay(300);
}

}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值99

TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒减1
if(second==0)
{ //这里添加定时到0的代码 ,可以是灯电路,继电器吸合等,或者执行一个程序
if(red)
{
red=0;yellow=1;
second=5;
P1=0xF3;//黄灯亮5秒
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=50;
P1=0xCF;//绿灯亮50秒
}
else if(green)
{
yellow=1;green=0;
second=5;
P1=0xF3;//黄灯亮5秒
turnred=1;
}
else if(yellow && turnred)
{
red=1;yellow=0;
P1=0xFC;//红灯亮60秒
second=60;
turnred=0;
}

}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理

}
}本回答被提问者采纳
第2个回答  2017-10-14
C51单片机中,可以采用定时器Timer和循环+延时语句(需要估算一个_nop_()操作的时长,然后实现延时函数)两种方式实现延时操作。
记得关注我,有什么问题可以直接向我提问。
第3个回答  2011-03-26
学习了
相似回答