|
源程序如下
#include<reg51.h>
// 數據類型定義
#define u8 unsigned char
#define u16 unsigned int
// 數碼管段選數組
u8 code NUM[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
u8 time_cnt=0;
u8 turn_yellow=0;
u8 ex =1;
u8 turnflag=0;
u8 left_time;
u8 for_time;
// 管腳定義
sbit left_red = P3^0;
sbit left_yellow = P3^1;
sbit left_green = P3^2;
sbit for_red = P3^3;
sbit for_yellow = P3^4;
sbit for_green = P3^5;
sbit leftc=P2^7;
sbit forc = P2^6;
// 延時函數
void delay_us(u16 t)
{
while(t--);
}
// 定時器 50ms
void Timer_Init()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=15536/256;
TL0=15536%256;
TR0=1;
}
//前方向 黃燈亮
void foryellow()
{
forc=0;
leftc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 1;
left_yellow = 0;
left_green = 1;
leftc=0;
forc=1;
for_red=1;
for_yellow=1;
for_green=0;
left_red = 0;
left_yellow = 1;
left_green = 1;
forc=0;
}
// 左右方向 黃燈亮
void leftyellow()
{
forc=0;
leftc=1;
for_red=1;
for_yellow=1;
for_green=0;
left_red = 0;
left_yellow = 1;
left_green = 1;
leftc=0;
forc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 1;
left_yellow = 0;
left_green = 1;
forc=0;
}
//前方向轉向
void forturn()
{
forc=0;
leftc=1;
for_red=1;
for_yellow=1;
for_green=0;
left_red = 0;
left_yellow = 1;
left_green = 1;
leftc=0;
forc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 0;
left_yellow = 1;
left_green = 1;
forc=0;
}
//左右方向轉向
void leftturn()
{
forc=0;
leftc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 0;
left_yellow = 1;
left_green = 1;
leftc=0;
forc=1;
for_red=1;
for_yellow=1;
for_green=0;
left_red = 0;
left_yellow = 1;
left_green = 1;
forc=0;
}
//前進綠燈
void forgo()
{
forc=0;
leftc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 1;
left_yellow = 1;
left_green = 0;
leftc=0;
forc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 0;
left_yellow = 1;
left_green = 1;
forc=0;
}
//前進紅燈
void forstop()
{
forc=0;
leftc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 0;
left_yellow = 1;
left_green = 1;
leftc=0;
forc=1;
for_red=0;
for_yellow=1;
for_green=1;
left_red = 1;
left_yellow = 1;
left_green = 0;
forc=0;
}
//前進方向數碼管顯示
void dispfor(u8 num)
{
P2|=0x0f;
P0=0xff;
P2=(P2&0xc0)|0x01;
P0=NUM[num/10];
delay_us(100);
P0=0xff;
P2|=0x0f;
P0=0xff;
P2=(P2&0xc0)|0x02;
P0=NUM[num%10];
delay_us(100);
P0=0xff;
}
//左右方向數碼管顯示
void displeft(u8 num)
{
P2|=0x0f;
P0=0xff;
P2=(P2&0xc0)|0x04;
P0=NUM[num/10];
delay_us(100);
P0=0xff;
P2|=0x0f;
P0=0xff;
P2=(P2&0xc0)|0x08;
P0=NUM[num%10];
delay_us(100);
P0=0xff;
}
//主函數
void main()
{
for_time=17;
left_time=30;
Timer_Init(); //初始時間
forgo();
while(1)
{
dispfor(for_time);
displeft(left_time);//顯示
}
}
//定時器中斷
void Timer0() interrupt 1
{
TR0=0;
time_cnt++;
if(time_cnt>19)
{
time_cnt=0;
for_time--;
left_time--;
if(for_time==0&&ex) //時間為0
{
if(turn_yellow) //是否變過黃燈
{
if(turnflag==0) //是否轉向
{
for_time=10;
forturn();
turnflag=1;
}
else
{
for_time=30;
left_time=17;
forstop();
ex=0;
turnflag=0;
turn_yellow=0;
}
}
else
{
for_time=3;
foryellow();
turn_yellow=1;
}
}
if(left_time==0&&ex==0)
{
if(turn_yellow) //是否變過黃燈
{
if(turnflag==0) //是否轉向
{
left_time=10;
leftturn();
turnflag=1;
}
else
{
for_time=17;
left_time=30;
forgo();
ex=0;
turnflag=0;
}
}
else
{
left_time=3;
leftyellow();
turn_yellow=1;
}
}
}
TH0=15536/256;
TL0=15536%256;
TR0=1;
}
|
-
-
交通燈仿真文件.zip
2018-6-10 21:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
98.73 KB, 下載次數: 9, 下載積分: 黑幣 -5
評分
-
查看全部評分
|