您的位置首页百科快答

单片机控制的交通灯

单片机控制的交通灯

的有关信息介绍如下:

单片机控制的交通灯

题目 交通灯控制系统的设计 一、课程设计的目的与要求 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++; //时间累加

}