一、單片機(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:東西綠燈亮黃燈亮,南北紅燈亮黃燈亮;過(guò)后轉(zhuǎn)狀態(tài)2:東西紅燈亮,南北綠燈亮;再轉(zhuǎn)狀態(tài)3:東西紅燈亮黃燈亮,南北綠燈亮黃燈亮。一段時(shí)間后,又循環(huán)至狀態(tài)0。中間可通過(guò)中斷按鈕產(chǎn)生中斷,跳入中斷程序執(zhí)行中斷。
2、對(duì)于交通信號(hào)燈來(lái)說(shuō),應(yīng)該有東西南北共四組燈,但由于同一道上的兩組的信號(hào)燈的顯示情況是相同的,所以只要用兩組就行了,因此,采用單片機(jī)內(nèi)部的I/O口上的P1口中的6個(gè)引腳即可來(lái)控制6個(gè)信號(hào)燈。
3、通過(guò)編寫(xiě)程序,實(shí)現(xiàn)對(duì)發(fā)光二極管的控制,來(lái)模擬交通信號(hào)燈的管理。每延時(shí)一段時(shí)間,燈的顯示情況都會(huì)按交通燈的顯示規(guī)律進(jìn)行狀態(tài)轉(zhuǎn)換。
4、通過(guò)延時(shí)時(shí)間送顯,可以在原有的交通信號(hào)燈系統(tǒng)的基礎(chǔ)上,增添其倒計(jì)時(shí)間的顯示功能,實(shí)現(xiàn)其功能的擴(kuò)展。
5.通過(guò)脈沖中斷編寫(xiě)中斷程序,可實(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;//開(kāi)總中斷
ET0=1;//開(kāi)定時(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//對(duì)應(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)
{
評(píng)論
查看更多