自学内容网 自学内容网

C51交通控制系统的设计与实现

实验要求:

本题目拟设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模拟交通灯信号;(2)灵活控制主、辅干道交通指示灯的显示时间;(3)设计交通灯控制系统硬件电路;(4)运用C51语言完成对控制系统的软件编程。

一、需求分析

1.1   实验背景

随着科技的快速发展,时间的流逝,单片机技术的应用产品已经走进了千家万户。计算器给人们日常生活中的计算带来了许多方便。随着微电子技术的高速发展,单片机已经在国民经济的个人领域得到了广泛的应用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理等各种测控领域的应用中独占鳌头、单片机开发技术已成为电子信息、电气、通信、自动化等专业技术人员必须掌握的技术。

单片机单芯片的微小体积和低的成本,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子系统、工业控制单元、办公自动化设备、金融电子系统、舰船、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具,于是基于单片机的计算器也顺应而生。基于单片机的计算器用按键来模拟数字、运算符的输入,从而得出结果送给显示设备显示出来,方便人们的生活。

1.2   问题描述

设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。用Proteus软件进行仿真,实现此次功能。

 1.3    基本要求

1.  完成的形式

(1)  熟悉设计题目内容、查找相关资料。

(2)  确定系统的总体设计方案。

(3)  编写语言代码,并调试。

(4)  Proteus模拟实现交通灯控制

二、 概要设计

2.1     设计方案

2.1.1交通灯四种通行模式及行车方向指示

  1.  按照简单的交通路口规则,有四种模式

南北绿灯亮 东西红灯亮;

南北黄灯闪 东西红灯亮;

南北红灯亮 东西绿灯亮;

南北红灯亮 东西黄灯闪;

 2.2    程序流程图

                                                               程序流程图

2.3   模块功能

2.3.1   信号灯显示模块由于南北方向的信号灯始终是同一种状态,所以南北信号灯为一组,只需将对应的信号灯并联即可,东西方向同理。

2.3.2   倒计时显示模块

选取8个7段数码管分别模拟显示四个方向的倒计时,数码管采用共阴极接法。

为了提高P0、P2端口的电流输出能力,保证数码管亮度,保护端口引脚,在P0端口与数码管之间增加了74LS245芯片。

2.3.3   复位模块

此系统可以通过复位按键实现从新工作,电路图如图所示

三、详细设计

3.1   实验原理

3.1.1   外部中断原理

本系统主要使用了外部中断,中断信号有引脚INTO和INT1输入,低电平有效,CPU每个时钟周期都会检测INTO和INT1上的信号,AT89C51允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中ITO和IT1位的状态来实现。以ITO为例,ITO=0,为电平触发方式,ITO=1,为负边沿触发方式,本设计采用电平方式,IEO为其中断标志位,有中断信号则置位,中断服务子程序响应后,IEO自动清零。IE中的EA为允许中断的总控制位,为1开启,EXO为外部中断允许控制位,为1开启。

在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断服务子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。

3.1.2  软件延时原理

MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12∗(1/12MHZ)=1us。我们可以知道具体每条指令的周期数这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速很快其他的指令执行时间可以忽略不计。

3.1.3  数码管显示原理

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

3.2   设计思路

(1)利用仿真软件绘制仿真实例

   1.用 traffic light 和一个led灯表示红、黄、绿的信号灯。

   2.用p0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。

   3.p3.6和p3.7接收中断信号并返回给INT0接口处理。

 (2)利用keil软件按要求编写程序实现相应功能。

3.3   主要程序编写

#include <reg51.h>
#defineucharunsigned char
#defineuintunsigned int


sbitSN_LED2=P2^3;//SN_LED2控制位
sbitSN_LED1=P2^2;//SN_LED1控制位
sbitEW_LED2=P2^1;//EW_LED2控制位
sbitEW_LED1=P2^0;//EW_LED1控制位

sbit  EW_Yellow=P1^6; //EW黄灯
sbit  EW_Red=P1^7;    //EW红灯
sbit  EW_Green=P1^5;  //EW绿灯
sbit  SN_Yellow=P1^2; //SN黄灯
sbit  SN_Red=P1^3;    //SN红灯
sbit  SN_Green=P1^1;  //SN绿灯

bit  Restore_flag=0;//恢复正常标志位
bit   Flag_EW_Yellow;     //EW黄灯标志位
bit   Flag_SN_Yellow;     //SN黄灯标志位
charTime_SN;  //南北方向倒计时单元
charTime_EW;  //东西方向倒计时单元
uchar SN=15,EW=20;     //程序初始化赋值       
uchar SN1=15,EW1=10;   //用于存放修改值的变量 
uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段选码
uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信号灯控制代码

