当前位置:文档之家› 单片机仿真交通灯实验

单片机仿真交通灯实验

实验报告实验名称:交通灯实验
姓名
班级
日期
实验要求:
1. 请使用单片机系统主机板和单片机系统键盘、显示板设计一个硬件系统,最终实
现一个交通路口红绿灯的控制。

用两个数码管显示秒,8个LED灯分成四组,分别作为十字交叉路口的红绿灯。

2. 相对双向绿灯的最后几秒时,绿灯要闪烁,即亮灭交替,亮灭时间均为0.5秒,
然后变成红灯。

3. 每组同学可自行设计进行连接,形成一个单片机硬件系统。

4. 模拟调试完成后,用STC-ISP下载编程软件将生成的*。

HEX文件在线下载到单片
机中。

5.下载后,按复位键执行程序,检验程序运行结果。

硬件连线方案:
程序流程图:
源代码:
#include<reg51.h> //51单片机头文件声明
unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //定义无符号数组,定义的数据要放在ROM(程序存储区)里面
sbit dula=P1^3; //特殊功能位定义,数码管段码控制信号
sbit G1=P1^4; //数码管位选控制信号
sbit c=P1^5; //c表示P1.0口,地址最高位
sbit b=P1^6; //地址次高位
sbit a=P1^7; //地址最低位
sbit xl=P2^0; //特殊功能位声明,xl表示P2.0口
sbit xh=P2^1; //
sbit yl=P2^2;
sbit yh=P2^3;
sbit sl=P2^4;
sbit sh=P2^5;
sbit zl=P2^7;
sbit zh=P2^6;
char count=100; //定时时间取10ms,循环100次即为1s
unsigned char ssx=14; //秒上下,为上下绿灯亮时倒计数
unsigned char szy=10; //秒左右,为左右绿灯亮时倒计数
char sx=1; //方向标志,上下绿灯亮
void delay(char x) //延时函数,通过for循环进行延时
{
char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void shumaguanxianshi() //数码管显示函数
{
if(sx==1) //方向标志假如为上下
{ P0=tab[ssx/10]; dula=1; //选择2号管显示秒十位(上下) c=0;b=1;a=0; G1=1;
delay(2); //在晶振频率12MHz,延时2ms。

G1=0;
P0=tab[ssx%10]; dula=1; //选择3号管显示秒个位(上下)c=0;b=1;a=1; G1=1;
delay(2);
G1=0;
}
if(sx==0) //方向标志假如为左右
{ P0=tab[szy/10]; dula=1; //选择4号管显示秒十位(左右) c=1;b=0;a=0; G1=1;
delay(2);
G1=0;
P0=tab[szy%10]; dula=1; //选择5号管显示秒个位(左右)c=1;b=0;a=1; G1=1;
delay(2);
G1=0;
}
}
void xiaodeng() //小灯函数
{
if(sx==1) //判断方向是否为上下
{ xl=0; xh=1; sl=0; sh=1;
yl=1; yh=0; zl=1; zh=0; //红绿灯亮灭,0表示亮,1表示灭。

上下绿灯,左右红灯 if(ssx<=5) //当左数码管显示5秒,控制绿灯闪烁
{ if(count<=50) //计数器时间小于0.5s
{xl=1;sl=1;} //绿灯灭
}
}
if(sx==0)
{ xl=1; xh=0; sl=1; sh=0;
yl=0; yh=1; zl=0; zh=1;
if(szy<=5)
{if(count<=50)
{yl=1;zl=1;}
}
}
}
initial() //初始化函数
{
TMOD=0x01; //设置定时器为工作方式1
TH0=0xD8; //在晶振频率12MHz下,赋初值
TL0=0xF0;
EA=1; //允许CPU中断
G1=0; //位选信号G1无效
TR0=1; //启动定时器T0
ET0=1; //允许定时器T0中断
}
main() //主函数
{
initial();//调用初始化函数
while(1) //无限循环,用于循环点亮小灯和显示数码管{
shumaguanxianshi(); //调用数码管显示函数xiaodeng(); //调用小灯函数
}
}
t0_int() interrupt 1 //中断函数,T0中断
{
TH0=0xD8; //重新赋初值
TL0=0xF0;
count--; //计数器减1
if(count==0) //判断计数器是否记满100次
{
count=100; //定时时间重新取值
if(sx==1) //假如方向标志是上下
{
ssx--; //时间倒记时
if(ssx==0) //左数码管显示0
{
sx=0; //方向标志取反,方向为左右
szy=10; //右数码管取值10s
}
}
if(sx==0) //假如方向标志是左右
{
szy--; //时间倒记时
if(szy==0) //右数码管显示0
{
sx=1; //方向标志取反,方向为上下
ssx=14; //左数码管取值10s
}
}
}
}
每个成员完成的工作:独立完成。

实验总结:。

相关主题