基于GPS定位的公交车自动报站系统的设计全解.doc 下载本文

苏州经贸学院

参考文献

[1] AT89C51中文资料手册[EB]

[2] ISD 1700 系列数码语音电路使用手册[EB] [3] 多用途DF无线数据收发模块[EB] [4] LCD1602A中文资料手册[EB]

[5] PT2262/2272编解码集成电路介绍[EB]

[6] 孙育才.MCS-51系列单片机微型计算机及其应用[M].南京:东南大学出版

社,2004。

[7] 周波,冯顽童,胡建龙等.公交车自动报站系统的设计[J].四川理工学院学

报:自然科学版, 2008。 [8]张伟,孙颖,赵晶.Protel 99 SE高级应用[M].北京:人民邮电出版社,2007. [9]曹丙霞,赵艳华.Protel 99 SE原理图与PCB设计[M].北京:电子工业出版社,2007。

[10]朱定华,黄松,蔡苗.Protel 99 SE原理图与印制板设计[M].北京:清华大

学出版社,2007。

22

苏州经贸学院

附录

本附录主要分析设计了三个C语言程序,其中包含系统的主程序设计,液晶显示模块设计和语音模块程序设计。 附录一:主程序设计

公交车自动报站系统是利用GPS进行数据采集,实时解算车辆当时的经度、纬度等信息,获得公交车的实时坐标,将其与站台坐标相比较,公交车驶入站台一定距离范围内时,不用人工干预,系统自动进行报站、温磬提示等服务。如果公交车需要临时改变运营线路或更换一些语音广告信息,车载系统将方便、快捷地下载更新语音信息。若是在自动报站状态,则检测GPS信息,确定公交车当前的地理位置,决定是否播放语音信息,播放哪段语音信息。主程序的流程实现如下所示:

主程序代码:

#include \#include \

#define uchar unsigned char

sbit P31=P3^1; //无线信号接收端 sbit P24=P2^4; //控制快进 sbit P25=P2^5; //控制播放 sbit led=P1^0; //到站指示灯 sbit re=P3^0; //GPS发射端

sbit reset=P3^4; //语音芯片复位 char i;

uchar code dis1[]=\站点内容可更新或增加 uchar code dis2[]=%uchar code dis3[]=%uchar code dis4[]=%uchar code dis5[]=%uchar *p;

void Delay1ms(unsigned int count) //延时1ms {

unsigned int i,j; for(i=0;i

void delay() {

int i,j;

for(i=0;i<255;i++) for(j=0;j<120;j++); }

void send() //GPS发送 {

23

苏州经贸学院

re=0;

TMOD=0x02; //计数器工作模式:方式2 自动再装入的8位计数器 EA=1; //允许全部中断

TH0=0xf3; //高8位计数器作为初值寄存器 TL0=0xf3; //低8位计数器初值 ET0=1; //允许计数器0的中断响应

} main() {

LCD_Initial(); //lcd初始化 GotoXY(7,0); //显示定位 Print(\显示站名 GotoXY(0,1); Print(\i=0;

p=dis1; //初始化界面 GotoXY(6,1); //初始定位 Print(p); //初始显示 delay();

reset=0; //语音芯片复位 delay(); delay(); delay(); reset=1; P31=1;

send(); //GPS发射 TR0=1; //启动计数器 while(1) {

Delay1ms(300);

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++;} switch(i) {

case 0:{p=dis1;} break; case 1:{p=dis2;} break;

24

苏州经贸学院

case 2:{p=dis3;} break; case 3:{p=dis4;} break; case 4:{p=dis5;} break;

};

GotoXY(6,1); //数据指针定位 Print(p); //显示

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电平 附录二:液晶显示模块程序设计

1、内部等待函数LCD_Wait(void) unsigned char LCD_Wait(void) {

LcdRs=0; //读状态 LcdRw=1; _nop_(); LcdEn=1; _nop_();

while(DBPort&0x80); //判断读写状态使能标志 LcdEn=0;

return DBPort; }

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一个高脉冲 LcdEn=0; _nop_(); LCD_Wait(); }

3、设置显示模式子函数LCD_SetDisplay()

void LCD_SetDisplay(unsigned char DisplayMode) {

LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }

25