|
這是之前做的一個交通燈的仿真和原理圖,很實用,可以用來參考和課程設(shè)計,分享給大家。
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
void Time_Initialize(void);
void SEG_Display_4(u8 *BUFF);
//管腳定義
#define SEG_PORT_D P0//數(shù)碼管端口定義
sbit SEG_PORT_W1 = P2^0;
sbit SEG_PORT_W2 = P2^1;
sbit SEG_PORT_W3 = P2^2;
sbit SEG_PORT_W4 = P2^3;
//變量定義
code u8 SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//數(shù)碼管顯示的編碼0--9
u8 SEG_SWITCH_NUM = 0;//數(shù)碼管切換變量
u8 SEG_SWITCH_TEMP = 0x01;//用作移位的變量
sbit LED_RED_EW = P3^0;//東西走向燈控制
sbit LED_YELLOW_EW = P3^1;
sbit LED_GREEN_EW = P3^2;
sbit LED_RED_SN = P3^3;//南北走向燈控制
sbit LED_YELLOW_SN = P3^4;
sbit LED_GREEN_SN = P3^5;
sbit KEY_MODE = P1^0;//正常或者緊急模式切換按鍵
u8 RunModeNom = 0;//正常運行步驟
u8 RunTime = 25;//時間
u8 RunTime_SN = 25;//時間
u8 RunTime_EW = 25;//時間
u8 SysMode = 0;//0表示正常運行模式 1表示非正常運行
void main(void)//主程序
{
u8 DisplayBuff[4] = {10,10,10,10};
Time_Initialize();//定時器初始化
while(1)
{
if(!KEY_MODE)//模式按鍵按下
{
SysMode = ~SysMode;
while(!KEY_MODE);
}
if(SysMode == 0)
{
TR0 = 1;//打開定時器
DisplayBuff[0] = RunTime_EW / 10;//顯示時間倒計時
DisplayBuff[1] = RunTime_EW % 10;
DisplayBuff[2] = RunTime_SN / 10;
DisplayBuff[3] = RunTime_SN % 10;
}
else
{
TR0 = 0;//關(guān)閉定時器
DisplayBuff[0] = 10;//不顯示
DisplayBuff[1] = 10;
DisplayBuff[2] = 10;
DisplayBuff[3] = 10;
LED_RED_SN = 1;
LED_YELLOW_SN = 0;//東西亮黃燈
LED_GREEN_SN = 0;
LED_RED_EW = 1;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 0;//東西亮綠燈
}
SEG_Display_4(DisplayBuff);
}
}
void Time_Initialize(void)//定時50ms
{
TMOD = 0x01;
TL0 = 0xb0 ;
TH0 = 0x3c ;
TR0 = 1;
ET0 = 1;
EA = 1;
}
u16 TIM_Count = 0;
void Tm0_Isr() interrupt 1//定時器中斷
{
TL0 = 0xb0 ;
TH0 = 0x3c ;
TIM_Count ++;
if(TIM_Count >= 20)//表示1s
{
TIM_Count = 0;
if(RunTime == 0)
{
RunModeNom ++;
if(RunModeNom >= 2) RunModeNom = 0;//循環(huán)
if(RunModeNom == 0)
{
RunTime = 25;
}
else if(RunModeNom == 1)
{
RunTime = 30;
}
}
else
{
RunTime --;
}
if(RunModeNom == 0)
{
LED_RED_SN = 1;
LED_YELLOW_SN = 0;
LED_GREEN_SN = 0;//都是紅燈
RunTime_SN = RunTime;
if(RunTime > 5)
{
LED_RED_EW = 0;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 1;//東西亮綠燈
RunTime_EW = RunTime - 2;
}
else if((RunTime <= 5)&&(RunTime > 2))
{
LED_RED_EW = 0;
LED_YELLOW_EW = 0;
LED_GREEN_EW = !LED_GREEN_EW;//東西綠燈閃爍
RunTime_EW = RunTime - 2;
}
else if(RunTime <= 2)
{
RunTime_EW = RunTime;
LED_RED_EW = 0;
LED_YELLOW_EW = 1;//東西亮黃燈
LED_GREEN_EW = 0;
}
}
else if(RunModeNom == 1)
{
LED_RED_EW = 1;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 0;//都是紅燈
RunTime_EW = RunTime;
if(RunTime > 5)
{
LED_RED_SN = 0;
LED_YELLOW_SN = 0;
LED_GREEN_SN = 1;//東西亮綠燈
RunTime_SN = RunTime - 2;
}
else if((RunTime <= 5)&&(RunTime > 2))
{
LED_RED_SN = 0;
LED_YELLOW_SN = 0;
LED_GREEN_SN = !LED_GREEN_SN;//東西綠燈閃爍
RunTime_SN = RunTime - 2;
}
else if(RunTime <= 2)
{
LED_RED_SN = 0;
LED_YELLOW_SN = 1;//東西亮黃燈#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
void Time_Initialize(void);
void SEG_Display_4(u8 *BUFF);
//管腳定義
#define SEG_PORT_D P0//數(shù)碼管端口定義
sbit SEG_PORT_W1 = P2^0;
sbit SEG_PORT_W2 = P2^1;
sbit SEG_PORT_W3 = P2^2;
sbit SEG_PORT_W4 = P2^3;
//變量定義
code u8 SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//數(shù)碼管顯示的編碼0--9
u8 SEG_SWITCH_NUM = 0;//數(shù)碼管切換變量
u8 SEG_SWITCH_TEMP = 0x01;//用作移位的變量
sbit LED_RED_EW = P3^0;//東西走向燈控制
sbit LED_YELLOW_EW = P3^1;
sbit LED_GREEN_EW = P3^2;
sbit LED_RED_SN = P3^3;//南北走向燈控制
sbit LED_YELLOW_SN = P3^4;
sbit LED_GREEN_SN = P3^5;
sbit KEY_MODE = P1^0;//正常或者緊急模式切換按鍵
u8 RunModeNom = 0;//正常運行步驟
u8 RunTime = 25;//時間
u8 RunTime_SN = 25;//時間
u8 RunTime_EW = 25;//時間
u8 SysMode = 0;//0表示正常運行模式 1表示非正常運行
void main(void)//主程序
{
u8 DisplayBuff[4] = {10,10,10,10};
Time_Initialize();//定時器初始化
while(1)
{
if(!KEY_MODE)//模式按鍵按下
{
SysMode = ~SysMode;
while(!KEY_MODE);
}
if(SysMode == 0)
{
TR0 = 1;//打開定時器
DisplayBuff[0] = RunTime_EW / 10;//顯示時間倒計時
DisplayBuff[1] = RunTime_EW % 10;
DisplayBuff[2] = RunTime_SN / 10;
DisplayBuff[3] = RunTime_SN % 10;
}
else
{
TR0 = 0;//關(guān)閉定時器
DisplayBuff[0] = 10;//不顯示
DisplayBuff[1] = 10;
DisplayBuff[2] = 10;
DisplayBuff[3] = 10;
LED_RED_SN = 1;
LED_YELLOW_SN = 0;//東西亮黃燈
LED_GREEN_SN = 0;
LED_RED_EW = 1;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 0;//東西亮綠燈
}
SEG_Display_4(DisplayBuff);
}
}
void Time_Initialize(void)//定時50ms
{
TMOD = 0x01;
TL0 = 0xb0 ;
TH0 = 0x3c ;
TR0 = 1;
ET0 = 1;
EA = 1;
}
u16 TIM_Count = 0;
void Tm0_Isr() interrupt 1//定時器中斷
{
TL0 = 0xb0 ;
TH0 = 0x3c ;
TIM_Count ++;
if(TIM_Count >= 20)//表示1s
{
TIM_Count = 0;
if(RunTime == 0)
{
RunModeNom ++;
if(RunModeNom >= 2) RunModeNom = 0;//循環(huán)
if(RunModeNom == 0)
{
RunTime = 25;
}
else if(RunModeNom == 1)
{
RunTime = 30;
}
}
else
{
RunTime --;
}
if(RunModeNom == 0)
{
LED_RED_SN = 1;
LED_YELLOW_SN = 0;
LED_GREEN_SN = 0;//都是紅燈
RunTime_SN = RunTime;
if(RunTime > 5)
{
LED_RED_EW = 0;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 1;//東西亮綠燈
RunTime_EW = RunTime - 2;
}
else if((RunTime <= 5)&&(RunTime > 2))
{
LED_RED_EW = 0;
LED_YELLOW_EW = 0;
LED_GREEN_EW = !LED_GREEN_EW;//東西綠燈閃爍
RunTime_EW = RunTime - 2;
}
else if(RunTime <= 2)
{
RunTime_EW = RunTime;
LED_RED_EW = 0;
LED_YELLOW_EW = 1;//東西亮黃燈
LED_GREEN_EW = 0;
}
}
else if(RunModeNom == 1)
{
LED_RED_EW = 1;
LED_YELLOW_EW = 0;
LED_GREEN_EW = 0;//都是紅燈
RunTime_EW = RunTime;
if(RunTime > 5)
{
LED_RED_SN = 0;
LED_YELLOW_SN = 0;
LED_GREEN_SN = 1;//東西亮綠燈
RunTime_SN = RunTime - 2;
}
else if((RunTime <= 5)&&(RunTime > 2))
{
LED_RED_SN = 0;
LED_YELLOW_SN = 0;
LED_GREEN_SN = !LED_GREEN_SN;//東西綠燈閃爍
RunTime_SN = RunTime - 2;
}
else if(RunTime <= 2)
{
LED_RED_SN = 0;
LED_YELLOW_SN = 1;//東西亮黃燈
LED_GREEN_SN = 0;
RunTime_SN = RunTime;
}
}
}
}
void SEG_Display_4(u8 *BUFF)//一共顯示4位
{
SEG_PORT_D = SEG_CODE[10];//段選都不亮
if(SEG_SWITCH_NUM == 0)
{
SEG_PORT_W1 = 1;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 1)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 1;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 2)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 1;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 3)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 1;
}
SEG_PORT_D = SEG_CODE[*(BUFF + SEG_SWITCH_NUM)];
SEG_SWITCH_NUM ++;
if(SEG_SWITCH_NUM >= 4)
{
SEG_SWITCH_NUM = 0;
}
}
LED_GREEN_SN = 0;
RunTime_SN = RunTime;
}
}
}
}
void SEG_Display_4(u8 *BUFF)//一共顯示4位
{
SEG_PORT_D = SEG_CODE[10];//段選都不亮
if(SEG_SWITCH_NUM == 0)
{
SEG_PORT_W1 = 1;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 1)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 1;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 2)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 1;
SEG_PORT_W4 = 0;
}
else if(SEG_SWITCH_NUM == 3)
{
SEG_PORT_W1 = 0;
SEG_PORT_W2 = 0;
SEG_PORT_W3 = 0;
SEG_PORT_W4 = 1;
}
SEG_PORT_D = SEG_CODE[*(BUFF + SEG_SWITCH_NUM)];
SEG_SWITCH_NUM ++;
if(SEG_SWITCH_NUM >= 4)
{
SEG_SWITCH_NUM = 0;
}
}
交通燈2.zip
(56.46 KB, 下載次數(shù): 12)
2017-6-26 10:08 上傳
點擊文件名下載附件
壓縮 下載積分: 黑幣 -5
|
|