設計目標
1、設計一交通燈控制,控制東西方向的紅、黃、綠燈和南北方向的紅、黃、綠燈。
2、可手動控制和自動控制,設置兩個輸入控制開關。
手動/自動開關,通過P11的按鍵輸入控制
3、手動:設置開關P11,兩種情況:紅燈管制(各方向)紅燈,和各個方向都是黃燈閃爍(周期2S)
4、自動:東西綠燈亮5S,南北紅燈亮5S;東西黃燈亮3S,南北紅燈亮3S;東西紅燈亮5S,南北綠燈亮5S;東西紅燈亮3S,南北黃燈亮3S:然后重復剛才過程,不斷循環。
硬件設計
東西向:紅燈:P2_0 綠燈:P2_1 黃燈:P2_2
南北向:紅燈:P2_5 綠燈:P2_6 黃燈:P2_7
按鍵: P1_0 P1_1
代碼實現
軟件延時
void Delay20ms(void) //@11.0592MHz,用于按鍵消抖
{unsigned char data i, j;i = 216;j = 37;do{while (--j);} while (--i);
}
按鍵部分
void key_read()
{if(P1_0 == 0){Delay20ms();if(P1_0 == 0){mode++;time = 0;sec = 0;}while(!P1_0);}if(P1_1 == 0){Delay20ms();if(P1_1 == 0){flag++;time = 0;sec = 0;}while(!P1_1);}
}
定時器計時部分
void Timer0_Init(void) //定時器初始化,10ms
{TMOD &= 0xF0; //設置定時器模式TMOD |= 0x01; //設置定時器模式TL0 = 0xF0; //設置定時初始值TH0 = 0xD8; //設置定時初始值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0 = 1; //使能定時器0中斷EA = 1; //使能總中斷
}void Timer0_Isr(void) interrupt 1
{TL0 = 0xF0; //設置定時初始值TH0 = 0xD8; //設置定時初始值
}
總代碼
#include <REGX52.H>
#include "intrins.h"/宏定義/
sbit WE_RED = P2^0;//WE相關的為東西向
sbit WE_GREEN = P2^1;
sbit WE_YELLOW = P2^2;
sbit NS_RED = P2^5;//NS相關的為南北向
sbit NS_GREEN = P2^6;
sbit NS_YELLOW = P2^7;/變量定義區/
unsigned char temp = 0;
unsigned char mode = 0;//手動/自動模式切換標志位
unsigned char flag = 0;//手動模式中兩個模式切換標志位
unsigned int time,sec;//函數聲明區//
void Timer0_Init(void);
void Delay20ms(void);
void key_read();void main()
{Timer0_Init();while(1){ key_read();if(mode == 1){if(flag == 0){WE_RED = 0;NS_RED = 0;WE_GREEN = 1;WE_YELLOW = 1;NS_GREEN = 1;NS_YELLOW = 1;}}if(mode == 2)mode = 0;if(flag == 2)flag = 0;}
}void Timer0_Init(void) //10毫秒@12.000MHz
{TMOD &= 0xF0; //設置定時器模式TMOD |= 0x01; //設置定時器模式TL0 = 0xF0; //設置定時初始值TH0 = 0xD8; //設置定時初始值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0 = 1; //使能定時器0中斷EA = 1;
}void Timer0_Isr(void) interrupt 1
{TL0 = 0xF0; //設置定時初始值TH0 = 0xD8; //設置定時初始值time++;if(time == 100){sec++;time = 0;}if(mode == 0){if(sec<=5&&sec>0){WE_RED = 0;NS_RED = 1;WE_GREEN = 1;WE_YELLOW = 1;NS_GREEN = 1;NS_YELLOW = 1;}if(sec <= 10 && sec >5){WE_RED = 1;NS_RED = 0; }if(sec <= 13 && sec > 10){NS_RED = 1;WE_YELLOW = 0; }if(sec <= 16 && sec > 13){WE_YELLOW = 1;NS_RED = 0;}if(sec <= 21 && sec > 16){NS_RED = 1;WE_RED = 0;}if(sec <= 26 && sec > 21){WE_RED = 1;NS_RED = 0;}if(sec <= 29 && sec > 26){NS_RED = 1;WE_RED = 0;}if(sec <= 32 && sec > 29){WE_RED = 1;NS_YELLOW = 0;}if(sec > 32){NS_YELLOW = 1;sec = 0;}}if(mode == 1&&flag == 1){if(sec<=2){NS_YELLOW = 0;WE_YELLOW = 0;NS_GREEN = 1;WE_GREEN = 1;WE_RED = 1;NS_RED = 1;}if(sec>2 && sec <= 4){NS_YELLOW = 1;WE_YELLOW = 1;}if(sec>4)sec = 0;}
}void key_read()
{if(P1_0 == 0){Delay20ms();if(P1_0 == 0){mode++;time = 0;sec = 0;}while(!P1_0);}if(P1_1 == 0){Delay20ms();if(P1_1 == 0){flag++;time = 0;sec = 0;}while(!P1_1);}
}void Delay20ms(void) //@11.0592MHz
{unsigned char data i, j;i = 216;j = 37;do{while (--j);} while (--i);
}
仿真,學弟畫的,好使
代碼目前在硬件上面沒有問題,由于社區上傳視頻較為麻煩,Proteus仿真已上傳(也可以私信獲取),大家可以將代碼燒入仿真里面進行相關實驗,也可以自己搭建硬件電路進行測試,后面會給大家更新相關的硬件電路以及其他小項目
ps:綁定資源好像只能綁定一個,另一個大家可以去主頁找一下