苏州经贸学院
参考文献
[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