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