一、單片機(jī)設(shè)計(jì)交通燈的設(shè)計(jì)要求:
狀態(tài)一:南北綠燈亮,東西紅燈亮,南北人行道綠燈,東西人行道紅燈,南北左拐綠燈,東西左拐紅燈。(時(shí)間為15S)
狀態(tài)二:南北黃燈亮,東西紅燈亮,南北人行道綠燈,東西人行道紅燈,南北左拐綠燈,東西左拐紅燈。(時(shí)間為5S)
狀態(tài)三:南北紅燈亮,東西綠燈亮,南北人行道紅燈,東西人行道綠燈,南北左拐紅燈,東西左拐綠燈。(時(shí)間為15S)
狀態(tài)四:南北紅燈亮,東西黃燈亮,南北人行道紅燈,東西人行道綠燈,南北左拐紅燈,東西左拐綠燈。(時(shí)間為5S)
二、設(shè)計(jì)原理分析
1、首先了解實(shí)際交通燈的變化情況和規(guī)律。假設(shè)一個(gè)十字路口如上圖所以,為東南西北走向。初始狀態(tài)0:為東西綠燈亮,南北紅燈亮;然后轉(zhuǎn)狀態(tài)1:東西綠燈亮黃燈亮,南北紅燈亮黃燈亮;過后轉(zhuǎn)狀態(tài)2:東西紅燈亮,南北綠燈亮;再轉(zhuǎn)狀態(tài)3:東西紅燈亮黃燈亮,南北綠燈亮黃燈亮。一段時(shí)間后,又循環(huán)至狀態(tài)0。中間可通過中斷按鈕產(chǎn)生中斷,跳入中斷程序執(zhí)行中斷。
2、對于交通信號(hào)燈來說,應(yīng)該有東西南北共四組燈,但由于同一道上的兩組的信號(hào)燈的顯示情況是相同的,所以只要用兩組就行了,因此,采用單片機(jī)內(nèi)部的I/O口上的P1口中的6個(gè)引腳即可來控制6個(gè)信號(hào)燈。
3、通過編寫程序,實(shí)現(xiàn)對發(fā)光二極管的控制,來模擬交通信號(hào)燈的管理。每延時(shí)一段時(shí)間,燈的顯示情況都會(huì)按交通燈的顯示規(guī)律進(jìn)行狀態(tài)轉(zhuǎn)換。
4、通過延時(shí)時(shí)間送顯,可以在原有的交通信號(hào)燈系統(tǒng)的基礎(chǔ)上,增添其倒計(jì)時(shí)間的顯示功能,實(shí)現(xiàn)其功能的擴(kuò)展。
5.通過脈沖中斷編寫中斷程序,可實(shí)現(xiàn)中斷。
三、設(shè)計(jì)的仿真圖如下:
其接法為:P0接數(shù)碼管的端選段,
P1接數(shù)碼管的位選端,
P2接交通燈,接法如下:
P20,P21,P22,分別接南北向的紅黃綠燈,
P23接南北左拐綠燈,
P24,P25,P26,分別接?xùn)|西向的紅黃綠燈,
P27接?xùn)|西左拐紅燈
東西人行到紅綠燈和南北紅綠燈接到一起
南北人行到紅綠燈和東西紅綠燈接到一起
四、AT89C51的KILL程序
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar code wei[]={0x01,0x02,0x04,0x08}; //位碼選擇
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段碼選擇
uchar table[4]={0,0,0,0};//四位為選端賦值區(qū)間
uchar num=0;
uchar ID=1;
uchar sec=15;
uchar n=0;
void init(void)
{
P0=0xff;//端口初始化
P1=0x00;//端口初始化
P2=0x00;//端口初始化
TMOD=0x01;//使用定時(shí)器0的工作方式
EA=1;//開總中斷
ET0=1;//開定時(shí)器0的中斷
TH0=(65536-10000)/256;//定時(shí)10毫秒
TL0=(65536-10000)%256;
TR0=1;
}
void main(void)
{
init();
while(1)
{
switch(ID)//選擇函數(shù)
{
case 1:P2=0x14;break;//東西紅,南北綠,
case 2:P2=0x12;break;//東西紅,南北黃,
case 3:P2=0x41;break;//東西綠,南北紅,
case 4:P2=0x21;break;//東西黃,南北紅,
default:break;
}
}
}
void timer0() interrupt 1//對應(yīng)中斷定時(shí)器0
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P1=wei[num];//位選端送值
P0=duan[table[num]];//端選端送值
num++;
if(num==4)
num=0;
table[0]=(sec-1)/10;
table[1]=(sec-1)%10;
table[2]=(sec-1)/10;
table[3]=(sec-1)%10;
n++;
if(n==100)//10毫秒執(zhí)行一百次為一秒
{
n=0;
sec--;
if(sec==0)
{
ID++;
if(ID==5)//
ID=1;
switch(ID)
{
case 1:sec=15;break; //
case 2:sec=3;break;//
case 3:sec=15;break;//
case 4:sec=3;break;//
default:break;/*default就是默認(rèn)情況,這個(gè)是用在switch中,意思是若case都不滿足,則執(zhí)行default后面的語句 */
}
}
}
評論
查看更多