51单片机综合实验交通灯设计报告
班 级:
学 生 姓 名:
学 号:
指 导 教 师:
一 实验题目
交通灯控制系统设计
二 实验目的
1、学会用8051单片机开发简单的计算机控制系统;
2、学会用汇编语言和C语言开发系统软件;
3、学会8051单片机开发环境wave或Keil uVision3软件的使用;
4、学会Proteus软件的使用方法,会用Proteus单片机系统进行仿真;
5、学会Protel软件的使用方法,会用Protel绘制电气原理图和印制板图;
6、熟悉七位数码管显示的使用方法;
7、了解交通灯控制系统的基本组成。
三 实验要求
交通灯处在十字路口上。它有红﹑黄﹑绿三种颜色的灯组成。红灯亮时道路上的车辆停止运行;黄灯是一种过渡用的信号灯,当它亮时,表示道路上的红绿色信号灯即将进行转换。下面拿东西南北四个方向来说明。当东西方向允许行车(或者左转)的时候,南北方向就禁止行车,即此时东西方向的绿灯亮红灯灭,而南北方向的绿灯灭红灯亮。反之当南北方向允许行车(或者左转)的时候,东西方向就禁止行车,即此时南北方向的绿灯亮红灯灭,而东西方向的绿灯灭红灯亮。交通灯配置示意图如图1所示。同时当有特殊的情况发生时,能手动控制各个方向的信号灯。设计任务就是将这一电路用单片机来实现具体的控制。
图1 十字路口交通灯配置示意图
四设计内容与原理
为了在后面的分析中便于说明,将南北方向允许直行命名为状态1,南北方向允许左转命名为状态2,南北方向行车到东西方向行车的转换阶段命名为状态3,将东西方向允许直行命名为状态4,东西方向允许左转命名为状态5,东西方向行车到南北方向方向行车的转换阶段命名为状态6。
假定直行绿灯点亮的时间为25s,左转绿灯点亮的时间为20s,黄灯点亮的时间为5s,则对方红灯的点亮时间为50秒。黄灯每隔500ms亮一次,之后灭500ms(亮灭一次叫作闪烁一次),一共闪烁5次,持续5s。各个状态之间的变换情况如下:
具体显示周期如下:
图2交通信号灯点亮时间图
设计电路中每个路口的控制信号灯应有四个,即绿灯两个、黄灯、红灯各一个,同时需要七段数码管一个。因此,本电路的设计中应用到绿灯八个,黄灯四个,红灯四个,七段数码管两个(东西方向相同,南北方向相同,为节省空间可省略一对)。
五 电路设计分析
根据前面的设计内容与原理分析,电路设计中应有控制模块(单片机电路)、显示模块(十六个信号灯和两个七段数码管)本电路的设计,将发光二极管作为16个信号灯的材料。电源将采用5V的直流电源。东西两个方向的绿灯是同时亮的,为了简化电路可以让这两个灯接同一个引脚。同理,东西方向的黄灯、红灯也可以分别接同一个引脚。南北方向同上。这样我们可以用一个8位口控制16盏信号灯。
各信号灯均是共阴极接法,LED负极均接地,正极通过保护电阻接单片机P1口。这样单片机引脚的输出一个高电平时,相应的信号灯就被点亮。七段数码管经过8位排阻RESPACK-8连接。
单片机中应包括复位电路和晶振电路。本设计中,采用上电复位形式,由于本系统应用的机器周期为lms,所以晶振选择为12MHz,根据调试电容选择30pF.
图3:复位电路
图4:晶振电路
六 硬件原理图
七程序流程
本程序的程序流程图如图所示
八心得体会
这次系统实验历时一个月的时间,在这实验过程里我们巩固了从编程、软件使用到调试的专业知识,逻辑思维和动手能力都得到了很大的提高。
要解决的主要问题就是程序的设计和仿真,虽然初期在设计和布局、编程时思路比较清晰,但是到了细节处,也出了不少问题,而且很难被检查出来,如在定时器使用方面出了一些错误。但是最后经过不断努力,还是写出来正确的代码。
通过这次系统实验,对以前学过的知识进行了巩固,加深了理解,提高了应用的能力,而且提高了我们的发现、分析、解决问题的能力,同时提高了对专业的认识及兴趣,对于我们工科生来说,对以后就业很有帮助。
附录 程序代码:
#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
/*****定义控制位**********************/
sbit EW_LED2=P2^3; //东西数码管个位
sbit EW_LED1=P2^2; //东西数码管十位
sbit SN_LED2=P2^1; //南北数码管个位
sbit SN_LED1=P2^0; //南北数码管十位_
sbit SN_Yellow=P1^6;//南北黄灯
sbit EW_Yellow=P1^2;//东西黄灯
sbit EW_Red=P1^3;//东西红灯
sbit SN_Red=P1^7;//南北红灯
sbit Busy_Btton=P3^4;
bit Flag_SN_Yellow; //南北黄灯标志位
bit Flag_EW_Yellow;//东西黄灯标志位
char Time_EW;//东西方向倒计时单元
char Time_SN;//南北方向倒计时单元
uchar EW=50,SN=25,EWL=20,SNL=20; //程序初始化赋值
uchar EW1=50,SN1=25,EWL1=20,SNL1=20;//用于存放修改值的变量1-9段选码
uchar
code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码
/**********************延时子程序************************/
void Delay(uchar a)
{
uchar i;
i=a;
while(i--){;}
}
/*****************显示子函数**************************/
void Display(void)
{
char h,l;
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];
EW_LED2=1;
Delay(200);
EW_LED2=0;
P0=table[h];
EW_LED1=1;
Delay(200);
EW_LED1=0;
h=Time_SN/10;
l=Time_SN%10;
P0=table[l];
SN_LED2=1;
Delay(200);
SN_LED2=0;
P0=table[h];
SN_LED1=1;
Delay(200);
SN_LED1=0;
}
/**********************T0中断服务程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//南北黄灯标志位
{ Time_SN=Time_EW;
{
SN_Yellow=~SN_Yellow;}
}
if(Flag_EW_Yellow==1)//东西黄灯标志位
{ Time_EW=Time_SN;
{
EW_Yellow=~EW_Yellow;
}
}
count=0;
}
}
void main(void)
{
IT0=1; //INT0负跳变触发
TMOD=0x01;//定时器工作于方式1
TH0=(65536-50000)/256;//定时器赋初值
TL0=(65536-50000)%256;
EA=1; //开中断总允许
ET0=1;//开定时中断
EX0=1;//开外部INTO中断
TR0=1;//启动定时
while(1)
{ /*******状态1**********/
Flag_EW_Yellow=0; //EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>0)
{P1=S[0]; //SN通行,EW红灯
Display();}
/*******状态2**********/
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_SN=SNL;
while(Time_SN>0)
{P1=S[2];//SN左拐绿灯亮,EW红灯
Display();}
/*******状态3**********/
P1=0x00;
while(Time_EW>0)
{Flag_SN_Yellow=1; //SN开黄灯信号位
EW_Red=1; //SN黄灯亮,等待停止信号,EW红灯
//SN_LED1=EW_LED1;
//SN_LED2=EW_LED2;
Display();
}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
/*******状态4**********/
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_EW=SN;
Time_SN=EW;
while(Time_EW>0)
{P1=S[4]; //EW通行,SN红灯
Display();}
/*******状态5**********/
Flag_EW_Yellow=0; //EW关黄灯显示信号
Time_EW=EWL;
while(Time_EW>0)
{P1=S[6];//EW左拐绿灯亮,SN红灯
Display();}
/*******状态6**********/
P1=0X00;
while(Time_SN>0)
{Flag_EW_Yellow=1; //EN开黄灯信号位
SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯
Display();}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
}
}
第二篇:基于51单片机控制交通灯课程设计报告
基于51单片机控制交通灯课程设计报告
本设计课程使用STC89c52型号的芯片及相关元器件自己组装单片机最小系统,并编写程序用于控制交通信号灯。
1.STC89c52的芯片元器件的说明:
STC89c52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,STC89c52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能,STC89c52在众多嵌入式控制应用系统中得到广泛应用。
2.STC89c52的功能是:
3.管脚说明
VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口作为AT89C51的一些特殊功能口,管脚 备选功能
P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(计时器0外部输入) P3.5 T1(计时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
4 候黄灯没有闪,后来经过老师的指点和帮助我们修改了一下延时程序就成功的实现了延时提醒的功能。
5源程序代码:
#include <reg52.h>
sbit NBgreen_a=P1^0;//南北绿灯
sbit NByellow_a=P1^1;//南北黄灯
sbit NBred_a=P1^2;//南北红灯
sbit DXgreen_b=P1^3;//东西绿灯
sbit DXyellow_b=P1^4;//东西黄灯
sbit DXred_b=P1^5;//东西红灯
void delay(unsigned int a)
{
while(- -a!=0)
{
unsigned char i;
for(i=0;i<125;i++);
{;}
}
}
void main(void)
{ unsigned int k;
while(1)
{
NBgreen_a=0; NByellow_a=1; NBred_a=1;//南北绿灯亮10s
DXgreen_b=1; DXyellow_b=1; DXred_b=0;//东西红灯亮10s
delay(10000);
NBgreen_a=1;
DXred_b=1;
for(k=0;k<3;k++)
{
NByellow_a=0;
DXyellow_b=0;
delay(1000);
NByellow_a=1;//南北黄灯闪3s
DXyellow_b=1;//东西黄灯闪3s
delay(1000);
}
NBgreen_a=1; NByellow_a=1; NBred_a=0;//南北红灯亮10s
DXgreen_b=0; DXyellow_b=1; DXred_b=1;//东西绿灯亮10s
delay(10000);
DXgreen_b=1;
NBred_a=1;
for(k=0;k<3;k++)
{NByellow_a=0;
DXyellow_b=0;
delay(1000);
NByellow_a=1;//南北黄灯闪3s
DXyellow_b=1;//东西黄灯闪3s
delay(1000);
}
}
}
6.这次单片机大作业让我们设计一个利用单片机最小系统控制交通灯,让我加深了对单片机的认识,特别是内部资源的理解与应用。也让我的C语言编程技术更加熟练,另外就是提高了发现问题,分析问题,解决问题的能力,同时也让我体会到了团结协作的重要性。
7.流程图:
8.单片机实验要求的是一种思维的创新,而不是简单的重复老师所说的实验步骤。因此第一次实验,实验老师向我们讲解了keil编译器的大体情况及使用方法和技巧,并简单的向我们示例——如何在keil中编写一段程序。编完程序之后,知道我们如何使用stc达到将编好的程序输入到单片机中来使其运行。
之后老师让我们以组为单位合作编写一段程序,并使其运行。我们组想要编写一个交通灯的程序。在第一次运行keil,我们组就遇到了一个麻烦,我们在建立一个新project文件那里出现了错误。在保存这个新project文件的时候,我们单击了Save,而不是Generate, Save and Exit.因此它弹不出我们我们所需要的源程序。之后我们通过询问其他人解决了这个问题。在编程中,我们开始做的是6灯的控制,间隔时间是1000ms。
经过我们的不断努力,我们终于实现了简单的交通控制灯的运行,我们感到兴奋极了。但是我们并没有满足于当前,我们又编写了两个交通灯的控制。当我们一步步实现我们的目的时,我得到莫大成就感和自信。
在这次实验中,我体会到了合作的重要性。一个人也可能实现这一系列的过程,但是要花费很多精力和时间。群策群力,分工明确,可以使我们更好、更快地完成我们的工作。在此期间,你可以更好知道自己的不足和缺陷,来得到改正。还可以知道自己的优势所在,把握好自己的优势。