系统的功能
(1)自动报站功能:当车辆到达某一停车站点时,系统自动报站,无需手动按键。
(2)自动考核功能:自动记录车辆中途停车的时间和行驶的里程数,自动记录超速、低速行驶的时间和里程数。
(3)显示时间功能。
3、系统设计原理
公交车较一般车辆有个明显的特点,就是它行驶的路线固定,从起点到终点中途经过的站、路口也是固定的。因此,从起点到任一站、任一路口的距离是相对不变的,任意两站之间、路口之间以及站与路口之间的距离也是不变的。我们利用这一特点,首先把从始发站出发的公交车到达每一站、每一路口行驶的里程数(确切地说是一个范围,即经过反复试验,得到的到达某站或路口的数据范围)记录在系统中,公交车在实际运行中,如果行驶的里程达到某某范围(范围的最低值),则自动报站(包括提示是路口等等),此即实现了自动报站功能。对于自动考核中的超速、低速的判断,只需在系统中设置一计数器(计算车轮转过的圈数),用单位时间内车轮转过的圈数来判断车速超、低速情况,同时将超、低速时的时间和行驶的里程数记录在系统中。这样,在车辆回到总站后,只要读取系统内部的数据,就可以知道车辆在运行途中的停靠站及超、低速行驶情况。对于车辆停车时间的记录,实现的方法是在车辆停止转动时就开始计时,在车轮开始转动时停止计时,并将计时时间保存在系统中。由于车辆停车时间的长短和停车时的时间都被记录下来,就可以杜绝一些公交车在站点延时拉客以及未到达站点就中途停车拉客的现象。这里要说明的是:所谓里程数=车轮转数车轮周长。
4、系统硬件设计
该系统硬件设计按功能模块划分,可分为四部分:最小系统、显示部分电路、计数部分电路和语音电路。下面结合每一个功能模块,来介绍一下如何用单片机来实现公交车辆的自动考核与报站。
(一)最小系统
最小系统由89C51、RAM、锁存器、时钟电路、复位电路五部分组成。这是该系统的核心,所有的指令都是由89C51发出的。
RAM:由于车辆在行驶过程中需要记录大量的数据,比如车辆中途停车的时间、慢速行驶的时间、超速的时间等等,而89C51内部只有256B的数据存储器RAM,其中128B用户可以使用,数据容量根本无法满足系统的需要,故须外接RAM。
锁存器:89C51虽然有P0、P1、P2、P3四个八位的I/O口,但是只有P0口能够直接用于对外部存储器的读/写 *** 作,而P0口还要输出外部存储器的低8位地址(高8位地址直接由89C51的P2口输出)。为了避免数据和地址的信号冲突,这时候就需要在89C51和RAM之间加上一锁存器(实验中采用74LS373),从而使数据与地址分时输出。
时钟电路:系统要稳定的工作必须有可靠的时钟。本系统采用内部时钟方式,外接6MHZ的晶振,晶振和电容(15P)组成并联谐振荡回路,从而使89C51内部的电路产生自振荡。
复位电路:即在89C51的RESET端出现一保持10ms的高电平时,单片机复位。系统将手动复位和上电复位结合在一起。
(二)显示部分电路
显示部分主要是显示时间的。在该系统设计中,由于89C51本身自带的并行口有限,故在系统中采用8155对并行口进行扩展。我们用8155PB口输出段码(即待显示的数据),利用8155PA口的低四位(PA0、PA1、PA2、PA3),经过一个74LS154(四—十六译码器)译码后产生16个位选信号,某一位选信号有效,与之相对应的LED灯即被点亮。我们在此采用的是动态显示方式,该方式较静态显示方式的明显优点即其占用的I/O口资源少,从而不必再对89C51进行I/O口扩展。
(三)计数部分电路
车辆在运行过程中,我们如何计算车辆行驶的里程,如何判断车辆超速、低速,这些都是通过计数部分电路来实现的。我们只要记录下车轮的转数,然后用它乘以车轮周长就可以得到车辆行驶的里程数。而对于车速,设定系统以某一固定时间间隔(比如5秒)来采集计数值(即车辆转数),用这一数值乘以车轮周长得出车辆行驶的里程,再除以时间从而得到车速,这样我们就可以判断车辆的超速、低速情况了。其实计数电路非常简单,它仅仅利用到89C51的外部中断INT0,每当此引脚有下跳沿信号,计数器即加1(系统中采用16位计数器,最大计数值可达到65535)。在进行实验的过程中,我们发现,模拟车轮产生的脉冲干扰很大,采用软件延时,效果不甚理想,而且影响到显示(用以显示的LED灯产生明显的抖动),故想到在INT0端采用硬件延时。而RS触发器在此方面有良好的特性,因此在INT0引脚与产生脉冲的车轮之间加上一RS触发器。
(四)语音部分电路
自动考核与报站系统的报站功能主要是由语音部分电路来实现的。实验中我们使用的语音芯片为ISD4002-120P,该芯片的存储时间仅为120秒,只可用于实验室阶段,实际应用中可以更换存储时间长的芯片。由于车辆在运行途中,只需报站,而无需录音,故我们采用图1所示电路对语音芯片进行录音。
图1 语音录放电路
开关在“REC”端是录音状态,按住“AN”键不放,指示灯亮即可对着话筒讲话录音,松键录音停止并形成一段。再按则录下一段。按“STOP”键复位,再录音时又从第一段开始。开关在“PLAY”一侧是放音状态,按一下“AN”即播放一段录音,一段结束后自动停止放音,再按“AN”键则播放下一段。
把录好的芯片放到系统中,当车辆行驶的里程数达到某一段范围时,我们利用语音芯片的快进功能,跳到相应的语音段开始放音从而实现自动报站。
5、系统软件设计
系统软件采用模块化结构,主要由主程序、计数中断子程序、时间中断子程序等级成。下面列出了主程序流程图(如图2)和计数中断子程序流程图(如图 3):
6、结束语
总的看来,本系统采用了一种比较新颖的思路,用单片机来实现公交车辆的自动考核和报站。能够对公交车辆进行有效的管理,投入市场的前景较好。在实际运用的时候,可以在系统中扩展键盘,以防止公交车行驶路线发生变化以及出现一些异常情况时,改用键盘控制报站。
司机方向盘附件有个带按钮的盒子,一般都是车快到站的时候,司机事先按的报站器。如果是智能公交,提示还有几站到的那种,是通过信号(射频或移动基站)的发送与接收来,在车上和每个站台上分布装有发射器和接收器,来提前报站的
#include "reg51h"
unsigned char data cnt_distance;
unsigned int data D_cnt;
sbit led = P3^7;
sbit add = P1^0;
sbit dec = P1^1;
bit flag;
char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//led_seg_code[0-9]代表0-9
//-------延时-----------------
void delay(unsigned int i)//延时
{ while(--i); }
//-------初始化变量------------------
void init_variant() //初始化一些变量的内容
{
//unsigned char i;
D_cnt=0; //脉冲的个数
cnt_distance=0; //距离的计数
}
//-------数码管动态扫描-------------
void led_show()
{
unsigned char i,k;
//-----显示距离------
k=cnt_distance; //k = 34;
i=k/10; //暂存百位
P0=led_seg_code[i];
P2&=0xfe;
delay(100);
P2 = 0XFF;
i=k%10;
P0=led_seg_code[i];
P2&=0xfd;
delay(100);
P2 = 0XFF;
}
//----------中断计数-----------
/
void init0() interrupt 0
{
if(D_cnt<=5) D_cnt++; //计数100次,每次10米,表示一公里
else
{
D_cnt=0;
cnt_distance=cnt_distance+1;
if(cnt_distance >= 34)cnt_distance = 0;
}
}
/
/
void init0() interrupt 0
{
D_cnt++;
if(D_cnt>=5) //计数100次,每次10米,表示一公里
{
D_cnt=0;
cnt_distance=cnt_distance+1;
if(cnt_distance >= 34)cnt_distance = 0;
}
}
/
void caled()
{
led = 0;
delay(5000);
led = 1;
delay(5000);
}
void keyscan()
{
if(add == 0)
{
delay(10000);
if(add == 0)
{
while(!add);
cnt_distance++;
}
}
if(dec == 0)
{
delay(10000);
if(dec == 0)
{
while(!dec);
cnt_distance--;
}
}
}
//---------主程序----------------
void main()
{//初始化各变量
init_variant();
//初始化51的寄存器
TMOD=0x20; //用T1计时 8位自动装载定时模式,不用T0
TH1=0x19; //250微秒溢出一次; 250=(256-x)12/110592 -> x= 2304
TL1=0x19;
EA=1; //开中断
//EX0 = 1; //开外部中断0
ET1=1;
IT0=1;
TR1=0; //定时器T1
P1 = 0xff;
flag = 0;
while(1)
{
keyscan();
if(IE0==1) //每来1个脉冲,中断一次
{
IE0=0;
D_cnt++;
if(D_cnt>=10) //计数100次,每次10米,表示一公里
{
D_cnt=0;
caled();
caled();
caled();
caled();
if(cnt_distance >= 34)flag = 1;
if(flag==0)cnt_distance=cnt_distance+1;
if(flag == 1)
{
-- cnt_distance;
if(cnt_distance<=0)flag = 0;
}
}
}
led_show();
}
}
//-----公交车自动报站程序结束------------
#include“reg51h”
unsigned char data cnt_distance;
无符号int数据D_cnt;
sbit led = P3 ^ 7;
sbit add = P1 ^ 0;
sbit dec = P1 ^ 1;
位标志
char code led_seg_code [10] = {0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// led_seg_code [0-9]代表0-9
// -------延时-----------------
void delay(unsigned int i)//延时
{ 当我); }
// -------初始化变量------------------
void init_variant()//初始化一些变量的内容
{
// unsigned char i;
D_CNT = 0; //脉冲的个数
cnt_distance = 0; //距离的计数
}
// -------数码管动态扫描-------------
void led_show()
{
unsigned char i,k;
// -----显示距离------
K = cnt_distance; // k = 34;
I = K / 10; //暂存百位
P0 = led_seg_code [I];
P2&= 0xFE的;
延迟(100);
P2 = 0XFF;
我= K%10;
P0 = led_seg_code [I];
P2&= 0xfd;
延迟(100);
P2 = 0XFF;
}
// ----------中断计数-----------
/
void init0()interrupt 0
{
if(D_cnt <= 5)D_cnt ++; //计数100次,每次10米,表示一公里
其他
{
D_CNT = 0;
cnt_distance = cnt_distance + 1;
if(cnt_distance> = 34)cnt_distance = 0;
}
}
/
/
void init0()interrupt 0
{
D_CNT ++;
if(D_cnt> = 5)//计数100次,每次10米,表示一公里
{
D_CNT = 0;
cnt_distance = cnt_distance + 1;
if(cnt_distance> = 34)cnt_distance = 0;
}
}
/
void caled()
{
led = 0;
延迟(5000);
led = 1;
延迟(5000);
}
void keyscan()
{
if(add == 0)
{
延迟(10000);
if(add == 0)
{
而(加!);
cnt_distance ++;
}
}
if(dec == 0)
{
延迟(10000);
if(dec == 0)
{
而(DEC!);
cnt_distance--;
}
}
}
// ---------主程序----------------
void main()
{//初始化各变量
init_variant();
//初始化51的寄存器
TMOD = 0×20; //用T1计时8位自动装载定时模式,不用T0
TH1 = 0x19; // 250微秒溢出一次; 250 =(256-x) 12 / 110592→x = 2304
TL1 = 0x19;
EA = 1; //开中断
// EX0 = 1; //开外部中断0
ET1 = 1;
IT0 = 1;
TR1 = 0; //定时器T1
P1 = 0xff;
flag = 0;
而(1)
{
键扫描();
if(IE0 == 1)//每来1个脉冲,中断一次
{
IE0 = 0;
D_CNT ++;
if(D_cnt> = 10)//计数100次,每次10米,表示一公里
{
D_CNT = 0;
caled();
caled();
caled();
caled();
if(cnt_distance> = 34)flag = 1;
如果(标志== 0)cnt_distance = cnt_distance + 1;
if(flag == 1)
{
- cnt_distance;
if(cnt_distance <= 0)flag = 0;
}
}
}
led_show();
}
}
// -----公交车自动报站程序结束------------
公交车自动报站一般基于GPS、Wi-Fi、RFID等技术,首先对站台进行识别,确定公交车的位置,与设定在机器内部的站台名称坐标进行对比,经过软件、硬件控制转换后根据站台触发不同的语音,进行报站。
智能公交报站器是基于全球卫星定位系统,实现公交车自动报站,而不需要人工 *** 作。GPS报站器将公交线路每个站点坐标存储在报站器中,当公交车进入坐标范围就会自动预报该站的站名,当公交车驶出站点坐标预设的范围就会预报下一站的站名。
以上就是关于公交车系统的自动报站和考核全部的内容,包括:公交车系统的自动报站和考核、公交车是如何自动报站的什么原理、谁能帮忙翻译一下C语言,公交车报站器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)