苏州经贸学院
参考文献
[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。
23
苏州经贸学院
附录
本附录主要分析设计了三个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发送 { 24 苏州经贸学院 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; 25 苏州经贸学院 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); } 26 苏州经贸学院 4、设置输入模式子函数LCD_SetInput() 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点阵 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递增, 画面不动 } 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)); } 7、显示字符子函数Print() void Print(unsigned char *str) { while(*str!='\\0') { LCD_Write(LCD_DATA,*str); str++; delay1(); } } 站点信息设置及调用 用数组定义站点信息字符串: uchar code dis1[]=%uchar code dis2[]=%uchar code dis3[]=%uchar code dis4[]=%uchar code dis5[]=%uchar *p; 用case语句判断要显示的站点 switch(i) { case 0:{p=dis1;} break; 27 苏州经贸学院 case 1:{p=dis2;} break; case 2:{p=dis3;} break; case 3:{p=dis4;} break; case 4:{p=dis5;} break; }; 附录三:语音模块程序设计 该模块采用单片机端口输出负脉冲信号模拟按键信号对语音芯片进行控制。 P24=0; // 模拟负脉冲FWD有效,播放指针指向下一段 delay(); P24=1; delay(); //给语音芯片一定的执行时间 P25=0; //模拟负脉冲 PLAY有效,播放当前段 delay(); P25=1; 28