标题:
单片机红绿灯设计源代码
[打印本页]
作者:
mdddkk
时间:
2020-9-15 15:27
标题:
单片机红绿灯设计源代码
51hei.png
(13.19 KB, 下载次数: 33)
下载附件
2020-9-21 15:15 上传
单片机源程序如下:
#include<reg51.h>
#define uchar unsigned char
uchar led[ ]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void delay_ms(uchar j) //延时若干ms
{
uchar i;
while(j--)
{
for(i=0;i<125;i++)
for(i=0;i<125;i++);
}
}
void delay_s(uchar i) //延时i秒钟
{
unsigned char a,b,c;
while(i--)
{
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
}
}
void dongxi(uchar a) //东西绿灯 南北红灯
{
uchar j=100; //循环100次
for(a;a>0;a--)
{
P1=0X09;delay_ms(5);
while(j--)
{
P0=0Xfb;
P2=led[a/10]; //显示十位倒计时
delay_ms(5);
P0=0Xf7;
P2=led[a%10]; //显示个位倒计时
delay_ms(5);
if(a<=3) //如果a小于3,则开始黄灯闪烁
{
P1=0X12;
delay_ms(5);
P1=0X00;
delay_ms(5);
}
}}}
void nanbei(uchar a) //南北绿灯 东西红灯
{
uchar j=100;
for(a;a>0;a--)
{
P1=0X24;
delay_ms(5);
while(j--)
{
P0=0Xfe;
P2=led[a/10]; //显示十位倒计时
delay_ms(5);
P0=0Xfd;
P2=led[a%10]; //显示个位倒计时
delay_ms(5);
if(a<=3) //如果a小于3,则开始黄灯闪烁
{
P1=0X12;
delay_ms(5);
P1=0X00;
delay_ms(5);
}
}}}
void main()
{
EA=1; //允许中断
EX0=1; //允许外部中断0
IT0=1; //跳沿触发
while(1)
{
dongxi(10); //东西通行时间10秒
nanbei(10); //南北通行时间10秒
}
}
void int0() interrupt 0 //外部中断0函数
{
uchar i;
EA=0;
P0=0xff;
for(i=5;i>0;i++)
{
P1=0X12;
delay_ms(10);
P1=0X00;
delay_ms(10);
}
P1=0x0c;
delay_s(5);
EA=1;
}
#include<reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit s1=P3^2;//应急通行
u8 code display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0---9
u8 buf[2]={1,0};//初始显示10
u8 num;//1s计时
u8 time=10;//10s倒计时
bit flag=0;
void time0_init()
{
TMOD=0x01;//定时器0,工作于方式1
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
ET0=EA=TR0=1;
}
void delayms(u16 x)//毫秒延时函数
{
u16 i,j;
for(i=0;i<x;i++) //连数x次,约 x ms
for(j=0;j<120;j++); //数120 次,约1 ms
}
void scan()//数码管扫描函数
{
P0=0xfa;P2=display[buf[1]];
delayms(5);
P0=0xf5;P2=display[buf[0]];
delayms(5);
}
void convert(u8 dat)//将数据转成适合数码管显示的数
{
buf[1]=dat/10;
buf[0]=dat%10;
}
void main()//主函数
{
EA=1;
EX0=1;
IT0=1;
time0_init();//初始化
flag=1;
while(1)
{
convert(time);//正常数据转换
scan();//倒计时显示
if(flag==0)
{
P1=0x24;
if(time<=3){P1=0x12;}
}
else if(flag==1)
{
P1=0x09;
if(time<=3){P1=0x12;}
}
}
}
void time0()interrupt 1
{
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
num++;
if(num==20)//1s时间
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
红绿灯.zip
(96.49 KB, 下载次数: 16)
2020-9-15 15:23 上传
点击文件名下载附件
源程序和仿真
下载积分: 黑币 -5
作者:
wb287788
时间:
2020-11-19 11:23
程序有错误
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1