单片机综合实验报告之模拟交通灯设计文档格式.docx
《单片机综合实验报告之模拟交通灯设计文档格式.docx》由会员分享,可在线阅读,更多相关《单片机综合实验报告之模拟交通灯设计文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
三、实验程序流程图:
主程序:
四、实验结果分析
通过程序仿真,可以检测设计的电路能基本满足设计要求。
交通灯亮灭过程同“8255控制交通灯实验”,倒计时显示只需两位数(0~99),用定时器定时进行倒计时,每秒钟减1。
在16*16点阵中显示的人形“走”、“停”标志可自定义。
五、心得体会
我们通过作这个单片机实验,我们总结了一下点:
1、加深了对51单片机的理解,不仅仅是以前那样只能点亮发光二极管。
2、感受到了完成一件程序的乐趣,并且知道了实践精神。
3、理解了51单片机的强大和我们知识的肤浅。
4、学到了许多原来C语言中没有的东西,如:
控制按键的程序
While(P0_5==1)
{
Time++;
While(P0_5==1);
}
这样可以不加防按键抖动的延时程序,更精确时间。
5、进一步充分利用中断时刻都在运行,让时间在中断中显示,就不会出现进入死循环后而无法显示时间的情况,而且还可以快速的反映除时间的变化。
六、程序清单
#include<
reg51.h>
absacc.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineROW1XBYTE[0XFFE3]
#defineROW2XBYTE[0XFFE0]
#defineCOL1XBYTE[0XFFE2]
#defineCOL2XBYTE[0XFFE1]
#definePAXBYTE[0xffd8]
#definePBXBYTE[0xffd9]
#defineCTLXBYTE[0xffdb]
#defineSEGXBYTE[0xffdc]
#defineBITXBYTE[0xffdd]
#defineallredend10
#defineewredend2*ewstarter+allredend
#definesnyellowendewredend+10
#definesnredendsnyellowend+2*snstarter
#defineewyellowendsnredend+10
sbitKEY1=P1^0;
sbitKEY2=P1^1;
sbitKEY3=P1^2;
sbitP32=P3^2;
uchartongBu;
ucharcodeewTable[]={0xb6,0x75,0xf3,0xf7,0xae,0x9e,0xbe};
ucharcodensTable[]={0xd,0xd,0xc,0xd,0xb,0x7,0xf};
//uchartempa,tempb;
inttime=1,cnt,change,intflag,inttime=1,ewstarter=10,snstarter=15;
inttempseg;
ucharkey1=0;
ucharbuffer[]={};
uchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*--行走--*/
/*--宽度x高度=16x16--*/
ucharcodeled1[]={0x01,0x80,0x02,0x40,0x02,0x40,0x01,0x80,0x03,0xC0,0x06,0x60,0x0A,0x50,0x0A,0x50,
0x0B,0xD0,0x12,0x48,0x02,0x40,0x02,0x60,0x04,0x20,0x04,0x20,0x08,0x20,0x18,0x60};
/*--停止--*/
ucharcodeled2[]={0x01,0x80,0x02,0x40,0x02,0x40,0x01,0x80,0x07,0xE0,0x7E,0x7E,0x02,0x40,0x02,0x40,
0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0};
/*--文字:
高--*/
/*--Fixedsys12;
此字体下对应的点阵为:
宽x高=16x16--
ucharcodeled2[]={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x00,0x00,
0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x14,0x40,0x08};
*/
voiddelayshort()
{
charn;
for(n=50;
n>
0;
n--);
}
ucharchangeleft(ucharled)
uchartemp;
temp=0;
temp|=(led<
<
7)&
0x80;
5)&
0x40;
3)&
0x20;
1)&
0x10;
temp|=(led>
>
0x08;
0x04;
0x02;
0x01;
return(temp);
voidled16_16display(uchar*table,ucharlength)
uchari=length/2,scan1=0x1,scan2=0x1;
for(i=0;
i<
16;
i++)
if(i<
8)
{
ROW1=0;
ROW2=0;
COL1=scan1;
COL2=0;
ROW1=changeleft(table[2*i]);
ROW2=table[2*i+1];
delayshort();
scan1<
=1;
}
else
COL1=0;
COL2=scan2;
scan2<
}
voidchangeseg()
if(key1==0)
buffer[3]=10;
buffer[0]=10;
buffer[5]=tempseg%10;
buffer[4]=tempseg/10;
buffer[2]=tempseg%10;
buffer[1]=tempseg/10;
elseif(key1==1)
buffer[5]=ewstarter%10;
buffer[4]=ewstarter/10;
buffer[2]=ewstarter%10;
buffer[1]=ewstarter/10;
else
buffer[5]=snstarter%10;
buffer[4]=snstarter/10;
buffer[2]=snstarter%10;
buffer[1]=snstarter/10;
voidtimer1()interrupt3
staticuchartemp=0x20,cnt1;
TH1=()/256;
TL1=()%256;
changeseg();
SEG=0xff;
SEG=table[buffer[cnt1]];
cnt1++;
if(cnt1==6)
cnt1=0;
BIT=temp;
temp>
if(temp==0)
temp=0x20;
voidint_0()interrupt0
delayshort();
if(P32==0)
PA=0xB6;
PB=0xd;
PT0=1;
PT1=1;
intflag=1;
while(inttime<
=20)
led16_16display(led2,32);
inttime=1;
intflag=0;
PT0=0;
PT1=0;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
voidtimer0()interrupt1
TH0=()/256;
TL0=()%256;
cnt++;
if(cnt==5)
cnt=0;
if(intflag==1)
inttime++;
tempseg=10-inttime/2;
time++;
if(time<
=allredend)
{
tongBu=0;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
tempseg=allredend/2-(time+1)/2;
}
elseif((time>
allredend)&
&
(time<
=ewredend))
tongBu=1;
tempseg=ewstarter+allredend/2-(time+1)/2;
ewredend)&
=snyellowend))
if(change==0)
{
tongBu=2;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
change=1;
}
else
tongBu=3;
change=0;
tempseg=ewstarter+allredend/2+5-(time+1)/2;
snyellowend)&
=snredend))
tongBu=4;
tempseg=ewstarter+allredend/2+5+snstarter-(time+1)/2;
snredend)&
=ewyellowend))
tongBu=5;
tongBu=6;
tempseg=ewstarter+10+allredend/2+snstarter-(time+1)/2;
else
time=allredend+1;
voidkey()
ucharkeynum;
keynum=~(P1|0XF8);
switch(keynum)
case0x1:
while(KEY1==0)led16_16display(led2,32);
key1++;
TR0=0;
if(key1==3)
key1=0;
TR0=1;
break;
case0x2:
while(KEY2==0)led16_16display(led2,32);
if(key1==1)
ewstarter++;
if(ewstarter==100)
ewstarter=0;
if(key1==2)
snstarter++;
if(snstarter==100)
snstarter=0;
case0x4:
while(KEY3==0)led16_16display(led2,32);
ewstarter--;
if(ewstarter==-1)
ewstarter=99;
snstarter--;
if(snstarter==-1)
snstarter=99;
default:
break;
voidmain()
IE=0x8b;
IT0=1;
TMOD=0x11;
CTL=0x80;
tongBu=0;
TR1=1;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
tempseg=allredend/2-(time+1)/2;
TR0=1;
while
(1)
key();
if(intflag==0)
if(key1==0)
if(time<
led16_16display(led2,32);
elseif(time>
allredend&
time<
=snyellowend)
led16_16display(led1,32);
snyellowend&
=ewyellowend)
led16_16display(led2,32);