|
隨著智慧公交的到來,智能報站器開始遍布到每一輛公交車上。本設計是基于51的低成本多功能自動定位遠程控制的報站器。
單片機源程序如下:
- #include "reg52.h"
- #include "flash.h"
- #include "sta013.h"
- #include "ds1302.h"
- #include "watchdog.h"
- #include "global.h"
- #include "communication.h"
- #include "voicefunction.h"
- #include "operate.h"
- #include "keydisp.h"
- #include "define.h"
- #include "turnbrakecheck.h"
- unsigned char xdata rs232_or_rs485 = 0; //2016-05-17 10:28:02
- extern void SendGuidepostInit(void); //2015-12-21 CJJ
- void main(void)
- {
- //2015-12-22 CJJ
- unsigned char xdata line_name_tmp[4] , i, j, k;
- unsigned long xdata flashadd_tmp;
- sys_init(); //系統初始化
- DS_RAM_RD(RS232_OR_RS485, &rs232_or_rs485);//獲取后串口定義為232還是485
- if (rs232_or_rs485) //使能后485
- {
- RS485EN = 1;
- RS232EN = 0;
- }
- else //使能后232
- {
- RS485EN = 0;
- RS232EN = 1;
- }
- while(1)
- {
- FeedWatchDog();
- TurnVoicePrompt(); //2017.02.26 湯 博
- if(keynumber!=0xffff)
- {
- ClrTimmer(); //清除定時器數據2003.05.20
- switch(keynumber)
- {
- case KEY00:
- CloseTimmer(); //close timmer when playying2003.05.20
- PlayServeVoice(0);
- break;
- case KEY01:
- CloseTimmer(); //close timmer when playying2003.05.20
- PlayServeVoice(1);
- break;
- case KEY02:
- CloseTimmer(); //close timmer when playying2003.05.20
- if(S_Xuan6_8==0)
- PlayServeVoice(2);
- else
- PlayServeVoice(5);
- break;
- case KEY03:
- CloseTimmer(); //close timmer when playying2003.05.20
- if(S_Xuan6_8==0)
- PlayServeVoice(3);
- else
- PlayServeVoice(6);
- break;
- case KEY04:
- CloseTimmer(); //close timmer when playying2003.05.20
- if(S_Xuan6_8==0)
- PlayServeVoice(4);
- else
- PlayServeVoice(7);
- break;
- case KEY06:
- if(S_Xuan6_8==0)
- {
- S_Xuan6_8=1;
- //顯示"擴展"
- Disp_Symbol(FLAG_EXTEND,ON,OFF);
- }
- else
- {
- S_Xuan6_8=0;
- //"擴展"消失
- Disp_Symbol(FLAG_EXTEND,OFF,OFF);
- }
- break;
- case KEY05:
- CloseTimmer(); //close timmer when playying2003.05.20
- PlayBaoZhan(PLAY_REPEAT);
- break;
- case KEY09:
- ChangBusStop(1); //=1增站
- CloseTimmer(); //close timmer when playying2003.05.20
- break;
- case KEY0A:
- ChangBusStop(0); //=1增站
- CloseTimmer(); //close timmer when playying2003.05.20
- break;
- case KEY07: //報進站 2017.02.22
- CloseTimmer(); //close timmer when playying2003.05.20
- // 2006.11.25add
- if(GB_StudyAuto)
- GB_IsPressKeyPlay = 1;
- PlayIn_Flag = 1; //2017.02.26 湯博
- PlayBaoZhan(PLAY_IN);
- break;
- case KEY08: //報出站 2017.02.22
- CloseTimmer(); //close timmer when playying2003.05.20
- // 2006.11.25add
- if(GB_StudyAuto)
- GB_IsPressKeyPlay = 1;
- PlayBaoZhan(PLAY_OUT);
- break;
- case KEY10:
- //StartTimmer();
- CloseTimmer();
- if(ChangeState(SPK_BIT_IN_CFG)) //改變外喇叭狀態
- Disp_Symbol(FLAG_SPEAKER_F,ON,OFF); //顯示改變
- else
- Disp_Symbol(FLAG_SPEAKER_F,OFF,OFF);
- SltSpkOFF(); //2012.4.14
- break;
- case KEY11:
- //StartTimmer();
- CloseTimmer();
- if(ChangeState(AUTO_BIT_IN_CFG)) //改變自動報站狀態
- Disp_Symbol(FLAG_AUTO_F,ON,OFF); //顯示改變
- else
- Disp_Symbol(FLAG_AUTO_F,OFF,OFF);
- break;
- case KEY12:
- //StartTimmer();
- CloseTimmer();
- if(ChangeState(TMV_BIT_IN_CFG)) //改變時段音量狀態
- Disp_Symbol(FLAG_TIME_F,ON,OFF); //顯示改變
- else
- Disp_Symbol(FLAG_TIME_F,OFF,OFF);
- break;
- case KEY13:
- //StartTimmer();
- CloseTimmer();
- ChangeDirection();
- break;
- case KEY14:
- //StartTimmer();
- CloseTimmer();
- if(ChangeState(MUSIC_BIT_IN_CFG)) //改變背景音樂狀態
- Disp_Symbol(FLAG_MUSIC,ON,OFF); //顯示改變
- else
- Disp_Symbol(FLAG_MUSIC,OFF,OFF);
- break;
- case KEY16:
- //StartTimmer();
- CloseTimmer();
- if(ChangeState(OV_BIT_IN_CFG)) //改變區間狀態
- Disp_Symbol(FLAG_OVER_F,ON,OFF); //顯示改變
- else
- Disp_Symbol(FLAG_OVER_F,OFF,OFF);
- break;
- case KEY15:
- //顯示"線路"并閃爍
- StartTimmer(); //啟動定時2003.05.20
- SetMenu(); //菜單設置2017.02.22
- break;
- case KEY_UP_L: //↑ 長按
- CloseTimmer();
- Disp_Clear();
- Disp_Num(0 , BLACK, OFF); //顯示" 485"
- Disp_Num(1 , 5 , OFF);
- Disp_Num(2 , 8 , OFF);
- Disp_Num(3 , 4 , OFF);
- rs232_or_rs485 = 1;
- DS_RAM_WR(RS232_OR_RS485, rs232_or_rs485);
- RS485EN = 1;
- RS232EN = 0; //后485
- Delay_350ms(6);
- revertdisp(); //恢復默認顯示!!!!!
- break;
- case KEY_DOWN_L://↓ 長按
- CloseTimmer();
- Disp_Clear();
- Disp_Num(0 , BLACK , OFF); //顯示" 232"
- Disp_Num(1 , 2 , OFF);
- Disp_Num(2 , 3 , OFF);
- Disp_Num(3 , 2 , OFF);
- rs232_or_rs485 = 0;
- DS_RAM_WR(RS232_OR_RS485, rs232_or_rs485);
- RS485EN = 0;
- RS232EN = 1; //后232
- Delay_350ms(6);
- revertdisp(); //恢復默認顯示!!!!!
- break;
- default:
- break;
- }
- keynumber=0xffff;
- }//end if(keynumber!=0xffff)
- if(RevertDisp_Flag==1) //恢復初始顯示2017.02.22
- {
- RevertDisp_Flag=0;
- revertdisp();
- }
-
- if(GB_Config & AUTO_BIT_IN_CFG) //如果啟動自動報站則進入自動報站處理程序
- {
- // 下面代碼2007.7.6add 2007.7.13 move here 防止影響其他的閃爍顯示
- if(GpsDataReceive_Flag) //如果接收到完整的GPS數據包 2017.02.24 湯博 注
- {
- if(GB_IsInceptGPSdata) //如果接收到GPS數據包 2017.02.24 湯博 注
- {
- GB_IsInceptGPSdata = 0; //接收到GPS數據包標志置零
- Disp_Symbol(FLAG_AUTO_F , ON , OFF); //顯示改變
- }
- else
- {
- GB_IsInceptGPSdata = 1;
- Disp_Symbol(FLAG_AUTO_F , OFF , OFF);
- }
- }
- AutoPlayBaoZhan();
- }
-
-
- #if TURN_BRAKE_CHECK_EN > 0
- turn_brake_check();
- #endif
- //以下為線路變更處理--------------------------------------------------------------------------------------
- EA = 0;//關總中斷避免干擾
- if (0 != (road_line[0] || road_line[1] || road_line[2] || road_line[3]))//若非全0則表明成功收到線路變更命令
- {
- // SerialSendByte('Y');//_DBG_
- //獲取線路總條數
- flashadd_tmp = 11;//LINE_NUM_OFSET_OF_FILE_HEADER;//線路總數目偏移地址
- FlashRandomRead(flashadd_tmp , &j , 1);
- // SerialSendByte(j);//_DBG_
- //將'1''9''2'逐個搜索比較"線路名稱",再轉換為線路編號(從1開始編號的)作為SetCurrentLine的參數
- for (i = 0; i < j; i++)
- {
- flashadd_tmp = 12/*LINE_OFSET_OF_FILE_HEADER*/ + i * sizeof(unsigned long);
- FlashRandomRead(flashadd_tmp , (unsigned char *)(&flashadd_tmp) , sizeof(unsigned long));//編號i的線路的屬性偏移地址
- FlashRandomRead(flashadd_tmp , line_name_tmp , sizeof(line_name_tmp));//語音文件支持8Byte,實際使用4Byte
- for (k = 0; k < 4; k++)//逐字比較
- {
- if (road_line[k] != line_name_tmp[k])//不匹配//192存儲為[0X31 0X39 0X32 0X00]
- {
- break;//失敗,搜索下條線路
- }
- }
- // SerialSendByte(line_name_tmp[0]);//_DBG_
- // SerialSendByte(line_name_tmp[1]);//_DBG_
- // SerialSendByte(line_name_tmp[2]);//_DBG_
- // SerialSendByte(line_name_tmp[3]);//_DBG_
- if (4 == k)//匹配成功
- {
- SetCurrentLine(i);//設置當前線路 2015-12-22 CJJ
- ES = 0;
- SendGuidepostInit();//向站牌發送線路切換信息 2015-12-22 CJJ
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
|
-
-
hardware.zip
2018-10-14 19:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.98 KB, 下載次數: 36, 下載積分: 黑幣 -5
-
-
project.zip
2018-10-14 19:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
181.53 KB, 下載次數: 35, 下載積分: 黑幣 -5
-
-
user.zip
2018-10-14 19:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
54.4 KB, 下載次數: 22, 下載積分: 黑幣 -5
|