一、试验意图
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共有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;

b、过渡状况S1:
南北黄灯、东西红灯,P0=11111011=0xfb,P1=10101110=0xae;

c、东西通行状况S2:
东西绿灯、南北红灯,P0=11111100=0xfc,P1=11110011=0xf3;

d、过渡状况S3:
东西黄灯、南北红灯,P0=11111101=0xfd,P1=01110101=0x75;

设置一个秒计数单元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)//等待时间,做出反响
{
if(second==10)
{P1=0xf7;P3=0x9e;}
if(second==20)
{P1=0xfb;P3=0xae;}
if(second==30)
{P1=0xfc;P3=0xf3;}
if(second==40)
{P1=0xfd;P3=0x75;}
if(second>40)second=second`;
if(key==1){TR0=0;P1=0xf7;P3=0x9e;}//假如k1按下,南北通行
if(key==2){TR0=0;P1=0xfc;P3=0xf3;}//假如k2按下,东西通行
if(key==3)//假如k3按下,一般交通灯
{
TR0=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%6;
}
}
}
voidT0_int(void)interrupt1//守时计数器的中止子程序
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%6;
flag–;
if(flag==0)
{
second++;//秒标志加1
flag=5;//重置计时器标志
}
}
voidX0_int(void)interrupt0//外部中止0的中止子程序
{
if(k1==0)key=1;//依据各按键状况设置按键标志
if(k2==0)key=2;
if(k3==0)key=3;
}