【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)

文章目录

  • 【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)
    • 任务书
    • 设计说明书
      • 摘要
      • 设计框架架构
      • 设计说明书及设计文件
      • 源码展示

任务书

主要研究内容:公交车GPS定位系统(原理及实现的方法)和公交车站;站牌显示系统(单片机显示的硬件原理图、PCB图及软件流程、程序代码)。

本次公交车运行位置指示系统需要实现的要求综合如下:
可以存放较多的服务用语和广告词;
要求操作简单,每站可自动播报全部报站内容;
要求具有LCD站点信息显示;
要求语音播报具有自动和手动两种功能;
要求站牌信息及服务信息等都能通过液晶屏显示出来;
时间、日历播报、显示和调整功能。
资料链接
原理图工程文件
源码工程文件
论文低重复率,21355字
原理图截图

设计说明书

摘要

本文通过使用STC89C52单片机为主控器,GPS为全球定位芯片保证公交车的实时位置定位,DS1302作为系统的时钟芯片,LCD12864作为系统的液晶显示器来显示公交车内部的时钟信息、站台信息以及提示语等,通过语音芯片实现语音播报功能。通过对系统的电路设计、软件系统设计来保证系统的功能实现并且给人们交通出行带来便利。解决了以住公交车报站系统人工操作不便、误报站多、故障时不报站等问题。

设计框架架构

前 言 1
第一章 绪论 2
第一节 研究背景 2
第二节 国内外发展趋势 2
一、国外发展趋势 2
二、国内的发展趋势 3
第三节 本文的主要研究内容 3
第四节 本章小结 4
第二章 系统方案设计 5
第一节 系统需要分析 5
第二节 系统设计功能分析 5
第三节 系统设计方案 6
第四节 本章小结 7
第三章 系统硬件电路设计 8
第一节 单片机最小系统电路设计 8
一、单片机介绍 8
二、单片机最小系统电路设计 9
第二节 电源电路设计 10
第三节 按键电路设计 10
第四节 LED电路设计 11
第五节 液晶显示电路设计 12
第六节 GPS电路设计 14
第七节 语音播报电路设计 15
第八节 时钟电路设计 16
第九节 系统总电路图 17
第十节 系统PCB设计 18
第十一节 本章小结 18
第四章 软件系统设计 20
第一节 Keil软件介绍 20
第二节 软件总设计流程 20
第三节 LCD液晶显示程序设计 22
第四节 GPS程序设计 23
第五节 时钟程序设计 26
第六节 语音播报程序设计 27
第七节 本章小结 28
总 结 30
致 谢 32
参考文献 33
附 录 35
一、英文原文 35
二、英文翻译 38
三、源代码 41

设计说明书及设计文件




论文低重复率,21355字

源码展示

