标题:
单片机c51交通灯
[打印本页]
作者:
CZP710430861
时间:
2018-5-16 21:33
标题:
单片机c51交通灯
很简单的一个单片机程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
0.jpg
(24.85 KB, 下载次数: 17)
下载附件
2018-5-17 02:24 上传
单片机源程序如下:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0x0000] //8255 A口地址
#define PB XBYTE[0x0001] //8255 B口地址
#define PC XBYTE[0x0002] //8255 C口地址
#define PS XBYTE[0x0003] //8255 控制口地址
sbit button1=P3^3; //K0 接外部中断1,紧急车辆通过指示开关
sbit button2=P1^0; //K1 支道状态开关
sbit button3=P1^1; //K2 主道状态开关
sbit button4=P3^2; //K3 接外部中断0,调整红绿时长
sbit button5=P0^4;
sbit wei1=P1^4;
sbit wei2=P1^5;
sbit wei3=P1^6;
sbit wei4=P1^7;
sbit wei5=P1^2;
sbit wei6=P1^3;
sbit wei7=P3^0;
sbit wei8=P3^1;
uint num0=0,num1=0;
uint k;
uchar dp1,dp2,dp3,dp4;
uchar code table[]= //共阴七段码
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void time0_int() //计时器初始化
{
TMOD =0x11; //设置定时器0位方式1
TH0=0x3C; //定时50毫秒,初值为15536=3CB0
TL0=0xB0;
EA=1; //开全局中断
EX1=1; //开外部中断1
EX0=1;
IT0=0;
IT1=0; //中断1为低电平触发
ET0=1; //开计时器0中断
TR0=1; //启动计时器0
}
void delay(unsigned int z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ini() //两路灯初始状态
{
P3=0xff;
P1=0xff;
P2=0xff;
PA=0x21;
PB=0x0C;
}
void display0(uchar unit,uchar decade) //南北方向倒计时显示
{
wei1=0; //显示低位
P2=table[unit];
delay(2);
wei1=1;
wei2=0; //高位显示
P2=table[decade];
delay(2);
wei2=1;
wei5=0;
P2=table[unit];
delay(2);
wei5=1;
wei6=0;
P2=table[decade];
delay(2);
wei6=1;
}
void display1(uchar unit,uchar decade) //东西方向倒计时
{
wei3=0; //显示低位
P2=table[unit];
delay(10);
wei3=1;
wei4=0; //显示高位
P2=table[decade];
delay(10);
wei4=1;
wei7=0;
P2=table[unit];
delay(10);
wei7=1;
wei8=0;
P2=table[decade];
delay(10);
wei8=1;
}
void main()
{
PS=0x80; //8255控制字写入,A B C口均为输出,均为方式0
time0_int();
ini();
while(1)
{
while((button1!=0)&&(button2!=0)&&(button3!=0))
{
if((button1!=0)&&(button2!=0)&&(button3!=0)) //南北方向
{
if(num0>0&&num0<540)
{
PA=0x0C; //绿灯亮27秒
dp1=(27-(num0-0)/20)%10;
dp2=(27-(num0-0)/20)/10;
display0(dp1,dp2); //倒计时显示
}
if(num0>=540&&num0<600) //黄灯连续闪烁3秒
{
PA=0x12;
delay(200);
PA=0x00;
dp1=(3-(num0-540)/20)%10;
dp2=(3-(num0-540)/20)/10;
display0(dp1,dp2); //倒计时显示
}
if(num0>=600&&num0<1200) //红灯亮30秒
{
PA=0x21;
dp1=(30-(num0-600)/20)%10;
dp2=(30-(num0-600)/20)/10;
display0(dp1,dp2); //倒计时显示
}
if(num0>=1200)num0=0;
}
if((button1!=0)&&(button2!=0)&&(button3!=0)) //东西方向
{
if(num1>0&&num1<600) //红灯亮30秒
{
PB=0x0C;
dp3=(30-num1/20)%10;
dp4=(30-num1/20)/10;
display1(dp3,dp4); //倒计时显示
}
if(num1>=600&&num1<1140) //绿灯亮27秒
{
PB=0x21;
dp3=(27-(num1-600)/20)%10;
dp4=(27-(num1-600)/20)/10;
display1(dp3,dp4); //倒计时显示
}
if(num1>=1140&&num1<1200) //黄灯连续闪3秒
{
PB=0x12;
delay(200);
PB=0x00;
dp3=3-(num1-1140)/20;
dp4=0;
display1(dp3,dp4); //倒计时显示
}
if(num1>1200)num1=0;
}
}
}
}
void time0() interrupt 1 //定时中断响应
{
TH0=0x3C; //定时1ms初值
TL0=0xB0;
num0++;
num1++;
}
void thing1() interrupt 0 //某一方向放行
{
display0(0,0);
display1(0,0);
while((button1!=0)&&(button2!=0)&&(button3==0)) //南北禁行,东西放行
{
PA=0x21;
PB=0x21;
dp1=8;
dp2=8;
display0(8,8);
display1(8,8);
}
while((button1!=0)&&(button2==0)&&(button3!=0)) //南北放行,东西禁行
{
PA=0x0C;
PB=0x0C;
dp1=8;
dp2=8;
display0(8,8);
display1(8,8);
}
}
void thing2() interrupt 2 //外部中断器1响应_紧急情况_两道禁止通行
{
PA=0x21;
PB=0x0C;
display0(8,8);
display1(8,8);
}
复制代码
所有资料51hei提供下载:
交通灯.rar
(87.73 KB, 下载次数: 37)
2018-5-16 21:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
小军军1
时间:
2019-12-19 14:05
这个有图吗
作者:
小军军1
时间:
2019-12-19 14:24
请问有图吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1