单片机交通灯实验报告文档格式.docx
《单片机交通灯实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《单片机交通灯实验报告文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
聲蠶翠一一防
^h4-8J4-
RF3g
ranzP3.VT>
1cazomj»
3ywn
runwrcjaAO:
mviuafqwjhrvjr*j»
fVMXMmv/A&
i
(2)用Keil软件编写程序调试;
代”
交通灯程序:
/*******************"
(弋码说明************程序实现简单的十字交通路口指示灯功能。
按键act是功能选择键,按第一下后,再按add键实现倒计时增加,最后一次增加的值作为倒计•时数的值,
act按第二下后,再按Jdd键实现交通灯方向变换,act按第三下倒计时继续。
*/
#includeHreg51.hM
#defineucharunsignedchar
#defineuintunsignedint
#defineAA15
#defineBB20〃设初值
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7(1,0x07,
//aad键
//act键
〃南北方向的红灯
0x7f,0x6f};
sbitadd二PIT;
sbitact=PlA0:
sbitnred=PlA2;
sbitnyellow=PlA3;
sbitngreen=PlA4;
sbitered=PlA5;
〃东西方向的红灯
sbiteyellow=PlA6;
sbitegreen=PlA7;
sbitjian=P3A2;
uchartime,num=O,nn=O,aa=1,flag2=0;
bitflag=O,flagl=O;
uintnumber,temp1,temp2,sum2=BB,sum1=AA;
voiddelay(uintz)〃延时函数
{
uintx,y;
for(x=z;
x>
0;
x—)for(y=l10;
y>
y—);
}
voidinit()〃初始化函数
templ=AA;
temp2=BB;
TMODI=Ox21;
//设置定时器1为工作方式2
THO=(65536-5OOOO)/256;
TL0=(65536-50000)%256;
TRO=1;
EA=1;
ETO=1;
SCON=0x50;
TH1=OxFD;
TL1=TH1;
PCON=0x00;
//ES=1;
TRI=1;
)
voiddisplay(ucharnum)
〃数码管现实函数
ucharshi.ge;
ge=num%10;
shi=nuni/10;
PO=table[shi];
P2=table[ge];
}voidmain()
while(act&
&
(aa=l))//开始键
P0=0;
P2=0;
if(act==O)
delay(lO);
aa=0;
while(!
act);
init();
if(flagl=O)
display(templ);
else
display(temp2);
while(l)
/*功能键*/
if(act==O)〃判断act键是否按下
if(act==O)
TR0=0:
nuni++;
if(num==4)〃重新启动定时器
num=0;
nn=O;
delay(5);
/*增加键或选择南北方向的键*/
if(add==O)〃判断add是否按下
if(add==O)
if(num==l)〃增加数值
nn=l;
templ++:
suml=tenipl;
if(templ==100)
temp1=0;
if(num==2)〃增加数值
tenip2++;
sum2=temp2;
if(temp2==100)
tenip2=0;
if(num==3)〃改变交通灯方向
flag1=0;
flag=0;
add);
/*减少键或选择东西方向键*/
if(jian==0)〃判断add是否按下
if(jian==O)
tempi—;
sumlnempl;
if(templ==-l)
temp1=100;
)display(templ);
temp2—;
suni2=temp2;
if(temp2==-1)
tenip2=100:
}display(temp2);
flag=l;
flag1=1;
jian);
if(flag==0)〃交通灯
[
ered=1;
ngreen=1;
nred=0;
egreen=0;
while((temp1>
=0&
temp1v5&
nn==0)ll(temp2>
tenip2<
5&
nn
=0))
//egreen=1;
eyellovv=0;
delay(500);
eyellow=l;
if(flag==l)
nred=l;
egreen=l;
ered=0;
ngreen=0;
nn==0)ll(tenip2>
temp2<
5&
nn==0))
//ngreen=l;
nyellow=0;
nyellow=l;
voidtimer0()interrupt1〃定时器0
time++;
time=O;
if(templ==-l)
templ=suml;
flag=~flag;
flag1二〜flag1;
if(flag!
=l)display(templ);
temp2=sum2;
flag=-flag;
flag1二〜flag1;
=O)
elsedisplay(templ);
if(flag2==l)//templ=number;
//suml=templ;
//flag1=0;
if(flag2==2)
//
tenip2=number;
flagl=l;
1
voidUARTInternipt(void)interrupt4{
if(RI)
RI=0;
flag2++;
if(flag2==3)
flag2=0;
number=SBUF;
TI=0;
/*voidSendOneByte(unsignedcharc)
SBUF=c;
TI);
}*/
(3)调试成功后结合实物调试。
六、实验结果及分析
按下第一个键,数码管和交通等开始亮,数码管开始倒计时显示,按下第一个键第一次调整第一个数,按下第二次调整第二个数,按下第三次,调整交通灯的显示状态,按下第四次重新开始倒汁时。
七、实验体会
这次实验主要用了定时器0中断来控制倒汁时的时间,运用查询法控制三个按键,P0口控制十位,P2口控制个位。
这次的实验是很难忘的经历,本次实验对单片机编程能力要求比较高,而且我们编的程序太麻烦了,太长了,没有注意编程的技巧,在以后的学习中要注意编程能力的训练。
通过此次实验,锻炼了我们的动手能力,理论联系实际,对于提高水平很有帮助。