#include <reg51.H>
#include "LCD12864.h"
#include "1302.h"
#include "60S2EEPROM.h"
//站点   GPS
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;        //定义按键IO
sbit led0=P3^4;
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;        //定义指示灯IO
sbit Music_Busy=P3^2;    //定义
bit key1_flag=0;
bit key2_flag=0;
bit key3_flag=0;
bit key4_flag=0;
bit key5_flag=0;
bit key6_flag=0;
bit key7_flag=0;
bit key8_flag=0;    //定义按键位变量
uchar Station_Count=1;
sbit Busy=P3^2;
bit position=0;
bit Display_Reversal=0;
uchar state=0;     //显示变量
bit s0=0;          //数据闪烁变量
uchar ms=0;            //定时器用到的变量
//发现两个Bug一个是自动下,到终点站没有自动切换上行、下行
//一个是  自动下 上行站名和语音不照应
uchar sec=0;
uchar sec1=0;
bit memory_flag=0;
uchar Sound=25;            //音量大小变量
uchar Station=10;      //车站总数变量
bit Mode=0;                //等于0代表固化    等于1代表自定义
bit A_M=0;
bit Upstream_Down=1;
uchar count=0;
uint JD_Difference=100;     //34.800340,113.499447
uint WD_Difference=100;
//这里预存上行经纬度数据
ulong xdata shangxing_JD_dat[15]={113499052  ,113499041   ,113499048   ,113499059   ,113499064   ,113499064  ,113499096  ,113499091 ,113499080  ,113499085 ,0,0,0,0,0};
ulong xdata shangxing_WD_dat[15]={ 34807299  ,34806564    ,34805795    ,34804901    ,34804046    ,34803403   ,34802381   ,34801711   , 34800910  , 34800152  ,0,0,0,0,0};
//这里预存下行经纬度数据
ulong xdata xiaxing_JD_dat[15]={113499447  ,113499447 ,113499457,   1134994359,   113499451,   113499408,   113499418,   113499391,  113499380,  113499395,   0,0,0,0,0};
ulong xdata xiaxing_WD_dat[15]={347996375   ,34800340, 34800869,   34801600,       34802233,    34802969,    34803852,    34804724,   34805649,   34806550,    0,0,0,0,0};
bit Sound_flag=1;
uchar code xiaxing1[] ="  测试下行A站  ";
uchar code xiaxing2[] ="  测试下行B站 ";
uchar code xiaxing3[] ="  测试下行C站 ";
uchar code xiaxing4[] ="  测试下行D站 ";
uchar code xiaxing5[] ="  测试下行E站 ";
uchar code xiaxing6[] ="  测试下行F站 ";
uchar code xiaxing7[] ="  测试下行G站 ";
uchar code xiaxing8[] ="  测试下行H站 ";
uchar code xiaxing9[] ="  测试下行I站 ";
uchar code xiaxing10[]="  测试下行J站 ";
uchar code xiaxing11[]="    测试上行11  ";
uchar code xiaxing12[]="    测试上行12  ";
uchar code xiaxing13[]="    测试上行13  ";
uchar code xiaxing14[]="    测试上行14  ";
uchar code xiaxing15[]="    测试上行15  ";
uchar code shangxing1[] ="  测试下行J站 ";
uchar code shangxing2[] ="  测试下行I站 ";
uchar code shangxing3[] ="  测试下行H站 ";
uchar code shangxing4[] ="  测试下行G站 ";
uchar code shangxing5[] ="  测试下行F站 ";
uchar code shangxing6[] ="  测试下行E站 ";
uchar code shangxing7[] ="  测试下行D站 ";
uchar code shangxing8[] ="  测试下行C站 ";
uchar code shangxing9[] ="  测试下行B站 ";
uchar code shangxing10[]="  测试下行A站 ";
uchar code shangxing11[]="    测试下行11  ";
uchar code shangxing12[]="    测试下行12  ";
uchar code shangxing13[]="    测试下行13  ";
uchar code shangxing14[]="    测试下行14  ";
uchar code shangxing15[]="    测试下行15  ";
uchar xdata A_dat[20];   //暂存从GPS提取的经纬度数据
uchar xdata B_dat[20];   //暂存从GPS提取的经纬度数据
uchar xdata GPS_dat[100];//暂存GPS模块返回的数据
uchar subscript;         //串口数据计数变量
uchar GPS_time=0;          //检测GPS是否接收到有效数据变量
float latitude,longitude;   //latitude是暂存纬度, longitude是暂存经度数据,这两个数据,是上面的暂存数组计算得到
unsigned long WD_A,JD_B;  //这两个变量,是最终现实与进行比较的经纬度数据变量
bit GPS_Write=0;           //是否开启GPS校时更新时间数据标志位
uchar xdata NowTime[7]=0;  //从GPS返回的数据里面提取出时间数据
bit memory_GPS_flag=1;
uchar Sec_set=0;
uchar Time_Calibration=0;   //校准时间标志位
void memory(){if(memory_flag) {memory_flag=0;IapEraseSector(0x08000);IapProgramByte(0x08000,Sound);               //记录音量大小变量IapProgramByte(0x08001,Station);          //记录车站总数if(GPS_Write)IapProgramByte(0x08002,1);   //记录自动校时标志  GPS_Write=1,就记录为1else IapProgramByte(0x08002,0);           //记录自动校时标志  GPS_Write=0,就记录为0if(Mode)IapProgramByte(0x08003,1);        //记录固化还是自定义  Mode=1,就记录为1else IapProgramByte(0x08003,0);           //记录固化还是自定义  Mode=0,就记录为0  if(A_M)IapProgramByte(0x08004,1);         //记录手动自动模式  A_M=1,就记录为1else IapProgramByte(0x08004,0);           //记录手动自动模式  A_M=0,就记录为0  if(Upstream_Down) IapProgramByte(0x08005,1);  //记录上行下行  Station_Count=1,就记录为1else              IapProgramByte(0x08005,0);  //记录上行下行  Station_Count=0,就记录为0
//    IapProgramByte(0x08006,shangxing_JD_dat[0]/65536/256);
//    IapProgramByte(0x08006,shangxing_JD_dat[0]/65536%256);
//    IapProgramByte(0x08006,shangxing_JD_dat[0]%256);}}
void read_memory(){Sound=IapReadByte(0x08000);    //读取的记录音量大小变量
//  Station=IapReadByte(0x08001);   //读取的记录车站总数if(Sound>30||Station>15)     //如果读取出来的数据不对,就进行初始化{Sound=25;Station=5;}if(IapReadByte(0x08002)!=0&&IapReadByte(0x08002)!=1) //读取GPS校时标志位{GPS_Write=1;                                 //如果读取不对,默认打开} else  GPS_Write=IapReadByte(0x08002);            //如果对,进行赋值if(IapReadByte(0x08003)!=0&&IapReadByte(0x08003)!=1) //读取存储的{Mode=0;}else  Mode=IapReadByte(0x08003);if(IapReadByte(0x08004)!=0&&IapReadByte(0x08004)!=1) {A_M=0;}else  A_M=IapReadByte(0x08004);if(IapReadByte(0x08005)!=0&&IapReadByte(0x08005)!=1) {Upstream_Down=0;}else  Upstream_Down=IapReadByte(0x08005);memory_flag=1;                                       //将读取的数据再次存储}
void memory_GPS(){unsigned char i=0;if(memory_GPS_flag){   memory_GPS_flag=0;IapEraseSector(0x08200);for(i=0;i<60;i++)                 {if(i<15) {IapProgramByte(0x08200+i*4,shangxing_JD_dat[i]/16777216%256);IapProgramByte(0x08200+i*4+1,shangxing_JD_dat[i]/65536%256);IapProgramByte(0x08200+i*4+2,shangxing_JD_dat[i]/256%256);IapProgramByte(0x08200+i*4+3,shangxing_JD_dat[i]%256);}else if(i<30) {IapProgramByte(0x08200+i*4,shangxing_WD_dat[i-15]/16777216%256);IapProgramByte(0x08200+i*4+1,shangxing_WD_dat[i-15]/65536%256);IapProgramByte(0x08200+i*4+2,shangxing_WD_dat[i-15]/256%256);IapProgramByte(0x08200+i*4+3,shangxing_WD_dat[i-15]%256);}else if(i<45) {IapProgramByte(0x08200+i*4,xiaxing_JD_dat[i-30]/16777216%256);IapProgramByte(0x08200+i*4+1,xiaxing_JD_dat[i-30]/65536%256);IapProgramByte(0x08200+i*4+2,xiaxing_JD_dat[i-30]/256%256);IapProgramByte(0x08200+i*4+3,xiaxing_JD_dat[i-30]%256);}else if(i<60) {IapProgramByte(0x08200+i*4,xiaxing_WD_dat[i-45]/16777216%256);IapProgramByte(0x08200+i*4+1,xiaxing_WD_dat[i-45]/65536%256);IapProgramByte(0x08200+i*4+2,xiaxing_WD_dat[i-45]/256%256);IapProgramByte(0x08200+i*4+3,xiaxing_WD_dat[i-45]%256);}}}}
void read_GPS(){unsigned char i=0;unsigned long flsh1=0,flsh2=0,flsh3=0,flsh4=0;for(i=0;i<60;i++){if(i<15)            {flsh1=IapReadByte(0x08200+i*4);flsh2=IapReadByte(0x08200+i*4+1);flsh3=IapReadByte(0x08200+i*4+2);flsh4=IapReadByte(0x08200+i*4+3);shangxing_JD_dat[i]=flsh1*16777216+flsh2*65536+flsh3*256+flsh4;}else if(i<30) {flsh1=IapReadByte(0x08200+i*4);flsh2=IapReadByte(0x08200+i*4+1);flsh3=IapReadByte(0x08200+i*4+2);flsh4=IapReadByte(0x08200+i*4+3);shangxing_WD_dat[i-15]=flsh1*16777216+flsh2*65536+flsh3*256+flsh4;}else if(i<45) {flsh1=IapReadByte(0x08200+i*4);flsh2=IapReadByte(0x08200+i*4+1);flsh3=IapReadByte(0x08200+i*4+2);flsh4=IapReadByte(0x08200+i*4+3);xiaxing_JD_dat[i-30]=flsh1*16777216+flsh2*65536+flsh3*256+flsh4;} else if(i<60) {flsh1=IapReadByte(0x08200+i*4);flsh2=IapReadByte(0x08200+i*4+1);flsh3=IapReadByte(0x08200+i*4+2);flsh4=IapReadByte(0x08200+i*4+3);xiaxing_WD_dat[i-45]=flsh1*16777216+flsh2*65536+flsh3*256+flsh4;} }}
void Uart1Data(uchar dat)   // 串口发送一个字节数据
{SBUF=dat;while(!TI);TI=0;
}
void UartData_Byte(uchar *byte) //串口发送一串数据
{while(*byte != '\0'){Uart1Data(*byte++);}
}
void delay(uint dat) {while(dat--);}
uchar verify_GPSdat(uchar *dat)//读取服务器返回的数据
{uchar i=0;while(*dat != 0){if(*dat != GPS_dat[i]){return 0;}i++;dat++;}GPS_dat[0]=0;return 1;
}
void Send_Hex(unsigned char *p,unsigned char num)
{while(num--)   //剩余发送的字符数{SBUF = *p; //将要发送的数据赋给串口缓冲寄存器while(!TI);//等待发送结束TI = 0;    //软件清零p++;       //指针加一}
}
void DoSum(unsigned char *Str,unsigned char len)//校验位计算
{unsigned int xorsum = 0;unsigned char i;for(i=1;i<len;i++){xorsum = xorsum + Str[i];}xorsum = 0 - xorsum;*(Str+i)     = (unsigned char)(xorsum >> 8);*(Str+i+1)   = (unsigned char)(xorsum & 0x00ff);
}
void Send_Appoint_Music(unsigned char dat ){     //7E FF 06 03 00 00 01 FE F7 EFunsigned char Table[10];Table[0] = 0x7E;Table[1] = 0xFF;Table[2] = 0x06; Table[3] = 0x03; //指令Table[4] = 0x00;Table[5] = 0x00;Table[6] = dat; DoSum(Table,7);//计算校验码 Table[9] = 0xEF;//结束码      Send_Hex(Table,10);//发送指令数据}
void Send_Appoint_Sound(unsigned char dat){if(Music_Busy==0&&s0) {unsigned char Table[10];Table[0] = 0x7E;Table[1] = 0xFF;Table[2] = 0x06;Table[3] = 0x06; //指令Table[4] = 0x00;Table[5] = 0x00;Table[6] = dat;//音量DoSum(Table,7);//计算校验码   Table[9] = 0xEF;//结束码Send_Hex(Table,10);//发送指令数据}}
void read_time1() //实时读取DS1302中的时间数据
{uchar i;if(state==0){time_data[0]=ds1302read(0x81);time_data[1]=ds1302read(0x83);time_data[2]=ds1302read(0x85);time_data[3]=ds1302read(0x87);time_data[4]=ds1302read(0x89);time_data[5]=ds1302read(0x8D);          time_data_1[0]=time_data[0]/16*10+time_data[0]%16;time_data_1[1]=time_data[1]/16*10+time_data[1]%16;time_data_1[2]=time_data[2]/16*10+time_data[2]%16;time_data_1[3]=time_data[3]/16*10+time_data[3]%16;time_data_1[4]=time_data[4]/16*10+time_data[4]%16;time_data_1[5]=time_data[5]/16*10+time_data[5]%16;if(time_data_1[0]>59){ds1302write(0x8e,0x00); ds1302write(0x80,0x80);ds1302write(0x80,0);ds1302write(0x8e,0x80);     }ds1302write(0x8e,0x80);                  } else {ds1302write(0x8e,0x00); ds1302write(0x80,0x80);for(i=0;i<7;i++){time_data_2[i]=time_data_1[i]/10;time_data_3[i]=time_data_1[i]%10;      }for(i=0;i<7;i++){time_data_4[i]=time_data_2[i]*16+time_data_3[i];}ds1302write(0x80,time_data_4[0]);ds1302write(0x82,time_data_4[1]);ds1302write(0x84,time_data_4[2]);ds1302write(0x86,time_data_4[3]);ds1302write(0x88,time_data_4[4]);ds1302write(0x8C,time_data_4[5]);}
}
//显示函数
void Display(){uchar dat=0;if(state<=6) {LCD12864_pos(0,0);if(state==1&&s0)   LCD12864_writebyte("    ");else  {LCD12864_writebyte("20");    LCD12864_write(1,0x30+time_data_1[5]/10);         LCD12864_write(1,0x30+time_data_1[5]%10);}LCD12864_writebyte("-");if(state==2&&s0)   LCD12864_writebyte("  ");else  {LCD12864_write(1,0x30+time_data_1[4]/10);          LCD12864_write(1,0x30+time_data_1[4]%10);}LCD12864_writebyte("-");if(state==3&&s0)   LCD12864_writebyte("  ");else  {LCD12864_write(1,0x30+time_data_1[3]/10);          LCD12864_write(1,0x30+time_data_1[3]%10);}
//配置定时0用作常规定时,使用定时器1用作串口1波特率发生器,9600
void TimeInt(void)       //系统定时器初始化配置
{TMOD=0x21;       //定义两个定时器TH1=0xFD;TL1=0xFD;       //定时器1用于产生波特率  晶振11.0592TL0 = 0x00;     //设置定时初值TH0 = 0x4C;        //设置定时初值    SCON=0x50;PCON=0;EA=1;          //开总中断ES=1;          //ES-串行中断允许控制位   ES = 1   允许串行中断。TR1=1;         //启动定时器开始工作ET0=1;TR0=1;
}

【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)相关推荐

  1. 3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)

    3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文) 文章目录 3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文) 资料 任务书 设计说明书 摘要 设计框架架 ...

  2. 计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远 ...

  3. 计算机毕业设计ssm基于J2EE的山西旅游网站的设计与实现iiqmx系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于J2EE的山西旅游网站的设计与实现iiqmx系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于J2EE的山西旅游网站的设计与实现iiqmx系统+程序+源码+lw+远程部 ...

  4. (毕业设计资料)基于单片机GPS公交车自动语音报站系统

    100[电路方案]基于单片机GPS公交车自动语音报站系统 [资源下载]下载地址如下: https://docs.qq.com/doc/DTlRSd01BZXNpRUxl 主要功能: 1.本设计播报方面 ...

  5. 计算机毕业设计ssm贵工程线上拍卖平台的设计与实现c1jil系统+程序+源码+lw+远程部署

    计算机毕业设计ssm贵工程线上拍卖平台的设计与实现c1jil系统+程序+源码+lw+远程部署 计算机毕业设计ssm贵工程线上拍卖平台的设计与实现c1jil系统+程序+源码+lw+远程部署 本源码技术栈 ...

  6. 基于ThinkPHP5框架开发的付费短视频魅思V20系统+APP源码+H5源码

    源码介绍 基于ThinkPHP5框架开发的付费短视频 魅思V20系统+APP源码+H5源码,支持三级分销功能,含有APP源码.H5源码,采用国内最流行的ThinkPHP5框架开发. 主要功能如下: 1 ...

  7. 【java毕业设计】基于javaEE+SSH+oracle的健康管理系统设计与实现(毕业论文+程序源码)——健康管理系统

    基于javaEE+SSH+oracle的健康管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+oracle的健康管理系统设计与实现,文章末尾附有本毕业设计的论文 ...

  8. 【java毕业设计】基于java+Tomcat +Swing的出租车计价器设计与实现(毕业论文+程序源码)——出租车计价器

    基于java+Tomcat +Swing的出租车计价器设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Tomcat +Swing的出租车计价器设计与实现,文章末尾附有本毕业设计的 ...

  9. 【java毕业设计】基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码)——酒水销售系统

    基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+SSH+jsp的酒水销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

最新文章

  1. Python实现一元及多元线性回归
  2. 英特尔用英伟达显卡,给GTA5打了个超强画质补丁
  3. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客
  4. 反反复复的磁盘丢失故障处理过程
  5. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例
  6. 微信小程序入门五: wxml文件引用、模版、生命周期
  7. NFS服务端安装与配置
  8. 【Java】ASCII类对ASCII码的处理
  9. 机器学习笔记七之机器学习诊断
  10. 20W+喜爱的Pathview网页版 | 整合表达谱数据KEGG通路可视化
  11. ASP.NET中的AJAX应用开发详解
  12. php自动滚动到页尾,让DOM元素自动滚到视野内ScrollIntoView
  13. [转载] python 生成器读取文件
  14. Activemq 使用ssl说明
  15. c# 火狐浏览器怎么嵌入窗体中_语言C#.net 如何将子窗体嵌入到父窗体里面
  16. NetSpeedMonitor:在任务栏中监视网络下载、上传情况
  17. 王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!
  18. 基于K210的人脸识别门禁
  19. 金蝶kis商贸版系统服务器,上海金蝶kis商贸版软件系统
  20. 阿尔伯塔计算机硕士要求,阿尔伯塔大学计算机硕士专业介绍

热门文章

  1. 疫情数据分析平台(四):世界疫情地图绘制
  2. 2021年的第一个小目标:软考高级
  3. python中序列解包_Python3 序列解包
  4. python泰勒公式_泰勒公式和Gamma函数
  5. 106个免费英文SEO工具,带你飞!
  6. 154_cjson很好的一篇文章
  7. Halcon解决方案指南(16)一维码识别
  8. 每一次的脱颖而出都是从点击积累的吧#
  9. Android WebView显示广告
  10. 第60期:详解移动互联网背后的安全技术