单片机综合实验报告
题 目: 班 级:姓 名:学 号:指导老师:时 间: 模拟真实交通灯 0308405
一、实验内容:
用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
#define uchar unsigned char #define uint unsigned int
#define ROW1 XBYTE[0XFFE3] #define ROW2 XBYTE[0XFFE0] #define COL1 XBYTE[0XFFE2] #define COL2 XBYTE[0XFFE1] #define PA XBYTE[0xffd8] #define PB XBYTE[0xffd9] #define CTL XBYTE[0xffdb] #define SEG XBYTE[0xffdc] #define BIT XBYTE[0xffdd] #define allredend 10
#define ewredend 2*ewstarter+allredend #define snyellowend ewredend+10
#define snredend snyellowend+2*snstarter #define ewyellowend snredend+10
sbit KEY1=P1^0; sbit KEY2=P1^1; sbit KEY3=P1^2; sbit P32=P3^2; 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,inttime=1,ewstarter=10,snstarter=15; int tempseg; uchar key1=0;
uchar buffer[]={0,0,0,0,0,0};
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,0x60,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 --
uchar 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;n>0;n--); }
uchar changeleft(uchar led) { uchar temp; temp=0; temp|=(led>1)&0x08; temp|=(led>>3)&0x04; temp|=(led>>5)&0x02; temp|=(led>>7)&0x01; return(temp); }
void led16_16display(uchar *table,uchar length)
{ uchar i=length/2,scan1=0x1,scan2=0x1; for(i=0;i
void changeseg() { 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; } else if(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; } }
void timer1()interrupt 3 { static uchar temp=0x20,cnt1; TH1=(65536-1000)/256; TL1=(65536-1000)%256; changeseg(); SEG=0xff; SEG=table[buffer[cnt1]]; cnt1++; if(cnt1==6) cnt1=0; BIT=temp; temp>>=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
PT0=0; PT1=0; PA=ewTable[tongBu]; PB=nsTable[tongBu]; } }
void timer0()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; cnt++; if(cnt==5) { cnt=0; if(intflag==1) { inttime++; tempseg=10-inttime/2; } else { time++; if(timeallredend)&&(timeewredend)&&(time
{ tongBu=3; PA=ewTable[tongBu]; PB=nsTable[tongBu]; change=0; } } } }
void key() {
tempseg=ewstarter+allredend/2+5-(time+1)/2; }
else if((time>snyellowend)&&(time
else if((time>snredend)&&(time
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==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=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%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
led16_16display(led2,32);
else if(time>allredend&&time
else if(time>snyellowend&&time
}
else
led16_16display(led2,32);
}
}
}
单片机综合实验报告
题 目: 班 级:姓 名:学 号:指导老师:时 间: 模拟真实交通灯 0308405
一、实验内容:
用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
#define uchar unsigned char #define uint unsigned int
#define ROW1 XBYTE[0XFFE3] #define ROW2 XBYTE[0XFFE0] #define COL1 XBYTE[0XFFE2] #define COL2 XBYTE[0XFFE1] #define PA XBYTE[0xffd8] #define PB XBYTE[0xffd9] #define CTL XBYTE[0xffdb] #define SEG XBYTE[0xffdc] #define BIT XBYTE[0xffdd] #define allredend 10
#define ewredend 2*ewstarter+allredend #define snyellowend ewredend+10
#define snredend snyellowend+2*snstarter #define ewyellowend snredend+10
sbit KEY1=P1^0; sbit KEY2=P1^1; sbit KEY3=P1^2; sbit P32=P3^2; 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,inttime=1,ewstarter=10,snstarter=15; int tempseg; uchar key1=0;
uchar buffer[]={0,0,0,0,0,0};
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,0x60,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 --
uchar 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;n>0;n--); }
uchar changeleft(uchar led) { uchar temp; temp=0; temp|=(led>1)&0x08; temp|=(led>>3)&0x04; temp|=(led>>5)&0x02; temp|=(led>>7)&0x01; return(temp); }
void led16_16display(uchar *table,uchar length)
{ uchar i=length/2,scan1=0x1,scan2=0x1; for(i=0;i
void changeseg() { 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; } else if(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; } }
void timer1()interrupt 3 { static uchar temp=0x20,cnt1; TH1=(65536-1000)/256; TL1=(65536-1000)%256; changeseg(); SEG=0xff; SEG=table[buffer[cnt1]]; cnt1++; if(cnt1==6) cnt1=0; BIT=temp; temp>>=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
PT0=0; PT1=0; PA=ewTable[tongBu]; PB=nsTable[tongBu]; } }
void timer0()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; cnt++; if(cnt==5) { cnt=0; if(intflag==1) { inttime++; tempseg=10-inttime/2; } else { time++; if(timeallredend)&&(timeewredend)&&(time
{ tongBu=3; PA=ewTable[tongBu]; PB=nsTable[tongBu]; change=0; } } } }
void key() {
tempseg=ewstarter+allredend/2+5-(time+1)/2; }
else if((time>snyellowend)&&(time
else if((time>snredend)&&(time
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==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=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%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
led16_16display(led2,32);
else if(time>allredend&&time
else if(time>snyellowend&&time
}
else
led16_16display(led2,32);
}
}
}