单片机交通灯实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的

通过仿真和实物搭建相结合,完成交叉口交通灯的设计,并掌握C51编程的操作。

二、实验内容及要求

模拟控制就是以红、绿、黄色4组6个发光二极管表示交通信号灯。每组有两位数码倒计时显示。

(1)正常情况下A、B道轮流放行,A道放行15秒钟,B道放行20秒

(2)一道有车而另一道无车时,使有车车道放行

(3)有紧急车辆通过时,A、B道均为红灯,每个口都有2组2位数码管,共6个灯三、实验原理

本实验主要用到51单片机定时中断控制LED的跳转和数码管的倒计时,同时用查询法来检测按键,并做出相应的状态切换。

四、实验仪器、材料

LED,7段数码管,AT89C52单片机,导线

五、实验过程及原始记录

(1)通过Proteus做仿真图;

仿真图如下:

(2)用Keil软件编写程序调试;

交通灯程序:

/*******************代码说明************

程序实现简单的十字交通路口指示灯功能。

按键act是功能选择键,按第一下后,再按add键实现倒计时增加,最后一次增加的值作为倒计时数的值,

act按第二下后,再按add键实现交通灯方向变换,act按第三下倒计时继续。

*/

#include "reg51.h"

#define uchar unsigned char

#define uint unsigned int

#define AA 15

#define BB 20 //设初值

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

sbit add=P1^1; //aad键

sbit act=P1^0; //act键

sbit nred=P1^2; //南北方向的红灯

sbit nyellow=P1^3;

sbit ngreen=P1^4;

sbit ered=P1^5; //东西方向的红灯

sbit eyellow=P1^6;

sbit egreen=P1^7;

sbit jian=P3^2;

uchar time,num=0,nn=0,aa=1,flag2=0;

bit flag=0,flag1=0;

uint number,temp1,temp2,sum2=BB,sum1=AA;

void delay(uint z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void init() //初始化函数

{

temp1=AA;

temp2=BB;

TMOD|=0x21;//设置定时器1为工作方式2 TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

EA=1;

ET0=1;

SCON = 0x50;

TH1 = 0xFD;

TL1 = TH1;

PCON = 0x00;

// ES = 1;

TR1 = 1;

}

void display(uchar num) //数码管现实函数{

uchar shi,ge;

ge=num%10;

shi=num/10;

P0=table[shi];

P2=table[ge];

}

void main()

{

while(act&&(aa==1)) //开始键

{

P0=0;

P2=0;

if(act==0)

{

delay(10);

if(act==0)

aa=0;

}

while(!act);

}

init();

if(flag1==0)

display(temp1);

else

display(temp2);

while(1)

{

/*功能键*/

if(act==0) //判断act键是否按下

{

delay(10);

if(act==0)

{

TR0=0;

num++;

if(num==4) //重新启动定时器

{

TR0=1;

num=0;

nn=0;

}

}

while(!act);

delay(5);

while(!act);

}

/*增加键或选择南北方向的键*/

if(add==0) //判断add是否按下{

delay(10);

if(add==0)

{

if(num==1) //增加数值

{

nn=1;

temp1++;

sum1=temp1;

if(temp1==100)

{

temp1=0;

}

display(temp1);

}

if(num==2) //增加数值

相关文档
最新文档