单片机控制的交通灯
的有关信息介绍如下:题目 交通灯控制系统的设计 一、课程设计的目的与要求 1、课程设计目的: (1)进一步理解和消化书本知识,运用所学知识和技能进行简单的设计。 (2)通过课程设计提高应用能力,分析问题和解决问题的能力。 (3)培养查阅资料的习惯,训练和提高自学,独立思考的能力。 2、课程设计要求 交通灯控制系统的设计 1) 掌握在单片机系统中扩展简单I/O接口的方法。 2) 掌握数据输出程序的设计方法。 3) 掌握模拟交通灯控制的实现方法。 4) 掌握外部中断技术的基本使用方法。 5) 掌握中断处理程序的编程方法。 从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: (1)能够正确理解课程设计的题目和意义,全面思考问题。 (2)运用科学合理的方法,认真按时完成。 二、课程设计课题的分析 1、电路的设计 1)原理 要完成本实验,首先必须了解交通灯的亮灭规律。本实验需要用到试验箱上八个发光二极管中的六个,即红、绿、黄各两个。将L1(红)、L2(绿)、L3(黄)作为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)作为南北方向的指示灯。交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。 各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮使相应使相应输入端为低电平。 当有急救车到达时,两个方向上的红灯亮,以便让急救车通过,假设急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。本程序以单次脉冲为中断申请,表示有急救车通过,单次脉冲输出端P-接CPU板上的INT0。 2)、硬件电路图 图1—1 交通灯控制系统的硬件接线图 74LS273的输出00—07接发光二极管L1—L8,74LS273的片选CS273接片选信号CS2,此时74LS273的片选地址为CFA0—CFA7之间任选。 3)、程序流程图 主程序流程 图1—2 主程序软件流程图 中断程序流程图 三、课程设计的结果 1、程序 NAME JIAOTONGGENG OUTPORT EQU 0CFB0H ;端口地址 SAVE EQU 55H ;SAVE保存从端口CFA0输出的数据 CSEG AT 0000H LJMP START CSEG AT 4003H LJMP INT CSEG AT 4100H START: SETB IT0 ;中断程序初始化 SETB EX0 SETB EA MOV A,#11H ;置首显示码,两红灯全亮 MOV SAVE,A ;保存 ACALL DISP ;显示输出 ACALL DE3S ;延时3秒 LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#10H ;东西路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2,#05H ;东西路口黄灯闪烁5次 TTT: MOV A,#14H MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#10H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,TTT MOV A,#11H ;红灯全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#01H ;南北路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2
#include
#include
#define uint unsigned int
#define uchar unsigned char
//定义按键位置
//东西通行
sbit key0=P3^0;
// 南北通行
sbit key1=P3^1;
//时间设置确定;
sbit key2=P3^2;
//加
sbit key3=P3^3;
//减
sbit key4=P3^4;
//紧急报警
sbit key5=P3^5;
sbit set0=P3^6;
sbit set1=P3^7;
//a=65时,刚好为1s
uint tt;
uchar i=0,j;
//时间倒计时变量
uchar temp=0;
//通行时间变量;初始值25秒;
uchar tx_time=15;
//显示的变量;
uchar tab={0,1};
//是否为设置通行时间变量;set=1,设置通行时间;set=0;正常通行;
uchar set;
uchar bojing;
//定义共阳极数码管码值
uchar Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xff};
//延时函数ms
void DelayMs(uchar i)
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<120;j++);
}
}
//定时器0初始化配置
void Timer0_Init(void)
{
TMOD=0x01;// 2:定时器1《》1:定时器0;
//----------
//-------定时器0 方式1
ET0=1;
TH0=(65536-64000)/256; //定时器的初值到最大ms
TL0=(65536-64000)%256;
TR0=1; //停止定时器0
PX1=1;
EA=1; //zong
}
//显示函数
void dis(void)
{
//没有按下设置通行时间按键时;正常显示倒计时变量temp
if(set==0) {tab=temp%100/10;tab=temp%10;}
//set=1时;闪烁显示通行时间值
else
{
if(tt>32){tab=tx_time%100/10;tab=tx_time%10;} //通行时间值送显示
else {tab=10;tab=10;}//关显示
}
for(i=0;i<2;i++) //要显示的位数
{
set1=1;
P1=Table[tab]; //改变tab[]的值将得到您要显示的字符
DelayMs(5); //延时
set1=0;
set0=1;
P1=Table[tab]; //改变tab[]的值将得到您要显示的字符
DelayMs(5); //延时
set0=0;
}
}
//延时函数
void delay(uint t)
{
while(--t);
}
//按键程序
void keyscan(void)
{
//关数码管显示
//判断key0是否按下---东西通行,南北禁止;
while(key0==0)
{P2=0XF3;TR0=0;}//点亮红绿灯
//判断key1是否按下----南北通行,东西禁止;
while(key1==0)
{P2=0XDE;TR0=0;}//点亮红绿灯
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------
//判断key2是否按下 //时间设置/确定键
//按下第一次时间设置,第二次时间设定退出
if (key2==0)
{set++;if(set>1)set=0;}
while(key2==0);//等待释放
//判断key3是否按下
if(key3==0)
{if(set==1) //设置按键被按下才时间加加; {tx_time++; if(tx_time>99)tx_time=99; }
}
while(key3==0);//等待释放
//判断key4是否按下
if(key4==0)
{
if(set==1)if(tx_time>6)tx_time--; //6---99s设置值;
}
while(key4==0);//等待释放
//-----------------------------------------------------
//---------------紧急处理----------------------------
//-----------------------------------------------------
//判断key5是否按下 紧急车通行全部红灯,
while(key5==0)
{TR0=0; P2=0Xf6; //全部红灯 }
TR0=1;
}
/******************main()***********************************/
void main(void)
{
Timer0_Init(); //初始化定时器0
P0=0X00;
P1=0X00;
P2=0X00;
key0=1;
key1=1;
key2=1;
key3=1;
key4=1;
key5=1;
while(1)
{
//东西通行,南北禁止
temp=tx_time+1;
while(1)
{
P2=0XF3; //红绿灯点亮
dis(); //显示
keyscan(); //按键扫描
if(tt>65)
{
tt=0; //定时完成一次后清0
temp--; //变量自减
if(temp>200) //减到小于0 跳出循环
{
tt=65; //赋初值
break;
}
}
}
//东西方向绿灯闪2s
temp=6;//变量赋初值
while(1)
{
dis(); //数码管显示
keyscan(); //按键扫描
if(tt>32)P2=0Xf7; //闪烁 tt=32的时候是半秒钟;
else P2=0Xf3;
if(tt>65)
{
tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp==2) //减到小于0 跳出循环
{
tt=65; //赋初值
break;
}
}
}
//东西方向黄灯亮3s
temp=3;
while(1)
{
P2=0Xf5; //红绿灯点亮
keyscan(); //按键扫描
dis(); //显示
if(tt>65)
{
tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp>200) //减到小于0 跳出循环
{
tt=65;
break;
}
}
}
//南北通行,东西禁止
temp=tx_time+1;
while(1)
{
P2=0XDE;
keyscan();
dis();
if(tt>65)
{
tt=0;//定时完成一次后清0
temp--;//变量自增
if(temp>200) //减到小于0 跳出循环
{
tt=20;
break;
}
}
}
//南北绿灯闪2s
temp=5;
while(1)
{
keyscan();
dis();
if(tt>32)P2=0XFE;
else P2=0XDE;
if(tt>65)
{
tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp==2) //减到小于0 跳出循环
{
tt=65;
break;
}
}
}
//南北方向黄灯亮2s;
temp=3;
while(1)
{
P2=0XEE;
keyscan();
dis();
if(tt>65)
{
tt=0; //定时完成一次后清0
temp--; //变量自增
if(temp>200) //减到小于0 跳出循环
{
tt=65;
break;
}
}
}
}
}
void Time0() interrupt 1
{
//重装初值;
TH0=(65536-15384)/256;
TL0=(65536-15384)%256;
tt++; //时间累加
}