交通灯实验报告Word文件下载.docx

上传人:b****5 文档编号:19014907 上传时间:2023-01-03 格式:DOCX 页数:34 大小:233.34KB
下载 相关 举报
交通灯实验报告Word文件下载.docx_第1页
第1页 / 共34页
交通灯实验报告Word文件下载.docx_第2页
第2页 / 共34页
交通灯实验报告Word文件下载.docx_第3页
第3页 / 共34页
交通灯实验报告Word文件下载.docx_第4页
第4页 / 共34页
交通灯实验报告Word文件下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

交通灯实验报告Word文件下载.docx

《交通灯实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《交通灯实验报告Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。

交通灯实验报告Word文件下载.docx

其中P3.2口为外部中断信号

的引脚输入,IT0设置为1,边沿触发方式,负跳变有效

(4)剩下的锁存器模块和自定义红绿黄灯时间的显示模块

锁存器模块,其中

接低电平时,芯片内部数据保持器与输出端口连接。

在此则直接接地,保持连接畅通。

LE=0时,P1口与芯片内部数据保持器断开;

LE=1时,P1口与芯片内部数据保持器连通。

上面三个数码管,从左到右分别显示黄灯显示时间,汽车左转信号时间,行人看到绿灯的时间。

由此就可以得到,

汽车看到绿灯直行信号的时间=行人看到绿灯的时间+黄灯的时间

汽车看到红灯的时间=汽车绿灯直行时间+汽车绿灯左转时间

行人看到红灯的时间=汽车看到红灯的时间+汽车左转的时间

(5)流程图

三、实验过程

(1)编写交通灯控制程序

自己编写头文件FUNCTION.H

traffic_light.c,包含需要用到的所有变量和main函数

function.c,包含delay子程序和init初始化程序

key.c,包含键盘扫描处理中断程序

display.c,包含显示交通灯和数码管程序

timer.c,包含利用计时器计时1s的程序

(2)分析头文件FUNCTION.H

#ifndef_FUNCTION.H_//定义如果其他c文件定义了该头文件,则包含以下内容

#defineFUNCTION.H

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

#definegreen20//以下为预处理宏定义

#definepeople_green20//行人看到绿灯时间为20s

#defineblue5//汽车看到绿灯左转时间为5s

#defineyellow5//行人看到黄灯时间为5s

#definecar_greenpeople_green+yellow//汽车看到绿灯直行和左转的时间,同时也是汽车红灯//的时间

#defineredgreen+blue+yellow//行人看到红灯的时间

sbitdu=P3^7;

//定义数码管扫描的位选锁存器的LE端

sbitwe=P3^6;

//定义交通显示数码管数据输送的锁存器的LE端

sbitdef=P3^3;

//定义自己定义交通灯信号显示时间的数据输送的锁存器的LE端

sbitlight_off=P3^0;

//定义控制所有交通灯灭的端口

voiddelay(ucharms);

//延时子函数

voidinit();

//初始化函数

voidtraffic_light();

//交通灯函数

voidget_number();

//取值送入数码管倒计时的函数

voidxianshi_function();

//数码管倒计时到3s后数字闪烁的子函数

voidkey_scan();

//键盘扫描子函数

voidkey_function();

//键盘按下后发生的作用的子函数

#endif

(3)分析包含main函数的traffic_light.c文件

#include"

FUNCTION.H"

//包含头文件

