找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3025|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的MP3公交报站器设计(程序)

[复制链接]
跳转到指定楼层
楼主
ID:90992 发表于 2018-10-14 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
随着智慧公交的到来,智能报站器开始遍布到每一辆公交车上。本设计是基于51的低成本多功能自动定位远程控制的报站器。

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "flash.h"
  3. #include "sta013.h"
  4. #include "ds1302.h"
  5. #include "watchdog.h"
  6. #include "global.h"
  7. #include "communication.h"
  8. #include "voicefunction.h"
  9. #include "operate.h"
  10. #include "keydisp.h"
  11. #include "define.h"
  12. #include "turnbrakecheck.h"


  13. unsigned char xdata rs232_or_rs485 = 0;        //2016-05-17 10:28:02
  14. extern void SendGuidepostInit(void);                //2015-12-21 CJJ

  15. void main(void)
  16. {
  17.         //2015-12-22 CJJ
  18.         unsigned char xdata line_name_tmp[4] , i, j, k;
  19.         unsigned long xdata flashadd_tmp;

  20.         sys_init();                                        //系统初始化

  21.         DS_RAM_RD(RS232_OR_RS485, &rs232_or_rs485);//获取后串口定义为232还是485
  22.         if (rs232_or_rs485)        //使能后485
  23.         {
  24.                 RS485EN = 1;
  25.                 RS232EN = 0;            
  26.         }
  27.         else                //使能后232      
  28.         {
  29.                 RS485EN = 0;
  30.                 RS232EN = 1;          
  31.         }

  32.         while(1)
  33.         {
  34.                 FeedWatchDog();
  35.                 TurnVoicePrompt();                        //2017.02.26 汤 博
  36.                 if(keynumber!=0xffff)
  37.                 {
  38.                         ClrTimmer();                        //清除定时器数据2003.05.20
  39.                         switch(keynumber)
  40.                         {
  41.                                 case KEY00:
  42.                                         CloseTimmer();        //close timmer when playying2003.05.20
  43.                                         PlayServeVoice(0);
  44.                                         break;
  45.                                 case KEY01:
  46.                                         CloseTimmer();        //close timmer when playying2003.05.20
  47.                                         PlayServeVoice(1);
  48.                                         break;
  49.                                 case KEY02:
  50.                                         CloseTimmer();        //close timmer when playying2003.05.20
  51.                                         if(S_Xuan6_8==0)
  52.                                                 PlayServeVoice(2);
  53.                                         else
  54.                                                 PlayServeVoice(5);
  55.                                         break;
  56.                                 case KEY03:
  57.                                         CloseTimmer();        //close timmer when playying2003.05.20
  58.                                         if(S_Xuan6_8==0)
  59.                                                 PlayServeVoice(3);
  60.                                         else
  61.                                                 PlayServeVoice(6);
  62.                                         break;
  63.                                 case KEY04:
  64.                                         CloseTimmer();        //close timmer when playying2003.05.20
  65.                                         if(S_Xuan6_8==0)
  66.                                                 PlayServeVoice(4);
  67.                                         else
  68.                                                 PlayServeVoice(7);
  69.                                         break;
  70.                                 case KEY06:
  71.                                         if(S_Xuan6_8==0)
  72.                                         {
  73.                                                 S_Xuan6_8=1;
  74.                                                 //显示"扩展"
  75.             Disp_Symbol(FLAG_EXTEND,ON,OFF);
  76.                                         }
  77.                                         else
  78.                                         {
  79.                                                 S_Xuan6_8=0;
  80.                                                 //"扩展"消失
  81.                                                 Disp_Symbol(FLAG_EXTEND,OFF,OFF);
  82.                                         }
  83.                                         break;
  84.                                 case KEY05:
  85.                                         CloseTimmer();        //close timmer when playying2003.05.20
  86.                                         PlayBaoZhan(PLAY_REPEAT);
  87.                                         break;
  88.                                 case KEY09:
  89.                                         ChangBusStop(1);        //=1增站
  90.                                         CloseTimmer();        //close timmer when playying2003.05.20
  91.                                         break;
  92.                                 case KEY0A:
  93.                                         ChangBusStop(0);        //=1增站
  94.                                         CloseTimmer();        //close timmer when playying2003.05.20
  95.                                         break;
  96.                                 case KEY07:                                //报进站 2017.02.22
  97.                                         CloseTimmer();        //close timmer when playying2003.05.20
  98.                                         // 2006.11.25add
  99.                                         if(GB_StudyAuto)
  100.                                                 GB_IsPressKeyPlay = 1;
  101.                                             PlayIn_Flag = 1;       //2017.02.26  汤博
  102.                                         PlayBaoZhan(PLAY_IN);
  103.                                         break;
  104.                                 case KEY08:             //报出站 2017.02.22
  105.                                         CloseTimmer();        //close timmer when playying2003.05.20
  106.                                         // 2006.11.25add
  107.                                         if(GB_StudyAuto)
  108.                                                 GB_IsPressKeyPlay = 1;
  109.                                         PlayBaoZhan(PLAY_OUT);
  110.                                         break;
  111.                                 case KEY10:
  112.                                         //StartTimmer();
  113.                                         CloseTimmer();
  114.                                         if(ChangeState(SPK_BIT_IN_CFG))        //改变外喇叭状态
  115.                                                 Disp_Symbol(FLAG_SPEAKER_F,ON,OFF);  //显示改变
  116.                                         else
  117.                                                 Disp_Symbol(FLAG_SPEAKER_F,OFF,OFF);
  118.                                         SltSpkOFF();                        //2012.4.14
  119.                                         break;
  120.                                 case KEY11:
  121.                                         //StartTimmer();
  122.                                         CloseTimmer();
  123.                                         if(ChangeState(AUTO_BIT_IN_CFG))           //改变自动报站状态
  124.                                                 Disp_Symbol(FLAG_AUTO_F,ON,OFF);  //显示改变
  125.                                         else
  126.                                                 Disp_Symbol(FLAG_AUTO_F,OFF,OFF);
  127.                                         break;
  128.                                 case KEY12:
  129.                                         //StartTimmer();
  130.                                         CloseTimmer();
  131.                                         if(ChangeState(TMV_BIT_IN_CFG))        //改变时段音量状态
  132.                                                 Disp_Symbol(FLAG_TIME_F,ON,OFF);  //显示改变
  133.                                         else
  134.                                                 Disp_Symbol(FLAG_TIME_F,OFF,OFF);
  135.                                         break;
  136.                                 case KEY13:
  137.                                         //StartTimmer();
  138.                                         CloseTimmer();
  139.                                         ChangeDirection();
  140.                                         break;
  141.                                 case KEY14:
  142.                                         //StartTimmer();
  143.                                         CloseTimmer();
  144.                                         if(ChangeState(MUSIC_BIT_IN_CFG))        //改变背景音乐状态
  145.                                                 Disp_Symbol(FLAG_MUSIC,ON,OFF);  //显示改变
  146.                                         else
  147.                                                 Disp_Symbol(FLAG_MUSIC,OFF,OFF);
  148.                                         break;
  149.                                 case KEY16:
  150.                                         //StartTimmer();
  151.                                         CloseTimmer();
  152.                                         if(ChangeState(OV_BIT_IN_CFG))        //改变区间状态
  153.                                                 Disp_Symbol(FLAG_OVER_F,ON,OFF);  //显示改变
  154.                                         else
  155.                                                 Disp_Symbol(FLAG_OVER_F,OFF,OFF);
  156.                                         break;
  157.                                 case KEY15:
  158.                                         //显示"线路"并闪烁
  159.                                         StartTimmer();                //启动定时2003.05.20
  160.                                         SetMenu();                        //菜单设置2017.02.22
  161.                                         break;
  162.                                 case KEY_UP_L: //↑ 长按
  163.                                         CloseTimmer();
  164.                                         Disp_Clear();
  165.                                         Disp_Num(0 , BLACK, OFF);                        //显示" 485"
  166.                                         Disp_Num(1 , 5 , OFF);
  167.                                         Disp_Num(2 , 8 , OFF);
  168.                                         Disp_Num(3 , 4 , OFF);
  169.                                         rs232_or_rs485 = 1;
  170.                                         DS_RAM_WR(RS232_OR_RS485, rs232_or_rs485);
  171.                                         RS485EN = 1;
  172.                                         RS232EN = 0;   //后485       
  173.                                         Delay_350ms(6);
  174.                                         revertdisp();                        //恢复默认显示!!!!!
  175.                                         break;
  176.                                 case KEY_DOWN_L://↓ 长按
  177.                                         CloseTimmer();
  178.                                         Disp_Clear();
  179.                                         Disp_Num(0 , BLACK , OFF);                        //显示" 232"
  180.                                         Disp_Num(1 , 2 , OFF);
  181.                                         Disp_Num(2 , 3 , OFF);
  182.                                         Disp_Num(3 , 2 , OFF);
  183.                                         rs232_or_rs485 = 0;
  184.                                         DS_RAM_WR(RS232_OR_RS485, rs232_or_rs485);
  185.                                         RS485EN = 0;
  186.                                         RS232EN = 1;   //后232
  187.                                         Delay_350ms(6);
  188.                                         revertdisp();                        //恢复默认显示!!!!!
  189.                                         break;
  190.                                 default:
  191.                                         break;
  192.                         }
  193.                         keynumber=0xffff;
  194.                 }//end if(keynumber!=0xffff)
  195.                 if(RevertDisp_Flag==1)      //恢复初始显示2017.02.22
  196.                 {
  197.                         RevertDisp_Flag=0;
  198.                         revertdisp();
  199.                 }
  200.                
  201.                 if(GB_Config & AUTO_BIT_IN_CFG)                //如果启动自动报站则进入自动报站处理程序
  202.                 {
  203.                         // 下面代码2007.7.6add 2007.7.13 move here 防止影响其他的闪烁显示
  204.                         if(GpsDataReceive_Flag)         //如果接收到完整的GPS数据包     2017.02.24 汤博 注
  205.                         {
  206.                                 if(GB_IsInceptGPSdata)                                //如果接收到GPS数据包     2017.02.24 汤博 注
  207.                                 {
  208.                                         GB_IsInceptGPSdata = 0;                        //接收到GPS数据包标志置零   
  209.                                         Disp_Symbol(FLAG_AUTO_F , ON , OFF);  //显示改变
  210.                                 }
  211.                                 else
  212.                                 {
  213.                                         GB_IsInceptGPSdata = 1;
  214.                                         Disp_Symbol(FLAG_AUTO_F , OFF , OFF);
  215.                                 }
  216.                         }
  217.                         AutoPlayBaoZhan();
  218.                 }

  219.                
  220.                
  221. #if TURN_BRAKE_CHECK_EN > 0
  222.                 turn_brake_check();
  223. #endif

  224.                 //以下为线路变更处理--------------------------------------------------------------------------------------
  225.                 EA = 0;//关总中断避免干扰
  226.                 if (0 != (road_line[0] || road_line[1] || road_line[2] || road_line[3]))//若非全0则表明成功收到线路变更命令
  227.                 {
  228. //                        SerialSendByte('Y');//_DBG_
  229.                         //获取线路总条数
  230.                         flashadd_tmp = 11;//LINE_NUM_OFSET_OF_FILE_HEADER;//线路总数目偏移地址
  231.                         FlashRandomRead(flashadd_tmp  , &j , 1);

  232. //                        SerialSendByte(j);//_DBG_
  233.                         //将'1''9''2'逐个搜索比较"线路名称",再转换为线路编号(从1开始编号的)作为SetCurrentLine的参数
  234.                         for (i = 0; i < j; i++)
  235.                         {
  236.                                 flashadd_tmp = 12/*LINE_OFSET_OF_FILE_HEADER*/ + i * sizeof(unsigned long);
  237.                                 FlashRandomRead(flashadd_tmp  , (unsigned char *)(&flashadd_tmp) , sizeof(unsigned long));//编号i的线路的属性偏移地址
  238.                                 FlashRandomRead(flashadd_tmp  , line_name_tmp , sizeof(line_name_tmp));//语音文件支持8Byte,实际使用4Byte
  239.                                 for (k = 0; k < 4; k++)//逐字比较
  240.                                 {
  241.                                         if (road_line[k] != line_name_tmp[k])//不匹配//192存储为[0X31 0X39 0X32 0X00]
  242.                                         {
  243.                                                 break;//失败,搜索下条线路
  244.                                         }
  245.                                 }       
  246. //                                SerialSendByte(line_name_tmp[0]);//_DBG_
  247. //                                SerialSendByte(line_name_tmp[1]);//_DBG_
  248. //                                SerialSendByte(line_name_tmp[2]);//_DBG_
  249. //                                SerialSendByte(line_name_tmp[3]);//_DBG_
  250.                                 if (4 == k)//匹配成功
  251.                                 {
  252.                                         SetCurrentLine(i);//设置当前线路 2015-12-22         CJJ
  253.                                         ES = 0;
  254.                                         SendGuidepostInit();//向站牌发送线路切换信息 2015-12-22         CJJ
  255. ……………………

  256. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

hardware.zip

22.98 KB, 下载次数: 36, 下载积分: 黑币 -5

project.zip

181.53 KB, 下载次数: 35, 下载积分: 黑币 -5

user.zip

54.4 KB, 下载次数: 22, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-10-15 01:01 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表