?? jiaotongdengkongzhihewenduchuangan.c
字號:
#include <reg51.h>
/////////南北各方向控制位////////////////
sbit sn_right_red = P0^4;
sbit sn_right_green = P0^5;
sbit sn_middle_red = P0^2;
sbit sn_middle_green = P0^3;
sbit sn_left_red = P0^0;
sbit sn_left_green = P0^1;
sbit sn_walk_red = P0^6;
sbit sn_walk_green = P0^7;
/////////東西各方向控制位////////////////
sbit ew_right_red = P2^4;
sbit ew_right_green = P2^5;
sbit ew_middle_red = P2^2;
sbit ew_middle_green = P2^3;
sbit ew_left_red = P2^0;
sbit ew_left_green = P2^1;
sbit ew_walk_red = P2^6;
sbit ew_walk_green = P2^7;
/////////計數器40192預置位,使能/////////////
sbit jsq_j1 = P1^0;
sbit jsq_j2 = P1^1;
sbit jsq_j3 = P1^2;
sbit jsq_en_1 = P1^3;
sbit jsq_en_2 = P1^4;
sbit jsq_down = P1^5;
//*******************************全局變量定義**************************************
unsigned char state_flag;
unsigned char flag_50ms;
unsigned char second;
//**************************************函數頭*****************************
void jsq_zhiwei(unsigned char num); //計數器置位
void state_1(void); //狀態1
void state_2(void); //狀態2
void state_3(void); //狀態3
void state_4(void); //狀態4
void state_5(void); //緊急情況
void state_6(void); //110.119
void init(void);
//**************delay***************
void delay(unsigned int c){
unsigned int i,j;
for(j=0;j<c;j++)
{for(i=0;i<100;i++);}
}
void delay15s(void)
{
unsigned int TempCycA = 185;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//**********************************
//********************************定時器0**************************************
void dingshi_0 (void) interrupt 1
{
int i = 500;
TH0=(65536-50010)/256;//50ms
TL0=(65536-50010)%256;
flag_50ms++;
if (flag_50ms==20)
{
flag_50ms=0;
second++;
jsq_down=0;
while(i--);
jsq_down = !jsq_down;
if (second==60)
{
second=0;
state_flag++;
if (state_flag==5)
{
state_flag=1;
}
}
}
}
//*****************************************************************************
//********************************定時器1**************************************
void dingshi_1 (void) interrupt 3
{
}
//*****************************************************************************
//*******************************外部中斷0*************************************
void zhongduan_0(void) interrupt 0
{
unsigned int a,b;
a = P0;
b = P2;
ET0=0;
TR0=0;
state_6();
delay15s();
P0 = a;
P2 = b;
ET0=1;
TR0=1;
}
//*****************************************************************************
//*******************************外部中斷1*************************************
void zhongduan_1(void) interrupt 2
{
unsigned int a,b;
ET0=0;
TR0=0;
EX1 = 0;
a = P0;
b = P2;
delay(50);
if(INT1==0){
state_5();
delay(1000);
}
while(INT1==1);
delay(500);
P0 = a;
P2 = b;
ET0=1;
TR0=1;
EX1 = 1;
}
//*****************************************************************************
//*********************************main****************************************
void main(void)
{
jsq_zhiwei(5); //計數是60s
jsq_en_1=1; //計數器1使能
jsq_en_2=1; //計數器2使能
jsq_en_1=0; //計數器1預置數
jsq_en_2=0; //計數器2預置數
jsq_en_1=1; //計數器1使能
jsq_en_2=1; //計數器2使能
state_flag=1; //起始是狀態1;
flag_50ms=0;
second=0;
init();
jsq_zhiwei(6);
while(1)
{
switch(state_flag)
{
case 1: state_1();break;
case 2: state_2();break;
case 3: state_3();break;
case 4: state_4();break;
default:break;
}
}
}
//*****************************************************************************
//**********************************init*******************************************
void init(void)
{
TMOD=0x01;//定時器0方式1
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
EA=1;
PX0 = 1;
PX1=1;
ET0=1;
EX0=1;
EX1=1;
TR0=1;
}
//*****************************************************************************
//*****************************************************************************
void jsq_zhiwei(unsigned char num)
{
switch(num)
{
case 0: jsq_j3=0;jsq_j2=0;jsq_j1=0;break;
case 1: jsq_j3=0;jsq_j2=0;jsq_j1=1;break;
case 2: jsq_j3=0;jsq_j2=1;jsq_j1=0;break;
case 3: jsq_j3=0;jsq_j2=1;jsq_j1=1;break;
case 4: jsq_j3=1;jsq_j2=0;jsq_j1=0;break;
case 5: jsq_j3=1;jsq_j2=0;jsq_j1=1;break;
case 6: jsq_j3=1;jsq_j2=1;jsq_j1=0;break;
case 7: jsq_j3=1;jsq_j2=1;jsq_j1=1;break;
default:jsq_j3=1;jsq_j2=1;jsq_j1=0;break;//默認是6,即60s
}
}
//*********************************狀態1********************************************
void state_1(void)
{
unsigned int i;
sn_right_red = 0;
sn_right_green = 1;
sn_middle_red = 1;
sn_middle_green = 0; //南北車輛直行
sn_left_red = 0;
sn_left_green = 1;
sn_walk_red = 1;
sn_walk_green = 0; //南北行人直行
ew_right_red = 0;
ew_right_green = 1;
ew_middle_red = 0;
ew_middle_green = 1;
ew_left_red = 0;
ew_left_green = 1;
ew_walk_red = 0;
ew_walk_green = 1;
while(second < 10);
sn_right_red = 1;
sn_right_green = 0;
ew_right_red = 1;
ew_right_green = 0;
while(second<50);
while(second >= 50)
{
sn_middle_red = 1;
sn_middle_green = ~sn_middle_green;
sn_walk_red = 1;
sn_walk_green = ~sn_walk_green;
for(i=0;i<10000;i++);
}
}
//*****************************************************************************
//************************************狀態2*****************************************
void state_2(void)
{
unsigned int i;
sn_right_red = 1;
sn_right_green = 0; //各路右拐
sn_middle_red = 0;
sn_middle_green = 1; //直行禁止
sn_left_red = 1;
sn_left_green = 0; //南北左拐
sn_walk_red = 0;
sn_walk_green = 1;
ew_right_red = 1;
ew_right_green = 0;
ew_middle_red = 0;
ew_middle_green = 1;
ew_left_red = 0;
ew_left_green = 1;
ew_walk_red = 0;
ew_walk_green = 1;
while(second >= 50)
{
sn_right_red = 1;
sn_right_green = ~sn_right_green;
ew_right_red = 1;
ew_right_green = ~ew_right_green;
sn_left_red = 1;
sn_left_green = ~sn_left_green;
for(i=0;i<10000;i++);
}
}
//*****************************************************************************
//************************************狀態3*****************************************
void state_3(void)
{
unsigned int i;
sn_right_red = 0;
sn_right_green = 1;
sn_middle_red = 0;
sn_middle_green = 1;
sn_left_red = 0;
sn_left_green = 1;
sn_walk_red = 0;
sn_walk_green = 1;
ew_right_red = 0;
ew_right_green = 1;
ew_middle_red = 1;
ew_middle_green = 0; //東西車輛直行
ew_left_red = 0;
ew_left_green = 1;
ew_walk_red = 1;
ew_walk_green = 0; //東西行人直行
while(second < 10); //各路右拐滯后10s開放
sn_right_red = 1;
sn_right_green = 0;
ew_right_red = 1;
ew_right_green = 0;
while(second<50);
while(second >= 50)
{
ew_middle_red = 1;
ew_middle_green = ~ew_middle_green;
ew_walk_red = 1;
ew_walk_green = ~ew_walk_green;
for(i=0;i<10000;i++);
}
}
//*****************************************************************************
//*************************************狀態4****************************************
void state_4(void)
{
unsigned int i;
sn_right_red = 1;
sn_right_green = 0; //各路右拐
sn_middle_red = 0;
sn_middle_green = 1;
sn_left_red = 0;
sn_left_green = 1;
sn_walk_red = 0;
sn_walk_green = 1;
ew_right_red = 1;
ew_right_green = 0;
ew_middle_red = 0;
ew_middle_green = 1;
ew_left_red = 1;
ew_left_green = 0; //東西向左拐
ew_walk_red = 0;
ew_walk_green = 1;
while(second >= 50)
{
sn_right_red = 1;
sn_right_green = ~sn_right_green;
ew_right_red = 1;
ew_right_green = ~ew_right_green;
ew_left_red = 1;
ew_left_green = ~ew_left_green;
for(i=0;i<10000;i++);
}
}
//*****************************************************************************
//*************************************狀態5****************************************
void state_5(void)
{
sn_right_red = 0;
sn_right_green = 1;
sn_middle_red = 0;
sn_middle_green = 1;
sn_left_red = 0;
sn_left_green = 1;
sn_walk_red = 1;
sn_walk_green = 0;
ew_right_red = 0;
ew_right_green = 1;
ew_middle_red = 0;
ew_middle_green = 1;
ew_left_red = 0;
ew_left_green = 1;
ew_walk_red = 1;
ew_walk_green = 0;
}
//*****************************************************************************
//*************************************狀態6****************************************
void state_6(void)
{
EX1=1;
sn_right_red = 0;
sn_right_green = 1;
sn_middle_red = 0;
sn_middle_green = 1;
sn_left_red = 0;
sn_left_green = 1;
sn_walk_red = 0;
sn_walk_green = 1;
ew_right_red = 0;
ew_right_green = 1;
ew_middle_red = 0;
ew_middle_green = 1;
ew_left_red = 0;
ew_left_green = 1;
ew_walk_red = 0;
ew_walk_green = 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -