1、单片机综合实验报告之模拟交通灯设计(此文档为word格式,下载后您可任意编辑修改!)单片机综合实验报告题 目: 模拟真实交通灯 班 级: 姓 名: 学 号: 指导老师: 2014 年 6 月 13 日一、实验内容:用8255芯片的PA、PB口低四位做输出口,控制十二个发光二极管燃灭,模拟十字路口交通灯管理,并利用数码显示器进行倒计时显示(采用单片机内部定时器定时)。通过外部中断能使交通灯暂停运行,并点亮4个红灯。通过16*16点阵中的图形模拟控制行人过马路的人形“走”、“停”指示灯,可参考下图所示:利用实验系统1616点阵实验单元,以两种方式控制点阵显示。要求编制程序实现汉字点阵循环显示。IO
2、口地址分配 IO口分别提供字形代码(列码)、扫描信号(行码),凡字形代码位为“1”、行扫描信号为“1”点亮该点,否则熄灭;通过逐行扫描循环点亮字形或曲线。二、实验电路及功能说明8255与发光二极管连线图数码LED显示器电路1616LED点阵显示电路实验原理图三、实验程序流程图:主程序:四、实验结果分析通过程序仿真,可以检测设计的电路能基本满足设计要求。交通灯亮灭过程同“8255控制交通灯实验”,倒计时显示只需两位数(099),用定时器定时进行倒计时,每秒钟减1。在16*16点阵中显示的人形“走”、“停”标志可自定义。 五、心得体会我们通过作这个单片机实验,我们总结了一下点:1、 加深了对51单
3、片机的理解,不仅仅是以前那样只能点亮发光二极管。2、 感受到了完成一件程序的乐趣,并且知道了实践精神。3、 理解了51单片机的强大和我们知识的肤浅。4、 学到了许多原来C语言中没有的东西,如:控制按键的程序 While(P0_5=1) Time+; While(P0_5=1); 这样可以不加防按键抖动的延时程序,更精确时间。 5、进一步充分利用中断时刻都在运行,让时间在中断中显示,就不会出现进入死循环后而无法显示时间的情况,而且还可以快速的反映除时间的变化。六、程序清单#include 0;n-);uchar changeleft(uchar led) uchar temp; temp=0;
4、temp|=(led7)&0x80; temp|=(led5)&0x40; temp|=(led3)&0x20; temp|=(led1)&0x08; temp|=(led3)&0x04; temp|=(led5)&0x02; temp|=(led7)&0x01; return(temp);void led16_16display(uchar *table,uchar length) uchar i=length2,scan1=0x1,scan2=0x1; for(i=0;i16;i+) if(i8) ROW1=0; ROW2=0; COL1=scan1; COL2=0; ROW1=chang
5、eleft(table2*i); ROW2=table2*i+1; COL1=scan1; COL2=0; delayshort(); scan1=1; else ROW1=0; ROW2=0; COL1=0; COL2=scan2; ROW1=changeleft(table2*i); ROW2=table2*i+1; COL1=0; COL2=scan2; delayshort(); scan2=1; if(temp=0) temp=0x20;void int_0()interrupt 0 delayshort(); if(P32=0) PA=0xB6; PB=0xd; PT0=1; PT
6、1=1; intflag=1; while(inttime=20) led16_16display(led2,32); inttime=1; intflag=0; PT0=0; PT1=0; PA=ewTabletongBu; PB=nsTabletongBu; void timer0()interrupt 1 TH0=()256; TL0=()%256; cnt+; if(cnt=5) cnt=0; if(intflag=1) inttime+; tempseg=10-inttime2; else time+; if(timeallredend)&(timeewredend)&(timesn
7、yellowend)&(timesnredend)&(time=ewyellowend) if(change=0) tongBu=5; PA=ewTabletongBu; PB=nsTabletongBu; change=1; else tongBu=6; PA=ewTabletongBu; PB=nsTabletongBu; change=0; tempseg=ewstarter+10+allredend2+snstarter-(time+1)2; else tongBu=1; time=allredend+1; PA=ewTabletongBu; PB=nsTabletongBu; tem
8、pseg=ewstarter+allredend2-(time+1)2; void key() uchar keynum; keynum=(P1|0XF8); switch(keynum) case 0x1: while(KEY1=0)led16_16display(led2,32); key1+; TR0=0; if(key1=3) key1=0; TR0=1; break; case 0x2: while(KEY2=0)led16_16display(led2,32); if(key1=1) ewstarter+; if(ewstarter=100) ewstarter=0; if(key
9、1=2) snstarter+; if(snstarter=100) snstarter=0; break; case 0x4: 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; void main() IE=0x8b; IT0=1; TMOD=0x11; TH0=()256; TL0=()%256; TH1=()256; TL1=()%256; CTL=0x80; tongBu=0; TR1=1; PA=ewTabletongBu; PB=nsTabletongBu; tempseg=allredend2-(time+1)2; TR0=1; while(1) key(); if(intflag=0) if(key1=0) if(timeallredend×nyellowend&time=ewyellowend) led16_16display(led2,32); else led16_16display(led2,32);