仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設計編號:【M03】
1.? 簡介
? 本文提出了一種基于51單片機的智能交通燈設計。該設計在硬件方面主要采用AT89C51單片機作為主控核心,結合獨立按鍵、數(shù)碼管、LED燈,實現(xiàn)不同的紅綠燈切換時間,并且具有倒計時的功能。
2.? 主要功能
a.當主干道通行亮綠燈時,支干道亮紅燈,而支干道亮綠燈時,主干道亮紅燈。
b.主支干道交替通行,主干道每次放行60s、支干道30s,設計60s和30s計時顯示電路。
c.在過程中間,要亮5s的黃燈作為過渡,設置5s計時顯示電路。
d.有緊急車輛要求通過時,系統(tǒng)要能禁止東西或南北兩條路上所有的車輛通行。
3.? 源程序(Keil5)
本設計采用keil5 C51軟件(內附安裝包)實現(xiàn)程序設計。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*****定義控制位**********************/
sbit EW_LED2=P2^3; //EW_LED2控制位
sbit EW_LED1=P2^2; //EW_LED1控制位
sbit SN_LED2=P2^1; //SN_LED2控制位
sbit SN_LED1=P2^0; //SN_LED1控制位
sbit SNstraight_Green=P1^3; //南北直行綠燈
sbit EWstraight_Green=P1^0; //東西直行綠燈
sbit SNstraight_Yellow=P1^4; //南北直行黃燈
sbit EWstraight_Yellow=P1^1; //東西直行黃燈
sbit SNstraight_Red=P1^5; //南北直行紅燈
sbit EWstraight_Red=P1^2; //東西直行紅燈
sbit SNright_Green=P2^7; //南北右拐綠燈
sbit EWright_Green=P1^6; //東西右拐綠燈
sbit SNright_Red=P3^4; //南北右拐紅燈
sbit EWright_Red=P2^4; //東西右拐紅燈
sbit SNleft_Green=P3^5; //南北左拐綠燈
sbit EWleft_Green=P2^5; //東西左拐綠燈
sbit SNleft_Red=P3^7; //南北左拐紅燈
sbit EWleft_Red=P2^6; //東西左拐紅燈
sbit SNturn_Yellow=P3^6; //南北轉向黃燈
sbit EWturn_Yellow=P1^7; //東西轉向黃燈
sbit Time_Button=P3^0; //時間加減按鈕判斷輸入端
sbit QZ_Button=P3^1; //強制通行方向判斷輸入端
bit Flag_SNstraight_Yellow; //SN直行黃燈標志位
bit Flag_EWstraight_Yellow; //EW直行黃燈標志位
bit Flag_SNturn_Yellow; //SN轉向黃燈標志位
bit Flag_EWturn_Yellow; //EW轉向黃燈標志位
bit QZ_EW; //EW強制通行標志
bit QZ_SN; //SN強制通行標志
bit QZ_flag; //數(shù)碼管強制標志
char Time_EW; //東西方向倒計時單元
char Time_SN; //南北方向倒計時單元
uchar EW=30,SN=30,EWL=60,SNL=60; //倒計時時長
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0~~~~9段選碼
/*********************延時函數(shù)**********************/
void Delay(uchar a)
{
while(a--);
}
/*******************顯示函數(shù),顯示倒計時的值**********************/
void Display(void)
{
char h,l;
h=Time_EW/10; //EW方向計時的十位數(shù)
l=Time_EW%10; //EW方向計時的個位數(shù)
P0=table[l]; //顯示EW計時時間的低位
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h]; //顯示EW計時時間的高位
EW_LED1=1;
Delay(2);
EW_LED1=0;
h=Time_SN/10; //SN方向計時的十位數(shù)
l=Time_SN%10; //SN方向計時的個位數(shù)
P0=table[l]; //顯示SN計時時間的低位
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h]; //顯示SN計時時間的高位
SN_LED1=1;
Delay(2);
SN_LED1=0;
}
/*******************顯示函數(shù),強制通行的值**********************/
void Display1(void)
{
P0=table[8];
if(QZ_flag==1)
{
EW_LED2=1;
EW_LED1=1;
SN_LED2=1;
SN_LED1=1;
}
else
{
EW_LED2=0;
EW_LED1=0;
SN_LED2=0;
SN_LED1=0;
}
}
/************************信號燈控制函數(shù)******************/
void SN_GOstraight() //SN直行綠燈
{
SNstraight_Green=1;
SNstraight_Yellow=0;
SNstraight_Red=0;
}
void SN_STOPstraight() //SN直行紅燈
{
SNstraight_Green=0;
SNstraight_Yellow=0;
SNstraight_Red=1;
}
void EW_GOstraight() //EW直行綠燈
{
EWstraight_Green=1;
EWstraight_Yellow=0;
EWstraight_Red=0;
}
void EW_STOPstraight() //EW直行紅燈
{
EWstraight_Green=0;
EWstraight_Yellow=0;
EWstraight_Red=1;
}
void SN_GOturnright() //SN右轉綠燈
{
SNright_Green=1;
SNturn_Yellow=0;
SNright_Red=0;
}
void SN_STOPturnright() //SN右轉紅燈
{
SNright_Green=0;
SNturn_Yellow=0;
SNright_Red=1;
}
void SN_GOturnleft() //SN左轉綠燈
{
SNleft_Green=1;
SNturn_Yellow=0;
SNleft_Red=0;
}
void SN_STOPturnleft() //SN左轉紅燈
{
SNleft_Green=0;
SNturn_Yellow=0;
SNleft_Red=1;
}
void EW_GOturnright() //EW右轉綠燈
{
EWright_Green=1;
EWturn_Yellow=0;
EWright_Red=0;
}
void EW_STOPturnright() //EW右轉紅燈
{
EWright_Green=0;
EWturn_Yellow=0;
EWright_Red=1;
}
void EW_GOturnleft() //EW左轉綠燈
{
EWleft_Green=1;
EWturn_Yellow=0;
EWleft_Red=0;
}
void EW_STOPturnleft() //EW左轉紅燈
{
EWleft_Green=0;
EWturn_Yellow=0;
EWleft_Red=1;
}
4.? 仿真proteus8.6
? 本設計采用proteus8.6軟件(內附安裝包)實現(xiàn)仿真設計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
初始界面:
東西通行:
南北通行:
5.? 設計報告
設計報告主要包括硬件電路、軟件設計、仿真調試等等,僅供參考。
6.? 資料清單
設計資料主要包括C程序+仿真+設計報告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【M03】百度網(wǎng)盤下載鏈接
更多單片機仿真設計合集:單片機仿真設計合集