您的位置:首页 > 其它

51单片机模拟简单交通灯

2015-11-08 00:00 232 查看
摘要: 本程序提供给正在学习单片机的初学者们,未涉及中断,仅在单一时间线上完成模拟。请大神多喷,不足之处大家交流。(使用中断实现的话会很简单,建议尝试使用)


/***************************************************************************************

设计一个十字路口的信号灯:
要求:
使用红绿黄二极管各两个表示十字路相交叉方向的信号
使用红绿二极管各两个表示人行道的红绿灯信号
使用两个数码管倒计时,红灯15秒,绿灯9秒

***************************************************************************************/


//

***************************************************************************************/

Keil_c源程序

#include<reg52.h>
#define uchar unsigned char
void delayms(unsigned int ms);
void Timer(unsigned int s);
void TimerG();
uchar i;
uchar GeWei[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar ShiWei[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

void main()
{
while(1)
{
TimerG();
}
}

void TimerG()
{
unsigned int gewei;
unsigned int shiwei;
unsigned int k;
unsigned int j;
unsigned int m;

//第一阶段
for(k=15;k>=7;k--)
{
gewei=k%10;
shiwei=k/10;
//闪烁 使数字静止
for(j=0;j<100;j++)
{
P0=0x12;//北向路口灯状态

P1=0x9A;  //个位
P2=~(GeWei[gewei]);//西向倒计时计数器
m=k-6;
P3=~(GeWei[m]);//南向倒计时计数器
delayms(5);

P1=0x95;  //十位
P2=~(ShiWei[shiwei]);//同上
P3=~0x3f;
delayms(5);
}
}

//第二阶段
for(k=6;k>=1;k--)
{
gewei=k%10;
shiwei=k/10;
for(j=0;j<100;j++)
{
P0=0x41;

P1=0x5A;
P2=~(GeWei[gewei]);
m=(k+9)%10;
P3=~(GeWei[m]);
delayms(5);

P0=0x01;//黄灯闪
P1=0x55;
P2=~(ShiWei[shiwei]);
P3=~(ShiWei[(k+9)/10]);
delayms(5);
}
}

//第三阶段
for(k=9;k>=1;k--)
{
gewei=k%10;
shiwei=k/10;
for(j=0;j<100;j++)
{
P0=0x24;

P1=0x6A;
P3=~(GeWei[gewei]);
P2=P3;
delayms(5);

P0=0x20;//黄灯闪
P1=0x65;
P3=~(ShiWei[shiwei]);
P2=P3;
delayms(5);
}
}

for(j=0;j<100;j++)
{
P1=0x0A;
P2=~(0x3f);
P3=P2;

delayms(5);
P1=0x05;
P2=~(0x3f);
P3=P2;
delayms(5);
}
}

//延时函数
void delayms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
}

多多指教,大家一起交流!! :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  交通灯 51单片机