基于单片机的智能公交报站系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.程序设计
(1)主程序流程图
主程序主要涉及各个部分子程序的调用。程序初始化后,系统出现开机界面,液晶显示频显示下一站站名。本程序主要兼有两种控制方式:按键控制和GPS接收控制。程序接收到信息后语音将自动播报到站信息,液晶显示频显示下一站,下车的指示灯亮。选择NO,则是继续行车报站,选择YES,则停止行车,终止系统。主程序流程图4-1所示。
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增,画面不动
GotoXY(6,1); //初始定位
Print(p); //初始显示
delay();
reset=0; //语音芯片复位
delay();
delay();
delay();
reset=1;
P31=1;
send(); //GPS发射
TR0=1; //启动计数器
while(1)
{
Delay1ms(300);
switch(i)
{
case 0:{p=dis1;} break;
case 1:{p=dis2;} break;
case 2:{p=dis3;} break;
case 3:{p=dis4;} break;
case 4:{p=dis5;} break;
};
GotoXY(6,1); //数据指针定位
Print(p); //显示
图1:整体框架结构图
2.单片机和语音芯片的选择
基于AT89C51单片机设计
语音芯片ISD1700S
3.系统的硬件设计
系统硬件电路主要包括按键电路,JHD162A液晶显示电路,ISD1700S音频输出电路和GPS模块接口电路。每块电路通过与单片机的连接组合,实现其各自的功能。
(1)单片机的最小系统
AT89C51单片机的时钟电路可以由三种方式构成,即内部时钟方式、有源晶振方式和外部时钟信号方式。本自动报站系统为内部时钟方式,即采用外接晶振和电容组成的并联谐振电路,AT89C51可以工作在20MHz频率下。电路如图3-1所示
}
6、显示定位子函数GotoXY()
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x); //第一行设置数据指针地址
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
while(!P31) //判断P31口是否为0,如果为0则执行led=0否则led=1
{
delay();
led=0;
}
led=1;
delay();
}
}
void ttl(void)interrupt 1 //定时器/计数器0(TF0)
{ re=~re; } // re值取反产生TTL电平
(5)液晶显示模块程序设计
TL0=0xf3; //低8位计数器初值
ET0=1; //允许计数器0的中断响应
}
main()
{
LCD_Initial(); //lcd初始化
GotoXY(7,0); //显示定位
Print("43"); //显示站名
GotoXY(0,1);
Print("Next:");
i=0;
p=dis1; //初始化界面
}
2、向LCD写入命令或数据子函数LCD_Write()
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序给En一个高脉冲
uchar code dis4[]="Shang Du";
uchar code dis5[]="Shi Da ";
uchar *p;
void Delay1ms(unsigned int count) //延时1ms
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
7、显示字符子函数Print()
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++; delay1();
}
}
站点信息设置及调用
用数组定义站点信息字符串:
uchar code dis1[]="ZhaoHu Z ";
(2)语音模块子程序
ISD1700S语音模块子程序主要是接收主芯片发送过来的音频信号,然后由P25端输出一个负脉冲信号,语音芯片内部指针指向本站点的语音段头,再由P26端输出一个负脉冲信号,经过音频放大,通过扬声器播放当前指针指向的语音段。流程图如图4-2所示
(3)JHD162A液晶显示子程序
JHD162A液晶显示子程序主要通过接收主程序发出的信号,将其设置输入为模式子函数形式,并初始化LCD子函数,显示定位子函数,显示字符子函数,站点信息设置及调用,最后显示站名信息。流程图如图4-3所示。
}
void delay()
{
int i,j;
for(i=0;i<255;i++)
for(j=0;j<120;j++);
}
void send() //GPS发送
{
re=0;
TMOD=0x02; //计数器工作模式:方式2自动再装入的8位计数器
EA=1; //允许全部中断
TH0=0xf3; //高8位计数器作为初值寄存器
(4)GPS模块接口电路
由于电源电压要求为+5.0V±5%(即+4.75V~+5.25V),因此模块引脚1、引脚2,引脚3均接系统的+5V电源。由于该模块无需初始化,上电后模块即可自动接收和发送定位数据,故不需要对其进行控制操作,即系统不必向GPS模块发出控制指令。另外,GPS模块工作电源是+5V,而AT89C51单片机的I/O电压为+3.3V,所以在GPS模块与AT89C51单片机之间串接27K的保护电阻。具体硬件接口电路如图3-4所示:
(4)主程序设计
公交车自动报站系统是利用GPS进行数据采集,实时解算车辆当时的经度、纬度等信息,获得公交车的实时坐标,将其与站台坐标相比较,公交车驶入站台一定距离范围内时,不用人工干预,系统自动进行报站、温磬提示等服务。如果公交车需要临时改变运营线路或更换一些语音广告信息,车载系统将方便、快捷地下载更新语音信息。若是在自动报站状态,则检测GPS信息,确定公交车当前的地理位置,决定是否播放语音信息,播放哪段语音信息。主程序的流程实现如下所示:
uchar code dis2[]="JuYuan Z";
uchar code dis3[]="Jin Shan";
uchar code dis4[]="Shang Du";
uchar code dis5[]="Shi Da ";
uchar *p;
用case语句判断要显示的站点
switch(i)
{
case 0:{p=dis1;} break;
1、内部等待函数LCD_Wait(void)
unsigned char LCD_Wait(void)
{
LcdRs=0; //读状态
LcdRw=1; _nop_();
LcdEn=1; _nop_();
while(DBPort&0x80); //判断读写状态使能标志
LcdEn=0;
return DBPort;
sbit re=P3^0; //GPS发射端
sbit reset=P3^4; //语音芯片复位
char i;
uchar code dis1[]="ZhaoHu Z "; //站点内容可更新或增加
uchar code dis2[]="JuYuan Z";
uchar code dis3[]="Jin Shan";
LcdEn=0; _nop_();
LCD_Wait();
}
3、设置显示模式子函数LCD_SetDisplay()
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
4、设置输入模式子函数LCD_SetInput()
while(P31); //判断P31口是否为1,如果是则循环直到是0后往下执行
delay();
P24=0; //从P24口输出一个负脉冲使FWD有效,指针指向下一段
delay();
P24=1;
delay();
P25=0; // PLAY有效,播放当前段
delay();
P25=1;
if(i==5){i=0;}else{i++;}
复位电路主要完成系统的上电自动复位和系统在运行时用户的手动按键复位功能。在本系统中采用较简单的RC复位电路,单片机在上电瞬间,RST引脚端出现正脉冲,实现自动复位。经实践使用证明,其复位逻辑稳定、可靠。电路图如图3-1所示。
(2)JHD162A液晶显示电路
为了能方便直观的了解到当前地段的站名和信息,显示的内容主要为16字符x 2行,字符点阵为5 x 8点,采用的驱动方式为1/16D。基本操作时序为读状态:RS=L,RW=H,E=H;写指令:RS=L,RW=L,D0~D7=指令码,E=高脉冲;读数据:RS=H,E=H;写数据:RS=H,RW=L,D0~D7=数据,E=高脉冲,数码管的4,5,6分别与单片机的P2.0—P2.2相连;7~14分别与P0.0~P0.7相连,通过单片机的信息处理,从而在液晶显示频上显示各段信息。设计电路图如图3-2所示。
基于单片机的智能公交报站系统
本系统要实现根据公交车通过不同路段,然后经过GPS系统定位报出站名的功能。系统主要有两大部分,主控制程序单片机和语音芯片部分。每个部分都有不同的方案可供选择。
1.系统整体框架结构图
本设计的整体思路是:通过按键电路和GPS定位系统输入地段信息,直接输出数字信号给单片机AT89C51进行处理,在LCD液晶频上显示当前站名信息。同时通过语音芯片输出放大后的语音信息。其结构框图如图所示:
(5)系统整体电路图
系统主要通过单片机AT89C51处理:GPS模块接口电路,按键电路,ISD1700S音频输出电路以及JHD162A液晶显示电路。单片机主芯片通过对按键电路和GPS模块的信息处理,将信息发送到音频输出电路和LCD液晶显示电路,从而可以明确的获知该地段的站名和准确播报信息。系统总体硬件设计电路如图3-5所示。
(3)ISD1700S音频输出电路及按键电路
ISD1700S通过按键系统和GPS模块的信息输入,在按键模式工作时,芯片可以通过/LED管脚给出信号来提示芯片的工作状态,并且伴随有提示音,ISD1700S芯片具有语音录放功能,通过不同的数字信息输入,系统将会把先前收录好的语音通过音频放大器进行处理,最后经过扬声器喇叭播报出来。
本系统兼有按键操作功能:按下REC键,/REC管脚电平变低后开始录音,直到松开按键使电平拉高或者芯片录满时结束。(1)录音结束后,录音指针自动移向下一个有效地址,而放音指针则指向刚刚录完的那段语音地址。(2)放音操作:放音操作有两种模式,分别是边沿触发和电平触发,都由/PLAY管脚触发。(3)快进操作:点按一下FWD按钮将/FWD端拉低,会启动快进操作。快进操作用来将播放指针移向下一段语音信息。设计电路图如图3-3所示。
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
5、初始化LCD子函数LCD_Initial()
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,16×2行显示,5*7点阵
主程序代码:
#include "REGFra Baidu bibliotek52.H"
#include "LCD1602.h"
#define uchar unsigned char
sbit P31=P3^1; //无线信号接收端
sbit P24=P2^4; //控制快进
sbit P25=P2^5; //控制播放
sbit led=P1^0; //到站指示灯
(1)主程序流程图
主程序主要涉及各个部分子程序的调用。程序初始化后,系统出现开机界面,液晶显示频显示下一站站名。本程序主要兼有两种控制方式:按键控制和GPS接收控制。程序接收到信息后语音将自动播报到站信息,液晶显示频显示下一站,下车的指示灯亮。选择NO,则是继续行车报站,选择YES,则停止行车,终止系统。主程序流程图4-1所示。
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增,画面不动
GotoXY(6,1); //初始定位
Print(p); //初始显示
delay();
reset=0; //语音芯片复位
delay();
delay();
delay();
reset=1;
P31=1;
send(); //GPS发射
TR0=1; //启动计数器
while(1)
{
Delay1ms(300);
switch(i)
{
case 0:{p=dis1;} break;
case 1:{p=dis2;} break;
case 2:{p=dis3;} break;
case 3:{p=dis4;} break;
case 4:{p=dis5;} break;
};
GotoXY(6,1); //数据指针定位
Print(p); //显示
图1:整体框架结构图
2.单片机和语音芯片的选择
基于AT89C51单片机设计
语音芯片ISD1700S
3.系统的硬件设计
系统硬件电路主要包括按键电路,JHD162A液晶显示电路,ISD1700S音频输出电路和GPS模块接口电路。每块电路通过与单片机的连接组合,实现其各自的功能。
(1)单片机的最小系统
AT89C51单片机的时钟电路可以由三种方式构成,即内部时钟方式、有源晶振方式和外部时钟信号方式。本自动报站系统为内部时钟方式,即采用外接晶振和电容组成的并联谐振电路,AT89C51可以工作在20MHz频率下。电路如图3-1所示
}
6、显示定位子函数GotoXY()
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x); //第一行设置数据指针地址
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
while(!P31) //判断P31口是否为0,如果为0则执行led=0否则led=1
{
delay();
led=0;
}
led=1;
delay();
}
}
void ttl(void)interrupt 1 //定时器/计数器0(TF0)
{ re=~re; } // re值取反产生TTL电平
(5)液晶显示模块程序设计
TL0=0xf3; //低8位计数器初值
ET0=1; //允许计数器0的中断响应
}
main()
{
LCD_Initial(); //lcd初始化
GotoXY(7,0); //显示定位
Print("43"); //显示站名
GotoXY(0,1);
Print("Next:");
i=0;
p=dis1; //初始化界面
}
2、向LCD写入命令或数据子函数LCD_Write()
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序给En一个高脉冲
uchar code dis4[]="Shang Du";
uchar code dis5[]="Shi Da ";
uchar *p;
void Delay1ms(unsigned int count) //延时1ms
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
7、显示字符子函数Print()
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++; delay1();
}
}
站点信息设置及调用
用数组定义站点信息字符串:
uchar code dis1[]="ZhaoHu Z ";
(2)语音模块子程序
ISD1700S语音模块子程序主要是接收主芯片发送过来的音频信号,然后由P25端输出一个负脉冲信号,语音芯片内部指针指向本站点的语音段头,再由P26端输出一个负脉冲信号,经过音频放大,通过扬声器播放当前指针指向的语音段。流程图如图4-2所示
(3)JHD162A液晶显示子程序
JHD162A液晶显示子程序主要通过接收主程序发出的信号,将其设置输入为模式子函数形式,并初始化LCD子函数,显示定位子函数,显示字符子函数,站点信息设置及调用,最后显示站名信息。流程图如图4-3所示。
}
void delay()
{
int i,j;
for(i=0;i<255;i++)
for(j=0;j<120;j++);
}
void send() //GPS发送
{
re=0;
TMOD=0x02; //计数器工作模式:方式2自动再装入的8位计数器
EA=1; //允许全部中断
TH0=0xf3; //高8位计数器作为初值寄存器
(4)GPS模块接口电路
由于电源电压要求为+5.0V±5%(即+4.75V~+5.25V),因此模块引脚1、引脚2,引脚3均接系统的+5V电源。由于该模块无需初始化,上电后模块即可自动接收和发送定位数据,故不需要对其进行控制操作,即系统不必向GPS模块发出控制指令。另外,GPS模块工作电源是+5V,而AT89C51单片机的I/O电压为+3.3V,所以在GPS模块与AT89C51单片机之间串接27K的保护电阻。具体硬件接口电路如图3-4所示:
(4)主程序设计
公交车自动报站系统是利用GPS进行数据采集,实时解算车辆当时的经度、纬度等信息,获得公交车的实时坐标,将其与站台坐标相比较,公交车驶入站台一定距离范围内时,不用人工干预,系统自动进行报站、温磬提示等服务。如果公交车需要临时改变运营线路或更换一些语音广告信息,车载系统将方便、快捷地下载更新语音信息。若是在自动报站状态,则检测GPS信息,确定公交车当前的地理位置,决定是否播放语音信息,播放哪段语音信息。主程序的流程实现如下所示:
uchar code dis2[]="JuYuan Z";
uchar code dis3[]="Jin Shan";
uchar code dis4[]="Shang Du";
uchar code dis5[]="Shi Da ";
uchar *p;
用case语句判断要显示的站点
switch(i)
{
case 0:{p=dis1;} break;
1、内部等待函数LCD_Wait(void)
unsigned char LCD_Wait(void)
{
LcdRs=0; //读状态
LcdRw=1; _nop_();
LcdEn=1; _nop_();
while(DBPort&0x80); //判断读写状态使能标志
LcdEn=0;
return DBPort;
sbit re=P3^0; //GPS发射端
sbit reset=P3^4; //语音芯片复位
char i;
uchar code dis1[]="ZhaoHu Z "; //站点内容可更新或增加
uchar code dis2[]="JuYuan Z";
uchar code dis3[]="Jin Shan";
LcdEn=0; _nop_();
LCD_Wait();
}
3、设置显示模式子函数LCD_SetDisplay()
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
4、设置输入模式子函数LCD_SetInput()
while(P31); //判断P31口是否为1,如果是则循环直到是0后往下执行
delay();
P24=0; //从P24口输出一个负脉冲使FWD有效,指针指向下一段
delay();
P24=1;
delay();
P25=0; // PLAY有效,播放当前段
delay();
P25=1;
if(i==5){i=0;}else{i++;}
复位电路主要完成系统的上电自动复位和系统在运行时用户的手动按键复位功能。在本系统中采用较简单的RC复位电路,单片机在上电瞬间,RST引脚端出现正脉冲,实现自动复位。经实践使用证明,其复位逻辑稳定、可靠。电路图如图3-1所示。
(2)JHD162A液晶显示电路
为了能方便直观的了解到当前地段的站名和信息,显示的内容主要为16字符x 2行,字符点阵为5 x 8点,采用的驱动方式为1/16D。基本操作时序为读状态:RS=L,RW=H,E=H;写指令:RS=L,RW=L,D0~D7=指令码,E=高脉冲;读数据:RS=H,E=H;写数据:RS=H,RW=L,D0~D7=数据,E=高脉冲,数码管的4,5,6分别与单片机的P2.0—P2.2相连;7~14分别与P0.0~P0.7相连,通过单片机的信息处理,从而在液晶显示频上显示各段信息。设计电路图如图3-2所示。
基于单片机的智能公交报站系统
本系统要实现根据公交车通过不同路段,然后经过GPS系统定位报出站名的功能。系统主要有两大部分,主控制程序单片机和语音芯片部分。每个部分都有不同的方案可供选择。
1.系统整体框架结构图
本设计的整体思路是:通过按键电路和GPS定位系统输入地段信息,直接输出数字信号给单片机AT89C51进行处理,在LCD液晶频上显示当前站名信息。同时通过语音芯片输出放大后的语音信息。其结构框图如图所示:
(5)系统整体电路图
系统主要通过单片机AT89C51处理:GPS模块接口电路,按键电路,ISD1700S音频输出电路以及JHD162A液晶显示电路。单片机主芯片通过对按键电路和GPS模块的信息处理,将信息发送到音频输出电路和LCD液晶显示电路,从而可以明确的获知该地段的站名和准确播报信息。系统总体硬件设计电路如图3-5所示。
(3)ISD1700S音频输出电路及按键电路
ISD1700S通过按键系统和GPS模块的信息输入,在按键模式工作时,芯片可以通过/LED管脚给出信号来提示芯片的工作状态,并且伴随有提示音,ISD1700S芯片具有语音录放功能,通过不同的数字信息输入,系统将会把先前收录好的语音通过音频放大器进行处理,最后经过扬声器喇叭播报出来。
本系统兼有按键操作功能:按下REC键,/REC管脚电平变低后开始录音,直到松开按键使电平拉高或者芯片录满时结束。(1)录音结束后,录音指针自动移向下一个有效地址,而放音指针则指向刚刚录完的那段语音地址。(2)放音操作:放音操作有两种模式,分别是边沿触发和电平触发,都由/PLAY管脚触发。(3)快进操作:点按一下FWD按钮将/FWD端拉低,会启动快进操作。快进操作用来将播放指针移向下一段语音信息。设计电路图如图3-3所示。
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
5、初始化LCD子函数LCD_Initial()
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,16×2行显示,5*7点阵
主程序代码:
#include "REGFra Baidu bibliotek52.H"
#include "LCD1602.h"
#define uchar unsigned char
sbit P31=P3^1; //无线信号接收端
sbit P24=P2^4; //控制快进
sbit P25=P2^5; //控制播放
sbit led=P1^0; //到站指示灯