单片机综合实验报告之模拟交通灯设计.docx

上传人:b****6 文档编号:8742588 上传时间:2023-02-01 格式:DOCX 页数:15 大小:351.64KB
下载 相关 举报
单片机综合实验报告之模拟交通灯设计.docx_第1页
第1页 / 共15页
单片机综合实验报告之模拟交通灯设计.docx_第2页
第2页 / 共15页
单片机综合实验报告之模拟交通灯设计.docx_第3页
第3页 / 共15页
单片机综合实验报告之模拟交通灯设计.docx_第4页
第4页 / 共15页
单片机综合实验报告之模拟交通灯设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

单片机综合实验报告之模拟交通灯设计.docx

《单片机综合实验报告之模拟交通灯设计.docx》由会员分享,可在线阅读,更多相关《单片机综合实验报告之模拟交通灯设计.docx(15页珍藏版)》请在冰豆网上搜索。

单片机综合实验报告之模拟交通灯设计.docx

单片机综合实验报告之模拟交通灯设计

(此文档为word格式,下载后您可任意编辑修改!

 

单片机综合实验报告

 

题目:

模拟真实交通灯

班级:

姓名:

学号:

指导老师:

 

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);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1