最新版单片机综合实验报告之模拟交通灯设计.docx
- 文档编号:6523578
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:15
- 大小:351.59KB
最新版单片机综合实验报告之模拟交通灯设计.docx
《最新版单片机综合实验报告之模拟交通灯设计.docx》由会员分享,可在线阅读,更多相关《最新版单片机综合实验报告之模拟交通灯设计.docx(15页珍藏版)》请在冰豆网上搜索。
最新版单片机综合实验报告之模拟交通灯设计
单片机综合实验报告
题目:
模拟真实交通灯
班级:
姓名:
学号:
指导老师:
2014年6月13日
一、实验内容:
用8255芯片的PA、PB口低四位做输出口,控制十二个发光二极管燃灭,模拟十字路口交通灯管理,并利用数码显示器进行倒计时显示(采用单片机内部定时器定时)。
通过外部中断能使交通灯暂停运行,并点亮4个红灯。
通过16*16点阵中的图形模拟控制行人过马路的人形“走”、“停”指示灯,可参考下图所示:
利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。
要求编制程序实现汉字点阵循环显示。
I/O口地址分配
I/O口分别提供字形代码(列码)、扫描信号(行码),凡字形代码位为“1”、行扫描信号为“1”点亮该点,否则熄灭;通过逐行扫描循环点亮字形或曲线。
二、实验电路及功能说明
8255与发光二极管连线图
数码LED显示器电路
16×16LED点阵显示电路
实验原理图
三、实验程序流程图:
主程序:
四、实验结果分析
通过程序仿真,可以检测设计的电路能基本满足设计要求。
交通灯亮灭过程同“8255控制交通灯实验”,倒计时显示只需两位数(0~99),用定时器定时进行倒计时,每秒钟减1。
在16*16点阵中显示的人形“走”、“停”标志可自定义。
五、心得体会
我们通过作这个单片机实验,我们总结了一下点:
1、加深了对51单片机的理解,不仅仅是以前那样只能点亮发光二极管。
2、感受到了完成一件程序的乐趣,并且知道了实践精神。
3、理解了51单片机的强大和我们知识的肤浅。
4、学到了许多原来C语言中没有的东西,如:
控制按键的程序
While(P0_5==1)
{
Time++;
While(P0_5==1);
}
这样可以不加防按键抖动的延时程序,更精确时间。
5、进一步充分利用中断时刻都在运行,让时间在中断中显示,就不会出现进入死循环后而无法显示时间的情况,而且还可以快速的反映除时间的变化。
六、程序清单
#include
#include
#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};
/*--停止--*/
/*--宽度x高度=16x16--*/
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;
temp|=(led<<5)&0x40;
temp|=(led<<3)&0x20;
temp|=(led<<1)&0x10;
temp|=(led>>1)&0x08;
temp|=(led>>3)&0x04;
temp|=(led>>5)&0x02;
temp|=(led>>7)&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];
COL1=scan1;
COL2=0;
delayshort();
scan1<<=1;
}
else
{
ROW1=0;
ROW2=0;
COL1=0;
COL2=scan2;
ROW1=changeleft(table[2*i]);
ROW2=table[2*i+1];
COL1=0;
COL2=scan2;
delayshort();
scan2<<=1;
}
}
}
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[3]=10;
buffer[0]=10;
buffer[5]=ewstarter%10;
buffer[4]=ewstarter/10;
buffer[2]=ewstarter%10;
buffer[1]=ewstarter/10;
}
else
{
buffer[3]=10;
buffer[0]=10;
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>>=1;
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;
}
else
{
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;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
tempseg=ewstarter+allredend/2-(time+1)/2;
}
elseif((time>ewredend)&&(time<=snyellowend))
{
if(change==0)
{
tongBu=2;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
change=1;
}
else
{
tongBu=3;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
change=0;
}
tempseg=ewstarter+allredend/2+5-(time+1)/2;
}
elseif((time>snyellowend)&&(time<=snredend))
{
tongBu=4;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
tempseg=ewstarter+allredend/2+5+snstarter-(time+1)/2;
}
elseif((time>snredend)&&(time<=ewyellowend))
{
if(change==0)
{
tongBu=5;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
change=1;
}
else
{
tongBu=6;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
change=0;
}
tempseg=ewstarter+10+allredend/2+snstarter-(time+1)/2;
}
else
{
tongBu=1;
time=allredend+1;
PA=ewTable[tongBu];
PB=nsTable[tongBu];
tempseg=ewstarter+allredend/2-(time+1)/2;
}
}
}
}
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;
}
break;
case0x4:
while(KEY3==0)led16_16display(led2,32);
if(key1==1)
{
ewstarter--;
if(ewstarter==-1)
ewstarter=99;
}
if(key1==2)
{
snstarter--;
if(snstarter==-1)
snstarter=99;
}
break;
default:
break;
}
}
voidmain()
{
IE=0x8b;
IT0=1;
TMOD=0x11;
TH0=()/256;
TL0=()%256;
TH1=()/256;
TL1=()%256;
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<=allredend)
led16_16display(led2,32);
elseif(time>allredend&&time<=snyellowend)
led16_16display(led1,32);
elseif(time>snyellowend&&time<=ewyellowend)
led16_16display(led2,32);
}
else
led16_16display(led2,32);
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新版 单片机 综合 实验 报告 模拟 交通灯 设计