仿真:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
編號J001
基本功能:
1、交通信號燈分布于東南西北,每個路口均有三個。
2、南北方向綠燈和東西方向的綠燈不能同時亮;如果同時亮,則應(yīng)自動立即關(guān)閉信號燈系統(tǒng),并立即發(fā)出報警信號。
3、系統(tǒng)工作后,首先南北紅燈亮并維持30s;與此同時,東西綠燈亮,并維持25s時間,到25s時,東西綠燈熄滅。在東西綠燈熄滅時,東西黃燈亮并維持5s,然后東西黃燈熄滅,東西紅燈亮,同時南北紅燈熄滅,南北綠燈亮;東西紅燈亮并維持30s;與此同時,南北綠燈亮并維持15s;然后,南北綠燈熄滅南北綠燈熄滅時,南北黃燈亮維持5s后熄滅;同時南北紅燈亮,東西綠燈亮。至此,結(jié)束一個工作循環(huán),如下交通信號燈變化表。
4、在交通信號燈亮和閃爍的同時,路口設(shè)有兩位七段碼的顯示器倒數(shù)計時,讓車輛行人能夠清楚地知道再過多久信號燈就會發(fā)生變化。以便于司機(jī)和行人能夠在有限的時間內(nèi)準(zhǔn)確的通行。
仿真圖
原理圖
PCB圖
程序
代碼
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //宏定義"uchar"代替"unsigned char"。
#define uint unsigned int //宏定義"uint"用來定義無符號整型數(shù)。
//數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
// A B C D E F 不顯示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //斷碼
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar smg_i = 4; //顯示數(shù)碼管的個位數(shù)
//數(shù)碼管位選定義
sbit smg_we1 = P2^0; //數(shù)碼管位選定義
sbit smg_we2 = P2^1;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
char dx_s = 0; //東西 南北 倒計時變量
sbit dx_red = P2^4; //東西紅燈
sbit dx_green = P2^3; //東西綠燈
sbit dx_yellow = P2^2; //東西黃燈
sbit nb_red = P2^7; //南北紅燈
sbit nb_green = P2^6; //南北綠燈
sbit nb_yellow = P2^5; //南北黃燈
uchar flag_jtd_mode; //交通燈的模式 根據(jù)時間
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb; //東西南北模式
uchar flag_5m_value;
uchar i;
uchar flag_alarm; //模式
uchar dx_time = 30,nb_time = 20; //東西、南北綠燈的時間
uchar flag_jdgz ; //交通管制
/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
uchar i;
for(i=0;i<smg_i;i++)
{
P0 = 0xff; //消隱
smg_we_switch(i); //位選
P0 = dis_smg[i]; //段選
delay_1ms(3);
}
}
/*********************定時器0、定時器1初始化******************/
void time0_init()
{
EA = 1; //開總中斷
TMOD = 0X11; //定時器0、定時器1工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
// ET1 = 1; //開定時器1中斷
// TR1 = 1; //允許定時器1定時
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1)
{
flag_1s = 0;
if(dx_s == 0)
{
if(flag_dx_nb == 1)
dx_s = nb_time; //南北時間
else
dx_s = dx_time; //東西時間
flag_dx_nb = ~flag_dx_nb;
}
dx_s --;
}
dis_smg[0] = smg_du[dx_s % 10] ;
dis_smg[1] = smg_du[dx_s / 10] ;
dis_smg[2] = smg_du[dx_s % 10] ;
dis_smg[3] = smg_du[dx_s / 10] ;
/***********************南北時間*********************************/
if(flag_dx_nb == 0)
{
if(dx_s > 5)
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow = 1; //滅
flag_5m_value = 0;
}else if(dx_s <= 5) //當(dāng)小于5秒時 黃燈要閃了
{
dx_red = 1; //滅
dx_green = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow = 1; //滅
if(flag_500ms == 0)
{
dx_yellow = 0;//亮
}
else
{
dx_yellow = 1;//滅
}
}
}
/***********************東西時間*********************************/
if(flag_dx_nb == 1)
{
if(dx_s > 5)
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow = 1; //滅
flag_5m_value = 0;
}else if(dx_s <= 5) //當(dāng)小于5秒時 黃燈要閃了
{
dx_red = 0; //滅
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_green = 1; //滅
if(flag_500ms == 0) //黃燈閃爍
{
nb_yellow = 0; //亮
}
else
{
nb_yellow = 1; //滅
}
}
}
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
static uchar key_new;
key_can = 20; //按鍵值還原
P1 |= 0x1f;
if((P1 & 0x1f) != 0x1f) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
{ //確認(rèn)是按鍵按下
key_new = 0;
switch(P1 & 0x1f)
{
case 0x1e: key_can = 1; break; //得到按鍵值
case 0x1d: key_can = 2; break; //得到按鍵值
case 0x1b: key_can = 3; break; //得到按鍵值
case 0x17: key_can = 4; break; //得到按鍵值
}
}
}
else
key_new = 1;
}
uchar menu_1,flag_s;
/********************設(shè)置函數(shù)*****************/
void key_with()
{
if(key_can == 4) //交通管制按鍵
{
flag_jdgz ++;
if(flag_jdgz > 5)
flag_jdgz = 0;
if(flag_jdgz == 1) // 全部亮紅燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow = 1; //滅
}
if(flag_jdgz == 2) // 東西紅燈 南北綠燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow = 1; //滅
}
if(flag_jdgz == 3) // 南北紅燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow = 1; //滅
}
if(flag_jdgz == 4) // 南北綠燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow = 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow = 1; //滅
}
if(flag_jdgz == 5) // 南北黃燈 東西黃燈
{
dx_red = 1; //滅
dx_green = 1; //滅
dx_yellow = 0; //亮
nb_red = 1; //滅
nb_green = 1; //滅
nb_yellow = 0; //亮
}
}
if(key_can == 1) //設(shè)置鍵
{
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
}
}
if(menu_1 == 1) //設(shè)置東西的時間
{
if(key_can == 2)
{
dx_time ++ ; //加1
if(dx_time > 99)
dx_time = 99;
}
if(key_can == 3)
{
dx_time -- ; //減1
if(dx_time <= 10)
dx_time = 10;
}
dis_smg[0] = smg_du[10] ; //顯示為A
dis_smg[1] = smg_du[10] ; //顯示為A
dis_smg[2] = smg_du[dx_time % 10] ; //顯示東西設(shè)置的時候
dis_smg[3] = smg_du[dx_time / 10] ;
}
if(menu_1 == 2) //設(shè)置南北的時間
{
if(key_can == 2)
{
nb_time ++ ; //加1
if(nb_time > 99)
nb_time = 99;
}
if(key_can == 3)
{
nb_time -- ; //減1
if(nb_time <= 10)
nb_time = 10;
}
dis_smg[0] = smg_du[11] ; //顯示為B
dis_smg[1] = smg_du[11] ; //顯示為B
dis_smg[2] = smg_du[nb_time % 10] ; //顯示東西設(shè)置的時候
dis_smg[3] = smg_du[nb_time / 10] ;
}
}
/********************************************************************
* 名稱 : main()
* 功能 : 實現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
time0_init();
dx_s = nb_time; //東西時間
while(1)
{
key();
if(key_can < 20)
key_with();
// menu_dis();
if((menu_1 == 0) && (flag_jdgz == 0))
jiaotongdeng_dis();
display();
}
}
器件清單
資料清單
資料下載