一、單片機設計交通燈的設計要求:
狀態一:南北綠燈亮,東西紅燈亮,南北人行道綠燈,東西人行道紅燈,南北左拐綠燈,東西左拐紅燈。(時間為15S)
狀態二:南北黃燈亮,東西紅燈亮,南北人行道綠燈,東西人行道紅燈,南北左拐綠燈,東西左拐紅燈。(時間為5S)
狀態三:南北紅燈亮,東西綠燈亮,南北人行道紅燈,東西人行道綠燈,南北左拐紅燈,東西左拐綠燈。(時間為15S)
狀態四:南北紅燈亮,東西黃燈亮,南北人行道紅燈,東西人行道綠燈,南北左拐紅燈,東西左拐綠燈。(時間為5S)
二、設計原理分析
1、首先了解實際交通燈的變化情況和規律。假設一個十字路口如上圖所以,為東南西北走向。初始狀態0:為東西綠燈亮,南北紅燈亮;然后轉狀態1:東西綠燈亮黃燈亮,南北紅燈亮黃燈亮;過后轉狀態2:東西紅燈亮,南北綠燈亮;再轉狀態3:東西紅燈亮黃燈亮,南北綠燈亮黃燈亮。一段時間后,又循環至狀態0。中間可通過中斷按鈕產生中斷,跳入中斷程序執行中斷。
2、對于交通信號燈來說,應該有東西南北共四組燈,但由于同一道上的兩組的信號燈的顯示情況是相同的,所以只要用兩組就行了,因此,采用單片機內部的I/O口上的P1口中的6個引腳即可來控制6個信號燈。
3、通過編寫程序,實現對發光二極管的控制,來模擬交通信號燈的管理。每延時一段時間,燈的顯示情況都會按交通燈的顯示規律進行狀態轉換。
4、通過延時時間送顯,可以在原有的交通信號燈系統的基礎上,增添其倒計時間的顯示功能,實現其功能的擴展。
5.通過脈沖中斷編寫中斷程序,可實現中斷。
三、設計的仿真圖如下:
其接法為:P0接數碼管的端選段,
P1接數碼管的位選端,
P2接交通燈,接法如下:
P20,P21,P22,分別接南北向的紅黃綠燈,
P23接南北左拐綠燈,
P24,P25,P26,分別接東西向的紅黃綠燈,
P27接東西左拐紅燈
東西人行到紅綠燈和南北紅綠燈接到一起
南北人行到紅綠燈和東西紅綠燈接到一起
四、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};//四位為選端賦值區間
uchar num=0;
uchar ID=1;
uchar sec=15;
uchar n=0;
void init(void)
{
P0=0xff;//端口初始化
P1=0x00;//端口初始化
P2=0x00;//端口初始化
TMOD=0x01;//使用定時器0的工作方式
EA=1;//開總中斷
ET0=1;//開定時器0的中斷
TH0=(65536-10000)/256;//定時10毫秒
TL0=(65536-10000)%256;
TR0=1;
}
void main(void)
{
init();
while(1)
{
switch(ID)//選擇函數
{
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//對應中斷定時器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毫秒執行一百次為一秒
{
n=0;
sec--;
if(sec==0)
{
ID++;
if(ID==5)//
ID=1;
switch(ID)
{
評論
查看更多