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

单片机综合实验报告

题 目: 班 级:姓 名:学 号:指导老师:时 间: 模拟真实交通灯 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);

}

}

}


相关内容

  • 单片机课程设计要求及参考题目
  • <单片机原理与应用>课程设计要求 一.目的: 本课程设计是<单片机原理与应用>课程的综合.设计性实验,作为课堂教学和课内正常实验的补充和提高.通过对<单片机原理与应用>课程的学习,学生已初步掌握51单片机的基本原理,以及并行口.串行口.中断.定时等基本原理及应用, ...

  • 单片机应用实例
  • <单片机应用综合实训>指导书 上海师范大学信息与机电工程学院 <单片机应用综合实训>指导书 一.单片机应用综合实训的目的及意义 本综合实训是配合单片机课程的综合性实践环节,目的是使学生在掌握单片机基本知识的基础上加强动手实践及综合应用能力的培养,同时也是对教学内容做一定的扩充 ...

  • 单片机 交通灯实验报告
  • 2014级电气工程及其自动化单片机原理及应用课程设计 安徽农业大学经济技术学院 模拟电子技术课程设计报告书 课题名称 基于单片机的简易交通灯设计 姓 名 学 号 院.系.部 专 业 指导教师 机械工程系 电气工程及其自动化 邰清清 2016年 12 月 日 摘要 本设计是单片机控制的交通灯控制系统设 ...

  • LED小灯实验报告
  • led 流水灯的设计报告 课程名称: led流水灯设计 学 院: 大数据与信息工程学院 专 业: 姓 名: 学 号: 年 级: 任课教师: 一. 实验的背景和意义 单片机全称叫单片微型计算机,是一种集成在电路芯片,是采用大规模集成电路技术把 cpu 随机存储器ram .只读存储器rom .多种输入输 ...

  • 物联网专业人才培养方案
  • 湖北众友科技实业股份有限公司 物联网专业人才培养方案 目录 物联网专业人才培养方案...........................................3 一.行业背景及人才需求...........................................3 二.指导思想.. ...

  • 交通信号灯设计
  • 电气工程与自动化学院 课程设计报告 (嵌入式技术实践) 题 目:基于单片机原理的交 ___通信号灯设计___ 专业班级: ____ 学 号: __________ 学生姓名: __________ 指导老师: _____ 2012 年 7月4日 目 录 第一章 前言----------------- ...

  • 嵌入式实训报告
  • 成都航空职业技术学院 <嵌入式系统应用> 实训课程设计报告书设计题目:模拟交通灯系统设计 系班别:航空电子工程系级:XXXX 班专学业:应用电子技术号:XXXX 学生姓名:XXX 完成时间:年指导教师:XXXX 日 目录 第一章 第二章 2.1 2.2 2.3 2.4概述........ ...

  • 单片机课程标准
  • 山东电子职业技术学院 <单片机技术及应用> 课程标准 课程代码:03021038 适用专业:电子信息工程技术专业 编 者:电子信息工程技术专业教研室(单片机课程组) 课程负责人:栾秋平 审 核 人:栾秋平 编制单位:山东电子职业技术学院电子工程系(部) 合作单位:积成电子股份有限公司 编 ...

  • 1单片机实训总结报告
  • 单片机实训总结 为了锻炼学生的动手能力及激发学生的创新能力,我们班于第十五周在单片机实验室迚行了单片机实训.在实训过程中首先我们要明确实训目的: 1熟悉单片机应用系统的开发.研制过程. 2.能运用MCS-51单片机迚行简单的单片机应用系统的硬件设计. 3.能采用MCS-51单片机汇编语言迚行简单的单 ...