ucharcodedu_table[]={

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//选通显示的数码管

ucharcodewe_table[]={

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

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

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

//输送给数码管显示数据的字模

ucharn,ston_time=red,etow_time=people_green,flag=0,etcarrun=car_green;

ucharsncarrun=red,status=0,key=0,temp;

//ston_time东西路口行人的倒计时,etow_time南北路口行人的倒计时

//sncarrun东西路口汽车的倒计时,etcarrun东西苦口汽车的倒计时

//status选择汽车路口的工作状态,key确认按下的键值执行对应的函数

//temp一个中间变量

ucharxianshi_flag=0,jishi=0,jishi1=0,jishi2=0,jishi3=0,jishi4=0;

//xianshi_flag中断显示函数中的标志位

//jishi,jishi1,jishi2,jishi3,jishi4均是中间变量,无特殊意义

ucharzidingyi=0,symbol=0;

//zidingyi选择是否要自己更改交通信号的时间

//symbol显示要更改的是哪个交通灯信号的时间

ucharnum[8];

//存放显示倒计时数据的容器

ucharnormal[3]={5,5,20};

//正常情况下,交通灯的倒计时时间,分别为黄灯,汽车左转,行//人绿灯时间

ucharbusy[3]={5,10,40};

//下同

ucharurgent[3]={5,10,60};

//

uchardefine[3]={5,5,20};

voidmain()

{

init();

//初始化,即打开总中断,外部中断0,定时器0,定时器1

while

(1)

{

key_scan();

//键盘扫描程序

}

}

/*key_scan()函数执行的功能如下

P2=0xfe;

//分别将第四位轮流置低,检测到按键按下后

P2=0xfd;

//进入中断程序,再执行key_function()

P2=0xfb;

P2=0xf7;

if(key>

0)

key_function();

}

*/

(4)分析function.c文件

voiddelay(ucharms)//延时子程序

uchari,j;

for(i=ms;

i>

0;

i--)

for(j=110;

j>

j--)

;

voidinit()//初始化程序

EA=1;

//开总开关

TMOD=0x11;

//开定时器0和定时器1,设置工作模式

TH0=(65536-50000)/256;

//定时器0倒计时50ms

TL0=(65536-50000)%256;

TH1=(65536-2000)/256;

//定时器1倒计时2ms

TL1=(65536-2000)%256;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

we=0;

//让锁存器内部芯片数据保持器与IO口断开

du=0;

EX0=1;

//开外部中断0,并选择触发模式

IT0=1;

light_off=1;

//让交通灯显示

(5)分析display.c文件

/*

sbityellow1=P0^0;

sbitred1=P0^1;

sbitgreen1=P0^2;

sbitblue1=P0^3;

sbityellow2=P0^4;

sbitred2=P0^5;

sbitgreen2=P0^6;

sbitblue2=P0^7;

标号为1,则为南北的信号灯,其中blue代表绿灯左转信号

标号为2,则为东西的信号灯,其中blue代表绿灯左转信号

yellow1=1;

red1=0;

green1=1;

yellow2=1;

red2=1;

green2=0;

blue1=1;

blue2=1;

*/

externucharflag,zidingyi,xianshi_flag;

//变量意义在traffic_light.c中解释过了

externucharston_time,jishi1,etow_time,jishi2;

externucharsncarrun,jishi3,etcarrun,jishi4,symbol,jishi;

externucharcodedu_table[8],we_table[16];

externucharsncarrun,define[3],ston_time,etow_time,etcarrun,num[8];

voidtraffic_light()//交通灯显示程序

if(flag==0)//flag=0为南北路口红灯,东西路口汽车行人直行

P0=0xbd;

if(flag==1)//flag=1南北路口红灯,东西路口汽车直行,行人遇黄灯

if(TR0==1)//在50ms计时器停止计数时,黄灯停止闪烁

{

P0=0xed;

delay(5);

P0=0xfd;

}

P0=0xed;

delay(5);

if(flag==2)//flag=2南北路口红灯,东西路口汽车左转,行人红灯

P0=0x7d;

if(flag==3)//flag=3为东西路口红灯,南北路口汽车行人直行

P0=0xdb;

if(flag==4)//flag=1东西路口红灯,南北路口汽车直行,行人遇黄灯

P0=0xde;

P0=0xdf;

P0=0xde;

if(flag==5)//flag=5东西路口红灯,南北路口汽车左转,行人红灯

P0=0xd7;

voidget_number()

if(zidingyi==0)//不自定义的情况下,将交通信号倒计时存入数组容器中

num[0]=ston_time/10;

num[1]=ston_time%10;

num[2]=etow_time/10;

num[3]=etow_time%10;

num[4]=etcarrun/10;

num[5]=etcarrun%10;

num[6]=sncarrun/10;

num[7]=sncarrun%10;

else//在自定义信号时间时,将数据存入数组容器中

num[0]=define[2]/10;

num[1]=define[2]%10;

num[2]=define[1]/10;

num[3]=define[1]%10;

num[4]=define[0]/10;

num[5]=define[0]%10;

voidxianshi_function()

if(zidingyi==0)//非自定义的情况下

{//南北路口的行人在遇黄灯小于等于3s时,倒计时闪烁

if((ston_time<

4)&

&

(jishi1<

100)&

(flag==4))

if(xianshi_flag==0)

{

xianshi_flag=2;

}

jishi1++;

if(jishi1==100)

jishi1=0;

xianshi_flag=0;

}

if((etow_time<

(jishi2<

(flag==1))

{//东西路口的行人在遇黄灯小于等于3s时,倒计时闪烁

if(xianshi_flag==2)

xianshi_flag=4;

jishi2++;

if(jishi2==100)

jishi2=0;

if((etcarrun<

(jishi3<

(flag==2))

{//东西路口的汽车在遇左转信号小于等于3s时,倒计时闪烁

if(xianshi_flag==4)

xianshi_flag=6;

jishi3++;

if(jishi3==100)

jishi3=0;

if((sncarrun<

(jishi4<

(flag==5))

{//南北路口的汽车在遇左转信号小于等于3s时,倒计时闪烁

if(xianshi_flag==6)

jishi4++;

if(jishi4==100)

jishi4=0;

if(zidingyi==1)//自定义信号时间的情况下

if(symbol==1)//选择调节行人看到绿灯的时间,且显示的时间闪烁

if(jishi<

100)

if(xianshi_flag==0)

{

xianshi_flag=2;

}

jishi++;

if(jishi==100)

jishi=0;

xianshi_flag=0;

}

if(symbol==2)//选择调节行人看到黄灯的时间,且显示的时间闪烁

if(xianshi_flag==2)

xianshi_flag=4;

if(symbol==3)//选择调节汽车看到左转的时间,且显示的时间闪烁

if(xianshi_flag==4)

voidTIME1()interrupt3

get_number();

//等到数码管上要显示的数据

xianshi_function();

def=1;

//关闭调节信号时间的数码管

P1=0xff;

def=0;

du=1;

//选通显示的数码管

P1=du_table[xianshi_flag];

du=0;

P1=0x00;

//消影

we=1;

//选择要显示在数码管上的数据

P1=we_table[num[xianshi_flag]];

we=0;

delay

(1);

//延迟一小段时间

traffic_light();

//显示交通灯的状况

xianshi_flag++;

//显示标志位加1,到8变为0,防止逸出

if(xianshi_flag==8)

xianshi_flag=0;

else//自定义的情况下,分析同上面

if(xianshi_flag==6)

}

(6)分析键盘扫描key.c文件

externucharkey,status,ston_time,etow_time,etcarrun,sncarrun;

externucharzidingyi,symbol,temp;

externucharnormal[3],busy[3],urgent[3],define[3];

voidkey_scan()

voidkey_function()

if(key==1)//第一个键按下,停止倒计时

TR0=~TR0;

key=0;

if(key==2)//第二个键按下,全部数码管和信号灯灭

TR1=~TR1;

light_off=~light_off;

P0=0xff;

if(key==5)//第5个键按下,切换到正常模式

status=1;

define[0]=normal[0];

define[1]=normal[1];

define[2]=normal[2];

ston_time=define[0]+define[1]+define[2];

etow_time=define[2];

etcarrun=define[0]+define[2];

sncarrun=define[0]+define[1]+define[2];

if(key==6)//第6个键按下,切换到繁忙模式

define[0]=busy[0];

define[1]=busy[1];

define[2]=busy[2];

if(key==7)//第7个灯按下,切换到特殊模式

define[0]=urgent[0];

define[1]=urgent[1];

define[2]=urgent[2];

if(TR0==0)//必须停止倒计时计数后,按下第8个按键才有效

if(key==8)//按下第8个按键,进行自定义信号灯的计时时间

zidingyi=1;

if(zidingyi==1)

du=1;

P1=0xff;

du=0;

we=1;

P1=0x00;

we=0;

key=0;

if(key==9)//第9个按键按下,切换回正常计数模式

zidingyi=0;

ston_time=define[0]+define[1]+define[2];

etow_time=define[2];

etcarrun=define[0]+define[2];

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 中国风

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1