控制/MCU
一、单片机设计交通灯的设计要求:
状态一:南北绿灯亮,东西红灯亮,南北人行道绿灯,东西人行道红灯,南北左拐绿灯,东西左拐红灯。(时间为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)
{
case 2:sec=3;break;//
case 3:sec=15;break;//
case 4:sec=3;break;//
default:break;/*default就是默认情况,这个是用在switch中,意思是若case都不满足,则执行default后面的语句 */
}
}
}
全部0条评论
快来发表一下你的评论吧 !