|
系統(tǒng)的總體設(shè)計(jì)需要充分運(yùn)用STC單片機(jī)作為主控控制芯片,完成主控控制電路的基本設(shè)計(jì),輔助控制電路是語(yǔ)音控制電路、12864顯示電路、按鍵控制電路、GPS電路、LED顯示、溫度和時(shí)鐘模塊。仿真用串口模擬語(yǔ)音播報(bào),gps沒(méi)法仿真
電路原理圖如下:
51hei.png (61.55 KB, 下載次數(shù): 74)
下載附件
2022-3-21 23:25 上傳
DS1302的引腳排列,其中VCC2為主電源,VCC1為后備電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。P1.0~P1.2作為控制引腳,DS1302由VCC1或VCC2兩者中的較大者供電。當(dāng)VCC2大于VCC1+0.2V時(shí),VCC2給DS1302供電。當(dāng)VCC2小于VCC1時(shí),開(kāi)啟備用電源。P3.2接DS18b20的數(shù)據(jù)輸出引腳DQ,進(jìn)行數(shù)據(jù)采集。
3.5 指示燈模塊
本次設(shè)計(jì)二極管兩端接電源和單片機(jī)P2.6,P2.7為低電平,采用發(fā)光二極管LED指示燈亮來(lái)提醒公交車(chē)上下行。紅燈表示上行,綠燈表示自動(dòng)模式。
3.6 顯示模塊
LCD12864是一種新型的圖形點(diǎn)陣LCD其顯示分辨率為128×64,本次設(shè)計(jì)采用LCD12864作為顯示模塊的顯示輸出。采用LCD12864接P0的8位并行數(shù)據(jù)接口,P2.0~P2.5作為控制12864的GPIO。
3.7 按鍵模塊
報(bào)站器在正常使用的時(shí)候完全不需要人工的介入,可以正確的播報(bào)進(jìn)、出站語(yǔ)音及相關(guān)服務(wù)用語(yǔ)。P3.7和P1.7分別作為站臺(tái)信息和公交車(chē)信息顯示控制按鍵。但是報(bào)站器在時(shí)間調(diào)試及切換上下行的時(shí)候需要人工介入操作,P1.3和P1.4分別作為公交上行和下行控制,會(huì)有紅綠的LED進(jìn)行顯示是否切換,所以報(bào)站器需要加入按鍵控制系統(tǒng),P1.5和P1.6作為手動(dòng)播報(bào)的開(kāi)關(guān)控制,P3.6~P3.3分別接K4~K1按鍵作為時(shí)間的調(diào)整按鍵。
3.8 軟件設(shè)計(jì)
3.8.1 主程序
主程序包括給報(bào)站控制變量賦初值、初始化單片機(jī)I/O口、初始化實(shí)時(shí)時(shí)鐘芯片、初始化定時(shí)器0、初始化12864液晶屏。然后開(kāi)始檢測(cè)兩個(gè)模式按鍵是否按下包括:站臺(tái)信息顯示、公交車(chē)信息顯示兩個(gè)模式,若按鍵按下則執(zhí)行相應(yīng)程序,接著判斷時(shí)間設(shè)置按鍵是否按下執(zhí)行時(shí)間設(shè)置程序,程序還每200ms刷新一次時(shí)間和溫度顯示數(shù)值。
3.8.2
初始化12864液晶屏,開(kāi)機(jī)只顯示時(shí)間和溫度信息。如果按站臺(tái)顯示按鍵,則會(huì)顯示站臺(tái)信息,如一號(hào)站,二號(hào)站,三號(hào)站,四號(hào)站。按下公交車(chē)信息顯示按鍵,則會(huì)顯示公交車(chē)內(nèi)信息。按上下行設(shè)置鍵則會(huì)顯示到達(dá)和下站,再按下手動(dòng)播報(bào)鍵會(huì)接著顯示本站和下站是哪站,按下關(guān)閉播報(bào)鍵回到開(kāi)機(jī)只顯示時(shí)間和溫度界面。按下K1選擇鍵會(huì)進(jìn)入時(shí)間設(shè)置界面,反復(fù)按K1黑格會(huì)在年月日時(shí)分秒上跳動(dòng),再按加減鍵K2,K3進(jìn)行數(shù)值調(diào)節(jié),設(shè)置完畢按確定鍵K4回到開(kāi)機(jī)顯示的界面。
元件清單:
名稱(chēng) 型號(hào) 數(shù)量
單片機(jī) STC89C52 1
顯示屏 LCD12864 1
溫度傳感器 DS18B20 1
時(shí)鐘模塊 DS1302 1
LED燈 / 2
獨(dú)立按鍵 / 10
杜邦線 / 若干
主程序包括給報(bào)站控制變量賦初值、初始化單片機(jī)I/O口、初始化實(shí)時(shí)時(shí)鐘芯片、初始化定時(shí)器0、初始化12864液晶屏。然后開(kāi)始檢測(cè)兩個(gè)模式按鍵是否按下包括:站臺(tái)信息顯示、公交車(chē)信息顯示兩個(gè)模式,若按鍵按下則執(zhí)行相應(yīng)程序,接著判斷時(shí)間設(shè)置按鍵是否按下執(zhí)行時(shí)間設(shè)置程序,程序還每200ms刷新一次時(shí)間和溫度顯示數(shù)值。
image001.png (17.87 KB, 下載次數(shù): 65)
下載附件
2022-3-21 23:26 上傳
液晶顯示程序
初始化12864液晶屏,開(kāi)機(jī)只顯示時(shí)間和溫度信息。如果按站臺(tái)顯示按鍵,則會(huì)顯示站臺(tái)信息,如一號(hào)站,二號(hào)站,三號(hào)站,四號(hào)站。按下公交車(chē)信息顯示按鍵,則會(huì)顯示公交車(chē)內(nèi)信息。按上下行設(shè)置鍵則會(huì)顯示到達(dá)和下站,再按下手動(dòng)播報(bào)鍵會(huì)接著顯示本站和下站是哪站,按下關(guān)閉播報(bào)鍵回到開(kāi)機(jī)只顯示時(shí)間和溫度界面。按下K1選擇鍵會(huì)進(jìn)入時(shí)間設(shè)置界面,反復(fù)按K1黑格會(huì)在年月日時(shí)分秒上跳動(dòng),再按加減鍵K2,K3進(jìn)行數(shù)值調(diào)節(jié),設(shè)置完畢按確定鍵K4回到開(kāi)機(jī)顯示的界面。
image002.png (17.09 KB, 下載次數(shù): 74)
下載附件
2022-3-21 23:26 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- #include "value.h"
- #include <UART.h>
- sbit x_key=P1^3;
- sbit s_key=P1^4;
- sbit bz_key=P1^5;
- sbit gb_key=P1^6;
- sbit x_LED=P2^6;
- sbit s_LED=P2^7;
- sbit key_zhantai=P3^7;
- sbit key_gongjiao=P1^7;
- uchar x_mode,s_mode;
- uchar x_num,s_num;
- bit flag_200ms = 1;
- uchar flag_c_en;
- bit flag_100ms;
- sbit dq=P3^2; //18b20 IO口的定義
- uint temperature ; //溫度變量
- uint flag_zhantai ; //站臺(tái)顯示標(biāo)志位
- uint flag_gongjiao ; //公交顯示標(biāo)志位
- /************ 延時(shí)函數(shù) *****************/
- void delay_uint(uint z)
- {
- while(z--);
- }
- /********************************************************************
- * 名稱(chēng) : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<115;j++);
- }
- uchar dis_lcd[10];
- #include "lcd12864bu.h"
- /******************顯示時(shí)間函數(shù)***************************/
- void dis_shijian() //顯示時(shí)間
- {
- write_shu16(0,0*8,shi,0);
- write_shuzi(1,0*2,2*8,fuhao[1],0);
- write_shu16(0,3*8,fen,0);
- write_shuzi(1,0*2,5*8,fuhao[1],0);
- write_shu16(0,6*8,miao,0);
- write_yhanzi(2,0,5*16,qita[6]); //星期
- //write_shu16(0,14*8,week,0);
- if(week==0)
- {
- write_yhanzi(1,0,7*16,xingqi[0]);
- }
- if(week==1)
- {
- write_yhanzi(1,0,7*16,xingqi[1]);
- }
- if(week==2)
- {
- write_yhanzi(1,0,7*16,xingqi[2]);
- }
- if(week==3)
- {
- write_yhanzi(1,0,7*16,xingqi[3]);
- }
- if(week==4)
- {
- write_yhanzi(1,0,7*16,xingqi[4]);
- }
- if(week==5)
- {
- write_yhanzi(1,0,7*16,xingqi[5]);
- }
- if(week==6)
- {
- write_yhanzi(1,0,7*16,xingqi[6]);
- }
- write_shu16(1*2,0*8,0x20,0);
- write_shu16(1*2,2*8,nian,0);
- write_shuzi(1,1*2,4*8,fuhao[0],0);
- write_shu16(1*2,5*8,yue,0);
- write_shuzi(1,1*2,7*8,fuhao[0],0);
- write_shu16(1*2,8*8,ri,0);
- write_shu18b20(1*2,12*8,temperature,0);
- write_shuzi(1,1*2,14*8,dian,0);
- }
- /************初始化顯示*****************/
- void init_12864_dis() //初始化顯示
- {
- cs1=1; //左屏開(kāi)顯示
- cs2=0;
- dis_shijian(); //顯示時(shí)間
- }
- /***********************18b20初始化函數(shù)*****************************/
- void init_18b20()
- {
- bit q;
- dq=1; //把總線拿高
- delay_uint(1); //15us
- dq=0; //給復(fù)位脈沖
- delay_uint(80); //750us
- dq=1; //把總線拿高 等待
- delay_uint(10); //110us
- q=dq; //讀取18b20初始化信號(hào)
- delay_uint(20); //200us
- dq=1; //把總線拿高 釋放總線
- }
- /*************寫(xiě)18b20內(nèi)的數(shù)據(jù)***************/
- void write_18b20(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- { //寫(xiě)數(shù)據(jù)是低位開(kāi)始
- dq=0; //把總線拿低寫(xiě)時(shí)間隙開(kāi)始
- dq=dat&0x01; //向18b20總線寫(xiě)數(shù)據(jù)了
- delay_uint(5); // 60us
- dq=1; //釋放總線
- dat>>=1;
- }
- }
- /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
- uchar read_18b20()
- {
- uchar i,value;
- for(i=0;i<8;i++)
- {
- dq=0; //把總線拿低讀時(shí)間隙開(kāi)始
- value>>= 1; //讀數(shù)據(jù)是低位開(kāi)始
- dq=1; //釋放總線
- if(dq==1) //開(kāi)始讀寫(xiě)數(shù)據(jù)
- value|=0x80;
- delay_uint(5); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
- }
- return value; //返回?cái)?shù)據(jù)
- }
- /*************讀取溫度的值 讀出來(lái)的是小數(shù)***************/
- uint read_temp()
- {
- uint value;
- uchar low; //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
- init_18b20(); //初始化18b20
- write_18b20(0xcc); //跳過(guò)64位ROM
- write_18b20(0x44); //啟動(dòng)一次溫度轉(zhuǎn)換命令
- delay_uint(50); //500us
- init_18b20(); //初始化18b20
- write_18b20(0xcc); //跳過(guò)64位ROM
- write_18b20(0xbe); //發(fā)出讀取暫存器命令
-
- EA=0;
- low=read_18b20(); //讀溫度低字節(jié)
- value=read_18b20(); //讀溫度高字節(jié)
- EA =1;
- value<<=8; //把溫度的高位左移8位
- value|=low; //把讀出的溫度低位放到value的低八位中
- value*=0.625; //轉(zhuǎn)換到溫度值 小數(shù)
- return value; //返回讀出的溫度 帶小數(shù)
- }
- /******************顯示時(shí)間函數(shù)***************************/
- void dis_shijian_set() //顯示時(shí)間
- {
- write_shu16(0*2,0*8,0x20,0);
- write_shu16(1*2,2*8,shi,0);
- write_shu16(1*2,6*8,fen,0);
- write_shu16(1*2,10*8,miao,0);
- write_shu16(0*2,2*8,nian,0);
- write_shu16(0*2,6*8,yue,0);
- write_shu16(0*2,10*8,ri,0);
- write_yhanzi(1,4,5*16,xingqi[week]);
- }
- /************初始化設(shè)置顯示*****************/
- void init_12864_set1()
- {
- write_yhanzi(1,0,2*16,qita[0]); //年
- write_yhanzi(1,0,4*16,qita[1]); //月
- write_yhanzi(1,0,6*16,qita[2]); //日
- write_yhanzi(1,2,2*16,qita[3]); //時(shí)
- write_yhanzi(1,2,4*16,qita[4]); //分
- write_yhanzi(1,2,6*16,qita[5]); //秒
- write_yhanzi(2,4,3*16,qita[6]); //星期
- dis_shijian_set(); //顯示時(shí)間
- }
- /******************時(shí)間芯片顯示函數(shù)**********************/
- void ds1302_dis()
- {
- uchar miao_1;
- if(menu_1 == 0)
- {
- read_time();
- if(miao_1 != miao)
- {
- miao_1 = miao;
- dis_shijian(); //顯示時(shí)間
- }
- }
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- static uchar key_new;
- key_can=20; //按鍵值還原
- P3|=0x78; //對(duì)應(yīng)的按鍵IO口輸出為1
- if((P3&0x78)!=0x78) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if(((P3&0x78)!=0x78)&&(key_new==1))
- { //確認(rèn)是按鍵按下
- key_new=0;
- switch(P3&0x78)
- {
- case 0x70:key_can=1;break; //得到按鍵值
- case 0x68:key_can=2;break; //得到按鍵值
- case 0x58:key_can=3;break; //得到按鍵值
- case 0x38:key_can=4;break; //得到按鍵值
- }
- }
- }
- else
- key_new=1;
- }
- /**********************設(shè)置函數(shù)************************/
- void key_with()
- {
- if(key_can==4) //退出鍵
- {
- qingling();
- init_12864_dis(); //初始化顯示
- flag_200ms=1;
- menu_1=0;
- }
- if(key_can==1) //設(shè)置鍵
- {
- menu_1 ++;
- flag_200ms=1;
- if(menu_1==1)
- {
- x_num=0;
- s_num=0;
- x_mode=0;
- s_mode=0;
- qingling();
- init_12864_set1();
- }
- if(menu_1>7)
- menu_1 = 1;
- }
- if(menu_1!=0)
- {
- if(menu_1==1) //設(shè)置年
- {
- if(key_can==2) //加
- set_ds1302time(1,&nian,0x99);
- if(key_can==3) //減
- set_ds1302time(0,&nian,0x99);
- }
- if(menu_1==2) //設(shè)置月
- {
- if(key_can==2) //加
- set_ds1302time(1,&yue,0x13);
- if(key_can==3) //減
- set_ds1302time(0,&yue,0x13);
- }
- if(menu_1==3) //設(shè)置日
- {
- if(key_can==2) //加
- set_ds1302time(1,&ri,0x32);
- if(key_can==3) //減
- set_ds1302time(0,&ri,0x32);
- }
- if(menu_1==4) //設(shè)置時(shí)
- {
- if(key_can==4) //加
- set_ds1302time(1,&shi,0x24);
- if(key_can==3) //減
- set_ds1302time(0,&shi,0x24);
- }
- if(menu_1==5) //設(shè)置分
- {
- if(key_can==2) //加
- set_ds1302time(1,&fen,0x60);
- if(key_can==3) //減
- set_ds1302time(0,&fen,0x60);
- }
- if(menu_1==6) //設(shè)置秒
- {
- if(key_can==2) //加
- set_ds1302time(1,&miao,0x60);
- if(key_can==3) //減
- set_ds1302time(0,&miao,0x60);
- }
- if(menu_1==7) //設(shè)置星期
- {
- if(key_can==2) //加
- set_ds1302time(1,&week,0x8);
- if(key_can==3) //減
- set_ds1302time(0,&week,0x8);
- }
- dis_shijian_set(); //顯示時(shí)間
- switch(menu_1) // 光標(biāo)顯示
- {
- case 1:write_shu16(0*2,2*8,nian,1);break;
- case 2:write_shu16(0*2,6*8,yue,1);break;
- case 3:write_shu16(0*2,10*8,ri,1);break;
- case 4:write_shu16(1*2,2*8,shi,1);break;
- case 5:write_shu16(1*2,6*8,fen,1);break;
- case 6:write_shu16(1*2,10*8,miao,1);break;
- case 7:write_yhanzi(1,4,5*16,xingqi[week]);break;
- }
- write_time(); //把時(shí)間寫(xiě)進(jìn)去
- }
- }
- /*********************定時(shí)器0、定時(shí)器1初始化******************/
- void time0_init()
- {
- EA=1; //開(kāi)總中斷
- TMOD=0X11; //定時(shí)器0、定時(shí)器1工作方式1
- ET0=1; //開(kāi)定時(shí)器0中斷
- TR0=1; //允許定時(shí)器0定時(shí)
- }
- void baozhan()
- {
- if(key_zhantai==0)
- {
- delay_1ms(20);
- if(key_zhantai==0)
- {
- qingling();
- x_mode=1;
- s_mode=0;
- x_num=0;
- s_num=0;
- x_LED=0;
- s_LED=0;
-
- write_yhanzi(1,4,0*16,yihaozhan[0]); //一
- write_yhanzi(1,4,1*16,yihaozhan[1]); //號(hào)
- write_yhanzi(1,4,2*16,yihaozhan[2]); //站
- write_yhanzi(1,4,4*16,erhaozhan[0]); //二
- write_yhanzi(1,4,5*16,erhaozhan[1]); //號(hào)
- write_yhanzi(1,4,6*16,erhaozhan[2]); //站
-
- write_yhanzi(1,6,0*16,sanhaozhan[0]); //三
- write_yhanzi(1,6,1*16,sanhaozhan[1]); //號(hào)
- write_yhanzi(1,6,2*16,sanhaozhan[2]); //站
- write_yhanzi(1,6,4*16,sinhaozhan[0]); //四
- write_yhanzi(1,6,5*16,sinhaozhan[1]); //號(hào)
- write_yhanzi(1,6,6*16,sinhaozhan[2]); //站
- }
- while(!key_zhantai);
- }
- if(x_key==0 || key_gongjiao==0)
- {
- delay_1ms(20);
- if(x_key==0 || key_gongjiao==0)
- {
- qingling();
- x_mode=1;
- s_mode=0;
- x_num=0;
- s_num=0;
- x_LED=0;
- s_LED=1;
- write_yhanzi(1,4,0*16,daoda[0]); //到
- write_yhanzi(1,4,1*16,daoda[1]); //達(dá)
- write_shuzi(1,2*2,4*8,fuhao[1],0);//:
- write_yhanzi(1,6,0*16,xiayizhan[0]); //下
- write_yhanzi(1,6,1*16,xiayizhan[1]); //站
- write_shuzi(1,3*2,4*8,fuhao[1],0); //:
- }
- while((!x_key) || (!key_gongjiao));
- }
- if(s_key==0 || key_gongjiao==0)
- {
- delay_1ms(20);
- if(s_key==0 || key_gongjiao==0)
- {
- qingling();
- x_mode=0;
- s_mode=1;
- x_num=0;
- s_num=0;
- x_LED=1;
- s_LED=0;
- write_yhanzi(1,4,0*16,daoda[0]); //到
- write_yhanzi(1,4,1*16,daoda[1]); //達(dá)
- write_shuzi(1,2*2,4*8,fuhao[1],0);//:
- write_yhanzi(1,6,0*16,xiayizhan[0]); //下
- write_yhanzi(1,6,1*16,xiayizhan[1]); //站
- write_shuzi(1,3*2,4*8,fuhao[1],0); //:
- }
- while((!s_key) || (!key_gongjiao));
- }
- if((bz_key==0)&&(x_mode==1))
- {
- delay(20);
- if((bz_key==0)&&(x_mode==1))
- {
- x_num++;
- x_num%=6;
- }
- while(!bz_key);
- }
- if((bz_key==0)&&(s_mode==1))
- {
- delay(20);
- if((bz_key==0)&&(s_mode==1))
- {
- s_num++;
- s_num%=6;
- }
- while(!bz_key);
- }
- if(gb_key==0)
- {
- delay_1ms(20);
- if(gb_key==0)
- {
- x_mode=0;
- s_mode=0;
- x_num=0;
- s_num=0;
- x_LED=1;
- s_LED=1;
- qingling();
- }
- }
- }
- void yuyin()
- {
- /******************************下行報(bào)站顯示***********/
- if(x_num==1)
- {
- write_yhanzi(1,4,3*16,yihaozhan[0]); //一
- write_yhanzi(1,4,4*16,yihaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,yihaozhan[2]); //站
- write_yhanzi(1,6,3*16,erhaozhan[0]); //二
- write_yhanzi(1,6,4*16,erhaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,erhaozhan[2]); //站
- putstring("列車(chē)即將出發(fā),從成都東開(kāi)往西安北\r\n"); //發(fā)送字符串,結(jié)尾回車(chē)換行
- delay(500);
-
- }
- if(x_num==2)
- {
- write_yhanzi(1,4,3*16,erhaozhan[0]); //二
- write_yhanzi(1,4,4*16,erhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,erhaozhan[2]); //站
- write_yhanzi(1,6,3*16,sanhaozhan[0]); //三
- write_yhanzi(1,6,4*16,sanhaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,sanhaozhan[2]); //站
- putstring("列車(chē)即將到達(dá)漢中站\r\n"); //發(fā)送字符串,結(jié)尾回車(chē)換行
- delay(500);
- putstring("漢中站到了\r\n");
- }
- if(x_num==3)
- {
- write_yhanzi(1,4,3*16,sanhaozhan[0]); //三
- write_yhanzi(1,4,4*16,sanhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,sanhaozhan[2]); //站
- write_yhanzi(1,6,3*16,sinhaozhan[0]); //四
- write_yhanzi(1,6,4*16,sinhaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,sinhaozhan[2]); //站
- }
- if(x_num==4)
- {
- write_yhanzi(1,4,3*16,sinhaozhan[0]); //四
- write_yhanzi(1,4,4*16,sinhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,sinhaozhan[2]); //站
- write_yhanzi(1,6,3*16,zhongdianzhan[0]); //終
- write_yhanzi(1,6,4*16,zhongdianzhan[1]); //點(diǎn)
- write_yhanzi(1,6,5*16,zhongdianzhan[2]); //站
- }
- if(x_num==5)
- {
- write_yhanzi(1,4,3*16,zhongdianzhan[0]); //終
- write_yhanzi(1,4,4*16,zhongdianzhan[1]); //點(diǎn)
- write_yhanzi(1,4,5*16,zhongdianzhan[2]); //站
- write_yhanzi(1,6,0*16,ganxiechengzuo[0]); //感
- write_yhanzi(1,6,1*16,ganxiechengzuo[1]); //謝
- write_yhanzi(1,6,2*16,ganxiechengzuo[2]); //乘
- write_yhanzi(1,6,3*16,ganxiechengzuo[3]); //坐
- write_yhanzi(1,6,4*16,ganxiechengzuo[4]); //本
- write_yhanzi(1,6,5*16,ganxiechengzuo[5]); //公
- write_yhanzi(1,6,6*16,ganxiechengzuo[6]); //車(chē)
- }
- /******************************上行報(bào)站顯示***********/
- if(s_num==1)
- {
- write_yhanzi(1,4,3*16,sinhaozhan[0]); //四
- write_yhanzi(1,4,4*16,sinhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,sinhaozhan[2]); //站
- write_yhanzi(1,6,3*16,sanhaozhan[0]); //三
- write_yhanzi(1,6,4*16,sanhaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,sanhaozhan[2]); //站
- }
- if(s_num==2)
- {
- write_yhanzi(1,4,3*16,sanhaozhan[0]); //三
- write_yhanzi(1,4,4*16,sanhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,sanhaozhan[2]); //站
- write_yhanzi(1,6,3*16,erhaozhan[0]); //二
- write_yhanzi(1,6,4*16,erhaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,erhaozhan[2]); //站
- }
- if(s_num==3)
- {
- write_yhanzi(1,4,3*16,erhaozhan[0]); //二
- write_yhanzi(1,4,4*16,erhaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,erhaozhan[2]); //站
- write_yhanzi(1,6,3*16,yihaozhan[0]); //一
- write_yhanzi(1,6,4*16,yihaozhan[1]); //號(hào)
- write_yhanzi(1,6,5*16,yihaozhan[2]); //站
- }
- if(s_num==4)
- {
- write_yhanzi(1,4,3*16,yihaozhan[0]); //一
- write_yhanzi(1,4,4*16,yihaozhan[1]); //號(hào)
- write_yhanzi(1,4,5*16,yihaozhan[2]); //站
- write_yhanzi(1,6,3*16,zhongdianzhan[0]); //終
- write_yhanzi(1,6,4*16,zhongdianzhan[1]); //點(diǎn)
- write_yhanzi(1,6,5*16,zhongdianzhan[2]); //站
- }
- if(s_num==5)
- {
- write_yhanzi(1,4,3*16,zhongdianzhan[0]); //終
- write_yhanzi(1,4,4*16,zhongdianzhan[1]); //點(diǎn)
- write_yhanzi(1,4,5*16,zhongdianzhan[2]); //站
- write_yhanzi(1,6,0*16,ganxiechengzuo[0]); //感
- write_yhanzi(1,6,1*16,ganxiechengzuo[1]); //謝
- write_yhanzi(1,6,2*16,ganxiechengzuo[2]); //乘
- write_yhanzi(1,6,3*16,ganxiechengzuo[3]); //坐
- write_yhanzi(1,6,4*16,ganxiechengzuo[4]); //本
- write_yhanzi(1,6,5*16,ganxiechengzuo[5]); //公
- write_yhanzi(1,6,6*16,ganxiechengzuo[6]); //車(chē)
- }
- }
- void main()
- {
- x_key=1;
- s_key=1;
- bz_key=1;
- gb_key=1;
- x_LED=1;
- s_LED=1;
- P0=P1=P2=P3=0xff; //單片機(jī)IO口初始化為1
- init_ds1302();
- delay_1ms(5);
- init_lcd();
- delay_1ms(5);
- Clr_Scr();
- time0_init();
- delay_1ms(5);
- init_12864_dis(); //初始化顯示
- delay_1ms(5);
- uart_cfg();
- while(1)
- {
- baozhan(); //顯示上站和下站字頭
- yuyin(); //顯示上站和下站是哪一站
- key(); //改變key_san的值,判斷K1-K4哪個(gè)鍵按下即設(shè)置時(shí)間的4個(gè)鍵哪個(gè)被按下
- if(key_can<10)
- {
- key_with(); //根據(jù)key_san的值執(zhí)行相應(yīng)程序
- }
- if(flag_100ms==1)
- {
- flag_100ms=0;
- }
- if(flag_200ms==1) //200ms
- {
- flag_200ms=0;
- temperature=read_temp(); //先讀出溫度的值
- ds1302_dis(); //時(shí)鐘顯示函數(shù),同時(shí)顯示溫度函數(shù)也在里面
- }
- }
- }
- /*********************定時(shí)器0中斷服務(wù)程序************************/
- void time0_int() interrupt 1
- {
- static uchar value; //定時(shí)10ms中斷一次
- TH0=0x3c;
- TL0=0xb0; //50ms
- value++;
- if(value%2==0)
- {
- flag_100ms=1; //每20ms置flag_100ms位1一次
- }
- if(value%20==0) //每200ms置flag_200ms為1一次
- {
- flag_200ms = 1;
- }
- }
復(fù)制代碼 仿真用串口模擬語(yǔ)音播報(bào),gps沒(méi)法仿真,Proteus版本是8.11,其他版本可能不兼容
Keil代碼與Proteus8.11仿真下載:
程序.7z
(1 MB, 下載次數(shù): 81)
2022-3-21 23:29 上傳
點(diǎn)擊文件名下載附件
基于STC單片機(jī)公交語(yǔ)音報(bào)站系統(tǒng)設(shè)計(jì) 下載積分: 黑幣 -5
|
stc89c52, ds1302, 18b20, stc89c52, ds1302, 18b20, 公交, 語(yǔ)音, stc89c52, ds1302, 18b20
評(píng)分
-
查看全部評(píng)分
|