微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机实验--交通灯

单片机实验--交通灯

时间:11-22 来源:互联网 点击:
一、实验目的

1、进一步熟悉HNIST-2型单片机系统

相关硬件电路;

2、掌握单片机中断的应用和中断处理程序的编写方法;

3、掌握单片机内部定时/计数器的使用及编程方法

二、实验前准备

1、完成作业4

2、根据实验内容编写好相关程序,并进行Proteus仿真。

三、实验内容

实验内容为3项,其中第1、2项必做。

1、基本交通灯

根据图3.2电路,用单片机的IO口控制4组红绿黄共12个发光二极管,使发光二极管按照一定规则与次序发光与闪亮以实现模拟交通灯的功能。假设初始状态为:(南北通行状态)南北绿灯、东西红灯(25s);后转为过度状态:南北黄灯、东西红灯(5s);再转为东西通行状态:东西绿灯、南北红灯25(s)。再转为过渡状态:东西黄灯、南北红灯(5s),然后循环往复。

要求采用定时器实现所需要的定时时间。

2、键控交通灯。

按一下K1键

,保持南北通行状态;按一下K2键

,保持东西通行状态;按一下K3键

,保持正常交通灯。

要求在中断中进行按键处理。

3、具有闪烁的交通灯。

在2的基础上增加,绿灯最后5s闪烁,即亮0.5S灭0.5S闪烁。

四、实验原理图

图3.2交通灯实验电路原理

图3.2共有4个按键K1、K2、K3、K4,分别连接到单片机P2.0、P2.1、P2.2、P2.3引脚,按键后对应引脚为低电平,通过4个二极管D17、D18、D19、D20连接到P3.2(外部中断0),这是二极管构成的相与电路,即任意按一个键能在P3.2上产生一个低电平或下降,作为中断触发信号。

五、软件设计思想

1、定时思想。

采用定时器T0或T1的方式1定时500ms,每500ms中断进行计数,计数10次即0.5s,计数20次即1s,对秒计数实现所需要的定时时间。

2、亮灯控制思想。

单片机控制灯引脚与灯对应如下,0点亮。

一共有四种状态S0、S1、S2、S3,

a、南北通行S0状态:

南北绿灯、东西红灯,P0=11110111=0xf7,P1=10011110=0x9e;

南北通行S0

b、过渡状态S1:

南北黄灯、东西红灯,P0=11111011=0xfb,P1=10101110=0xae;?

过渡状态S1?

c、东西通行状态S2:

东西绿灯、南北红灯,P0=11111100=0xfc,P1=11110011=0xf3;?

东西通行状态S2?

d、过渡状态S3:

东西黄灯、南北红灯,P0=11111101=0xfd,P1=01110101=0x75;

过渡状态S3?

设置一个秒计数单元SEC每秒+1,设置两个控制值变量a,b。

首先令SEC=0,a=0xfd,b=0x75,处于S0状态;

SEC==25,a=0xfc,b=0xf3,处于S1状态;

SEC==30,a=0xfb,b=0xae,处于S2状态;

SEC==55,a=0xf7,b=0x9e,处于S3状态;

SEC==60,SEC=0,a=0xfd,b=0x75,处于S0状态;

P0=a,P1=b。

3、交通灯键控

按键后即进入外部中断0,在外部中断0中断程序中判断:若是按K1键,控制南北通行状态,并将定时器T0关闭,即可保持南北通行状态;若是按K2键,控制东西通行状态,并将定时器T0中断关闭,即可保持东西通行状态;若是按K3键,开启定时器T0中断,恢复正常交通灯。

4、闪烁控制?

在需要闪烁时,0.5s按正常显示,0.5s全灭,即是闪烁效果。实现方法是:当=0.5s的时刻,并且在南北通行的最后5s(19或在东西通行的最后5s(49,灭绿灯:P0=0xf9,P1==0x24,当=1s的时刻,按正常显示。

六、实验源代码

#include//基本的交通灯程序

#defineuintunsignedint

uintflag=20;//定义计时器标志

uintsecond=0;//定义秒标志

voidmain()

{

TMOD=0x01;//选择T0计时器的工作方式1

TH0=(65536-50000)/256;//给TH0装初始值为50000us

TL0=(65536-50000)%6;//给TH1装初始值

TR0=1;//SCON中T0计时器打开

ET0=1;//打开定时计数器T0中断

EA=1;//打开总中断

P2=0xf7;//交通灯赋初始状态

P3=0x9e;

while(1)//等待时间,做出反应

{

if(second==25)

{P2=0xf7;P3=0x9e;}

if(second==30)

{P2=0xfb;P3=0xae;}

if(second==55)

{P2=0xfc;P3=0xf3;}

if(second==60)

{P2=0xfd;P3=0x75;}

if(second>60)second=second`;

}

}

voidT0_int(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

flag--;

if(flag==0)

{

second++;//秒标志加1

flag=20;//重置计时器标志

}

}

#include//基本的交通灯程序

#defineuintunsignedint

sbitk1=P2^0;

sbitk2=P2^1;

sbitk3=P2^2;

uintflag=5;//定义计时器标志

uintsecond=0;//定义秒标志

uintkey;//判断按键是否按下的标志

voidmain()

{

TMOD=0x01;//选择T0计时器的工作方式1

TH0=(65536-5000)/256;//给TH0装初始值为50000us

TL0=(65536-5000)%6;//给TH1装初始值

TR0=1;//SCON中T0计时器打开

ET0=1;//打开定时计数器T0中断

EX0=1;//开外部中断0

IT0=1;//外部中断0触发方式为跳变沿触发

PX0=1;//设置外部中断0优先级为1

EA=1;//开总中断

P1=0xf7;//交通灯赋初始状态

P3=0x9e;

while(1)//等待时间,做出

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top