/**********************延时子程序************************/
void delay_ms(uint x) //延时ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/*****************显示函数**************************/
void Display(void)
{
char h,l;
h=Time_SN/10;
l=Time_SN%10;
  P0=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;
  P0=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0;//南北方向数码管显示

h=Time_EW/10;
l=Time_EW%10;
P0=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;
  P0=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0;//东西方向数码管显示
} 


/**********************T0中断服务程序*******************/
void timer0()  interrupt 1 
{
static uchar count; //count为静态变量初值为0
TL0 = 0xB0;  //重赋定时初值50ms
TH0 = 0x3C; //重赋定时初值50ms
count++; //计数
if(count==10)   //加快闪烁速度
{
  if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  {EW_Yellow=~EW_Yellow;}//东西黄灯闪烁
  if(Flag_SN_Yellow==1)  //测试南北黄灯标志位
  {SN_Yellow=~SN_Yellow;}//南北黄灯闪烁
}
if(count==20) //20*50=1000ms=1S
{
Time_SN--; //南北方向倒计时
Time_EW--;   //东西方向倒计时
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
    {EW_Yellow=~EW_Yellow;}//东西黄灯闪烁
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
    {SN_Yellow=~SN_Yellow;}//南北黄灯闪烁
count=0;
}
}

/*********************主程序开始**********************/
void main(void)
{
/*********************中断初始化**********************/
IT0=1; //设置外部中断0触发方式(下降沿触发)
EX0=1; //打开外部中断0的IE寄存器中断
EA=1;   //CPU开中断总允许
ET0=1; //开定时中断
TMOD=0x01; //定时器工作于方式1
TL0 = 0xB0;  //设置定时初值50ms
TH0 = 0x3C;           //设置定时初值50ms
TF0 = 0;             //清除TF0标志
TR0 = 1;             //定时器0开始计时
while(1)
{
if(Restore_flag)
break;
/*******S1状态(南北直行状态)**********/
Time_SN=SN;//南北数码管赋值10s
Time_EW=EW;//东西数码管赋值15s
  while(Time_EW>=6)//东西方向倒计时前10s循环体
   {  
 Flag_EW_Yellow=0;  //南北关黄灯显示信号  
 P1=S[4]; //南北通行,东西红灯
 Display();  //调用显示函数
 if(Restore_flag)
 break;
 }
/*******S2状态(南北直行黄灯闪烁状态)**********/
    P1=0x00;//所有路口红绿灯短时熄灭
 if(Time_EW==5)//当东西倒计时为5s时
Time_SN=5;//南北重新从5s开始倒计时
  while(Time_EW>=1)//东西方向倒计时最后5s循环体
   {
 Flag_SN_Yellow=1;//南北开黄灯信号位
     EW_Red=1;//南北黄灯开始闪烁,东西红灯亮
     Display();//调用显示函数
 if(Restore_flag)
 break; 
   }
/***********赋值(南北通行变东西通行)**********/
SN=SN1;//南北10s-->15s
EW=EW1;//东西15s-->10s 
/*******S3状态(东西直行状态)**********/
Time_SN=SN;//南北数码管赋值15s
Time_EW=EW;//东西数码管赋值10s
   while(Time_SN>=6)//南北方向倒计时前10s循环体
    { 
Flag_SN_Yellow=0;  //南北关黄灯显示信号
P1=S[0]; //东西通行,南北红灯
      Display();  //调用显示函数
if(Restore_flag)
  break;
  }
/*******S4状态(东西直行黄灯闪烁状态)**********/
P1=0X00;     //所有路口红绿灯短时熄灭
if(Time_SN==5)//当南北倒计时为5s时
Time_EW=5;//东西重新从5s开始倒计时
while(Time_SN>=1)//南北方向倒计时最后5s循环体
   {
     Flag_EW_Yellow=1;  //东西开黄灯信号位
 SN_Red=1;            //东西黄灯开始闪烁,南北红灯亮
     Display();    //调用显示函数
 if(Restore_flag)
 break; 
   }
  /***********赋值(东西通行变南北通行)**********/
  SN=EW1;//南北15s-->10s
EW=SN1;//东西10s-->15s 
}     

}
  • 四、测试与分析

 

4.1   仿真结果

首先焊接各个电路板,焊接完每个电路板以后,对电路板对的每个模块分别进行测试,以确保在整个系统焊接完能正常的工作。单独测试后,将2个电路板连接起来,进行最后的结果测试。

实验结果与预期相符:

                      

                            


原文地址:https://blog.csdn.net/2302_78279100/article/details/145156341

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!