1、单片机综合实验报告之模拟交通灯设计(此文档为word格式,下载后您可任意编辑修改!)单片机综合实验报告题 目: 模拟真实交通灯 班 级: 姓 名: 学 号: 指导老师: 2014 年 6 月 13 日一、实验内容:用8255芯片的PA、PB口低四位做输出口,控制十二个发光二极管燃灭,模拟十字路口交通灯管理,并利用数码显示器进行倒计时显示(采用单片机内部定时器定时)。通过外部中断能使交通灯暂停运行,并点亮4个红灯。通过16*16点阵中的图形模拟控制行人过马路的人形“走”、“停”指示灯,可参考下图所示:利用实验系统1616点阵实验单元,以两种方式控制点阵显示。要求编制程序实现汉字点阵循环显示。I/
2、O口地址分配 I/O口分别提供字形代码(列码)、扫描信号(行码),凡字形代码位为“1”、行扫描信号为“1”点亮该点,否则熄灭;通过逐行扫描循环点亮字形或曲线。二、实验电路及功能说明8255与发光二极管连线图数码LED显示器电路1616LED点阵显示电路实验原理图三、实验程序流程图:主程序:四、实验结果分析通过程序仿真,可以检测设计的电路能基本满足设计要求。交通灯亮灭过程同“8255控制交通灯实验”,倒计时显示只需两位数(099),用定时器定时进行倒计时,每秒钟减1。在16*16点阵中显示的人形“走”、“停”标志可自定义。 五、心得体会我们通过作这个单片机实验,我们总结了一下点:1、 加深了对5
3、1单片机的理解,不仅仅是以前那样只能点亮发光二极管。2、 感受到了完成一件程序的乐趣,并且知道了实践精神。3、 理解了51单片机的强大和我们知识的肤浅。4、 学到了许多原来C语言中没有的东西,如:控制按键的程序 While(P0_5=1) Time+; While(P0_5=1); 这样可以不加防按键抖动的延时程序,更精确时间。 5、进一步充分利用中断时刻都在运行,让时间在中断中显示,就不会出现进入死循环后而无法显示时间的情况,而且还可以快速的反映除时间的变化。六、程序清单#include #include #define uchar unsigned char#define uint uns
4、igned int#define ROW1 XBYTE0XFFE3#define ROW2 XBYTE0XFFE0#define COL1 XBYTE0XFFE2#define COL2 XBYTE0XFFE1#define PA XBYTE0xffd8#define PB XBYTE0xffd9#define CTL XBYTE0xffdb#define SEG XBYTE0xffdc#define BIT XBYTE0xffdd#define allredend 10#define ewredend 2*ewstarter+allredend#define snyellowend ewre
5、dend+10#define snredend snyellowend+2*snstarter#define ewyellowend snredend+10sbit KEY1=P10;sbit KEY2=P11;sbit KEY3=P12;sbit P32=P32;uchar tongBu;uchar code ewTable=0xb6,0x75,0xf3,0xf7,0xae,0x9e,0xbe;uchar code nsTable=0xd,0xd,0xc,0xd,0xb,0x7,0xf;/uchar tempa,tempb;int time=1,cnt,change,intflag,intt
6、ime=1,ewstarter=10,snstarter=15;int tempseg;uchar key1=0;uchar buffer=;uchar table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff;/*- 行走 -*/*- 宽度x高度=16x16 -*/uchar code led1=0x01,0x80,0x02,0x40,0x02,0x40,0x01,0x80,0x03,0xC0,0x06,0x60,0x0A,0x50,0x0A,0x50,0x0B,0xD0,0x12,0x48,0x02,0x40,0x02,0x6
7、0,0x04,0x20,0x04,0x20,0x08,0x20,0x18,0x60;/*- 停止 -*/*- 宽度x高度=16x16 -*/uchar code led2=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 -ucha
8、r code led2=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;*/void delayshort() char n; for(n=50;n0;n-);uchar changeleft(uchar led) uchar temp; temp=0; temp|=(led7)&0x80; temp|=(led5)&0x40
9、; 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=length/2,scan1=0x1,scan2=0x1; for(i=0;i16;i+) if(i8) ROW1=0; ROW2=0; COL1=scan1; COL2=0; ROW1=changeleft(table2*i); ROW2=table2*i+1; C
10、OL1=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; PT1=1; intflag=1; while(inttime=20) l
11、ed16_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-inttime/2; else time+; if(timeallredend)&(timeewredend)&(timesnyellowend)&(timesnredend)&(time=e
12、wyellowend) if(change=0) tongBu=5; PA=ewTabletongBu; PB=nsTabletongBu; change=1; else tongBu=6; PA=ewTabletongBu; PB=nsTabletongBu; change=0; tempseg=ewstarter+10+allredend/2+snstarter-(time+1)/2; else tongBu=1; time=allredend+1; PA=ewTabletongBu; PB=nsTabletongBu; tempseg=ewstarter+allredend/2-(tim
13、e+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(key1=2) snstarter+; if(snstarter
14、=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=allredend/2-(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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1