久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3828|回復: 6
打印 上一主題 下一主題
收起左側

基于單片機公交語音報站系統設計 含源碼,Proteus仿真原理圖

[復制鏈接]
跳轉到指定樓層
樓主
系統的總體設計需要充分運用STC單片機作為主控控制芯片,完成主控控制電路的基本設計,輔助控制電路是語音控制電路、12864顯示電路、按鍵控制電路、GPS電路、LED顯示、溫度和時鐘模塊。仿真用串口模擬語音播報,gps沒法仿真

電路原理圖如下:


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刷新一次時間和溫度顯示數值。

液晶顯示程序
初始化12864液晶屏,開機只顯示時間和溫度信息。如果按站臺顯示按鍵,則會顯示站臺信息,如一號站,二號站,三號站,四號站。按下公交車信息顯示按鍵,則會顯示公交車內信息。按上下行設置鍵則會顯示到達和下站,再按下手動播報鍵會接著顯示本站和下站是哪站,按下關閉播報鍵回到開機只顯示時間和溫度界面。按下K1選擇鍵會進入時間設置界面,反復按K1黑格會在年月日時分秒上跳動,再按加減鍵K2,K3進行數值調節,設置完畢按確定鍵K4回到開機顯示的界面。


單片機源程序如下:
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #include "value.h"
  5. #include <UART.h>
  6. sbit x_key=P1^3;
  7. sbit s_key=P1^4;
  8. sbit bz_key=P1^5;
  9. sbit gb_key=P1^6;
  10. sbit x_LED=P2^6;
  11. sbit s_LED=P2^7;
  12. sbit key_zhantai=P3^7;
  13. sbit key_gongjiao=P1^7;
  14. uchar x_mode,s_mode;
  15. uchar x_num,s_num;
  16. bit flag_200ms = 1;
  17. uchar flag_c_en;
  18. bit flag_100ms;
  19. sbit dq=P3^2;          //18b20 IO口的定義
  20. uint temperature ;    //溫度變量
  21. uint flag_zhantai ;    //站臺顯示標志位
  22. uint flag_gongjiao ;    //公交顯示標志位
  23. /************ 延時函數  *****************/
  24. void delay_uint(uint z)
  25. {
  26. while(z--);
  27. }
  28. /********************************************************************
  29. * 名稱 : delay_1ms()
  30. * 功能 : 延時1ms函數
  31. * 輸入 : q
  32. * 輸出 : 無
  33. ***********************************************************************/
  34. void delay_1ms(uint q)
  35. {        
  36. uint i,j;
  37. for(i=0;i<q;i++)
  38. for(j=0;j<115;j++);
  39. }
  40. uchar dis_lcd[10];
  41. #include "lcd12864bu.h"
  42. /******************顯示時間函數***************************/
  43. void dis_shijian()        //顯示時間
  44. {
  45. write_shu16(0,0*8,shi,0);
  46. write_shuzi(1,0*2,2*8,fuhao[1],0);               
  47. write_shu16(0,3*8,fen,0);        
  48. write_shuzi(1,0*2,5*8,fuhao[1],0);               
  49. write_shu16(0,6*8,miao,0);

  50. write_yhanzi(2,0,5*16,qita[6]);   //星期
  51. //write_shu16(0,14*8,week,0);
  52. if(week==0)
  53. {
  54.   write_yhanzi(1,0,7*16,xingqi[0]);
  55. }
  56. if(week==1)
  57. {
  58.   write_yhanzi(1,0,7*16,xingqi[1]);  
  59. }
  60. if(week==2)
  61. {
  62.   write_yhanzi(1,0,7*16,xingqi[2]);   
  63. }
  64. if(week==3)
  65. {
  66.   write_yhanzi(1,0,7*16,xingqi[3]);   
  67. }
  68. if(week==4)
  69. {
  70.   write_yhanzi(1,0,7*16,xingqi[4]);   
  71. }
  72. if(week==5)
  73. {
  74.   write_yhanzi(1,0,7*16,xingqi[5]);   
  75. }
  76. if(week==6)
  77. {
  78.   write_yhanzi(1,0,7*16,xingqi[6]);   
  79. }
  80. write_shu16(1*2,0*8,0x20,0);
  81. write_shu16(1*2,2*8,nian,0);
  82. write_shuzi(1,1*2,4*8,fuhao[0],0);        
  83. write_shu16(1*2,5*8,yue,0);
  84. write_shuzi(1,1*2,7*8,fuhao[0],0);        
  85. write_shu16(1*2,8*8,ri,0);

  86. write_shu18b20(1*2,12*8,temperature,0);        
  87. write_shuzi(1,1*2,14*8,dian,0);
  88. }
  89. /************初始化顯示*****************/
  90. void init_12864_dis() //初始化顯示
  91. {
  92. cs1=1; //左屏開顯示
  93. cs2=0;               
  94. dis_shijian();        //顯示時間        
  95. }
  96. /***********************18b20初始化函數*****************************/
  97. void init_18b20()
  98. {
  99. bit q;
  100. dq=1;                                //把總線拿高
  101. delay_uint(1);            //15us
  102. dq=0;                                //給復位脈沖
  103. delay_uint(80);                //750us
  104. dq=1;                                //把總線拿高 等待
  105. delay_uint(10);                //110us
  106. q=dq;                                //讀取18b20初始化信號
  107. delay_uint(20);                //200us
  108. dq=1;                                //把總線拿高 釋放總線
  109. }

  110. /*************寫18b20內的數據***************/
  111. void write_18b20(uchar dat)
  112. {
  113. uchar i;
  114. for(i=0;i<8;i++)
  115. {                                         //寫數據是低位開始
  116.   dq=0;                         //把總線拿低寫時間隙開始
  117.   dq=dat&0x01; //向18b20總線寫數據了
  118.   delay_uint(5);         // 60us
  119.   dq=1;                         //釋放總線
  120.   dat>>=1;
  121. }        
  122. }

  123. /*************讀取18b20內的數據***************/
  124. uchar read_18b20()
  125. {
  126. uchar i,value;
  127. for(i=0;i<8;i++)
  128. {
  129.   dq=0;                         //把總線拿低讀時間隙開始
  130.   value>>= 1;         //讀數據是低位開始
  131.   dq=1;                         //釋放總線
  132.   if(dq==1)                 //開始讀寫數據
  133.   value|=0x80;
  134.   delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
  135. }
  136. return value;                 //返回數據
  137. }

  138. /*************讀取溫度的值 讀出來的是小數***************/
  139. uint read_temp()
  140. {
  141. uint value;
  142. uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
  143. init_18b20();                   //初始化18b20
  144. write_18b20(0xcc);           //跳過64位ROM
  145. write_18b20(0x44);           //啟動一次溫度轉換命令
  146. delay_uint(50);                   //500us

  147. init_18b20();                   //初始化18b20        
  148. write_18b20(0xcc);           //跳過64位ROM
  149. write_18b20(0xbe);           //發出讀取暫存器命令
  150.         
  151. EA=0;
  152. low=read_18b20();           //讀溫度低字節
  153. value=read_18b20();  //讀溫度高字節
  154. EA =1;
  155. value<<=8;                   //把溫度的高位左移8位
  156. value|=low;                   //把讀出的溫度低位放到value的低八位中
  157. value*=0.625;               //轉換到溫度值 小數
  158. return value;                   //返回讀出的溫度 帶小數
  159. }

  160. /******************顯示時間函數***************************/
  161. void dis_shijian_set()        //顯示時間
  162. {
  163. write_shu16(0*2,0*8,0x20,0);
  164. write_shu16(1*2,2*8,shi,0);
  165. write_shu16(1*2,6*8,fen,0);        
  166. write_shu16(1*2,10*8,miao,0);

  167. write_shu16(0*2,2*8,nian,0);        
  168. write_shu16(0*2,6*8,yue,0);        
  169. write_shu16(0*2,10*8,ri,0);

  170. write_yhanzi(1,4,5*16,xingqi[week]);                        
  171. }
  172. /************初始化設置顯示*****************/
  173. void init_12864_set1()
  174. {
  175. write_yhanzi(1,0,2*16,qita[0]);   //年
  176. write_yhanzi(1,0,4*16,qita[1]);   //月
  177. write_yhanzi(1,0,6*16,qita[2]);   //日

  178. write_yhanzi(1,2,2*16,qita[3]);   //時
  179. write_yhanzi(1,2,4*16,qita[4]);   //分
  180. write_yhanzi(1,2,6*16,qita[5]);   //秒
  181. write_yhanzi(2,4,3*16,qita[6]);   //星期

  182. dis_shijian_set();        //顯示時間
  183. }

  184. /******************時間芯片顯示函數**********************/           
  185. void ds1302_dis()
  186. {
  187. uchar miao_1;
  188. if(menu_1 == 0)
  189. {
  190.   read_time();
  191.   if(miao_1 != miao)
  192.   {
  193.    miao_1 = miao;
  194.    dis_shijian();        //顯示時間
  195.   }
  196. }
  197. }

  198. /********************獨立按鍵程序*****************/
  199. uchar key_can;         //按鍵值
  200. void key()         //獨立按鍵程序
  201. {
  202. static uchar key_new;
  203. key_can=20;                   //按鍵值還原
  204. P3|=0x78;                     //對應的按鍵IO口輸出為1
  205. if((P3&0x78)!=0x78)                //按鍵按下
  206. {
  207.   delay_1ms(1);                     //按鍵消抖動
  208.   if(((P3&0x78)!=0x78)&&(key_new==1))
  209.   {                                                //確認是按鍵按下
  210.    key_new=0;
  211.    switch(P3&0x78)
  212.    {
  213.                 case 0x70:key_can=1;break;         //得到按鍵值
  214.                 case 0x68:key_can=2;break;         //得到按鍵值
  215.                 case 0x58:key_can=3;break;         //得到按鍵值
  216.                 case 0x38:key_can=4;break;         //得到按鍵值
  217.    }
  218.   }                        
  219. }
  220. else
  221. key_new=1;        
  222. }

  223. /**********************設置函數************************/
  224. void key_with()
  225. {
  226. if(key_can==4)   //退出鍵
  227. {
  228.   qingling();
  229.   init_12864_dis(); //初始化顯示
  230.   flag_200ms=1;
  231.   menu_1=0;
  232. }
  233. if(key_can==1)        //設置鍵
  234. {
  235.   menu_1 ++;
  236.   flag_200ms=1;
  237.   if(menu_1==1)
  238.   {
  239.    x_num=0;
  240.    s_num=0;
  241.    x_mode=0;
  242.    s_mode=0;
  243.    qingling();
  244.    init_12864_set1();
  245.   }
  246.   if(menu_1>7)
  247.   menu_1 = 1;
  248. }
  249. if(menu_1!=0)
  250. {
  251.   if(menu_1==1)                  //設置年
  252.   {
  253.    if(key_can==2)        //加
  254.    set_ds1302time(1,&nian,0x99);               
  255.    if(key_can==3)        //減         
  256.    set_ds1302time(0,&nian,0x99);        
  257.   }
  258.   if(menu_1==2)                  //設置月
  259.   {
  260.    if(key_can==2)        //加
  261.    set_ds1302time(1,&yue,0x13);               
  262.    if(key_can==3)        //減         
  263.    set_ds1302time(0,&yue,0x13);        
  264.   }
  265.   if(menu_1==3)                  //設置日
  266.   {
  267.    if(key_can==2)        //加
  268.    set_ds1302time(1,&ri,0x32);               
  269.    if(key_can==3)        //減         
  270.    set_ds1302time(0,&ri,0x32);        
  271.   }
  272.   if(menu_1==4)                  //設置時
  273.   {
  274.    if(key_can==4)        //加
  275.    set_ds1302time(1,&shi,0x24);               
  276.    if(key_can==3)        //減         
  277.    set_ds1302time(0,&shi,0x24);        
  278.   }
  279.   if(menu_1==5)                  //設置分
  280.   {
  281.    if(key_can==2)        //加
  282.    set_ds1302time(1,&fen,0x60);               
  283.    if(key_can==3)        //減         
  284.    set_ds1302time(0,&fen,0x60);        
  285.   }
  286.   if(menu_1==6)                  //設置秒
  287.   {
  288.    if(key_can==2)        //加
  289.    set_ds1302time(1,&miao,0x60);               
  290.    if(key_can==3)        //減         
  291.    set_ds1302time(0,&miao,0x60);        
  292.   }
  293.   if(menu_1==7)                  //設置星期
  294.   {
  295.    if(key_can==2)        //加
  296.    set_ds1302time(1,&week,0x8);               
  297.    if(key_can==3)        //減         
  298.    set_ds1302time(0,&week,0x8);        
  299.   }
  300.   dis_shijian_set();        //顯示時間
  301.   switch(menu_1)           // 光標顯示
  302.   {
  303.    case 1:write_shu16(0*2,2*8,nian,1);break;
  304.    case 2:write_shu16(0*2,6*8,yue,1);break;
  305.    case 3:write_shu16(0*2,10*8,ri,1);break;
  306.    case 4:write_shu16(1*2,2*8,shi,1);break;
  307.    case 5:write_shu16(1*2,6*8,fen,1);break;
  308.    case 6:write_shu16(1*2,10*8,miao,1);break;
  309.    case 7:write_yhanzi(1,4,5*16,xingqi[week]);break;
  310.   }
  311.   write_time();           //把時間寫進去
  312. }                        
  313. }
  314. /*********************定時器0、定時器1初始化******************/
  315. void time0_init()         
  316. {                                         
  317. EA=1;                   //開總中斷
  318. TMOD=0X11;          //定時器0、定時器1工作方式1
  319. ET0=1;                  //開定時器0中斷
  320. TR0=1;                  //允許定時器0定時
  321. }

  322. void baozhan()
  323. {
  324.         if(key_zhantai==0)
  325. {
  326.   delay_1ms(20);
  327.   if(key_zhantai==0)
  328.   {
  329.    qingling();
  330.    x_mode=1;
  331.    s_mode=0;
  332.    x_num=0;
  333.    s_num=0;
  334.    x_LED=0;
  335.    s_LED=0;
  336.                
  337.         write_yhanzi(1,4,0*16,yihaozhan[0]);   //一
  338.   write_yhanzi(1,4,1*16,yihaozhan[1]);   //號
  339.   write_yhanzi(1,4,2*16,yihaozhan[2]);   //站

  340.   write_yhanzi(1,4,4*16,erhaozhan[0]);   //二
  341.   write_yhanzi(1,4,5*16,erhaozhan[1]);   //號
  342.   write_yhanzi(1,4,6*16,erhaozhan[2]);   //站
  343.         
  344.         write_yhanzi(1,6,0*16,sanhaozhan[0]);   //三
  345.   write_yhanzi(1,6,1*16,sanhaozhan[1]);   //號
  346.   write_yhanzi(1,6,2*16,sanhaozhan[2]);   //站

  347.   write_yhanzi(1,6,4*16,sinhaozhan[0]);   //四
  348.   write_yhanzi(1,6,5*16,sinhaozhan[1]);   //號
  349.   write_yhanzi(1,6,6*16,sinhaozhan[2]);   //站
  350.   }
  351.   while(!key_zhantai);
  352. }

  353. if(x_key==0 || key_gongjiao==0)
  354. {
  355.   delay_1ms(20);
  356.   if(x_key==0 || key_gongjiao==0)
  357.   {
  358.    qingling();
  359.    x_mode=1;
  360.    s_mode=0;
  361.    x_num=0;
  362.    s_num=0;
  363.    x_LED=0;
  364.    s_LED=1;
  365.    write_yhanzi(1,4,0*16,daoda[0]);   //到
  366.    write_yhanzi(1,4,1*16,daoda[1]);   //達
  367.    write_shuzi(1,2*2,4*8,fuhao[1],0);//:

  368.    write_yhanzi(1,6,0*16,xiayizhan[0]);   //下
  369.    write_yhanzi(1,6,1*16,xiayizhan[1]);   //站
  370.    write_shuzi(1,3*2,4*8,fuhao[1],0); //:
  371.   }
  372.   while((!x_key) || (!key_gongjiao));
  373. }
  374. if(s_key==0 || key_gongjiao==0)
  375. {
  376.   delay_1ms(20);
  377.   if(s_key==0 || key_gongjiao==0)
  378.   {
  379.    qingling();
  380.    x_mode=0;
  381.    s_mode=1;
  382.    x_num=0;
  383.    s_num=0;
  384.    x_LED=1;
  385.    s_LED=0;
  386.    write_yhanzi(1,4,0*16,daoda[0]);   //到
  387.    write_yhanzi(1,4,1*16,daoda[1]);   //達
  388.    write_shuzi(1,2*2,4*8,fuhao[1],0);//:

  389.    write_yhanzi(1,6,0*16,xiayizhan[0]);   //下
  390.    write_yhanzi(1,6,1*16,xiayizhan[1]);   //站
  391.    write_shuzi(1,3*2,4*8,fuhao[1],0); //:
  392.   }
  393.   while((!s_key) || (!key_gongjiao));
  394. }
  395. if((bz_key==0)&&(x_mode==1))
  396. {
  397.   delay(20);
  398.   if((bz_key==0)&&(x_mode==1))
  399.   {
  400.                 x_num++;  
  401.           x_num%=6;
  402.                 }
  403.                   while(!bz_key);
  404.   }
  405. if((bz_key==0)&&(s_mode==1))
  406. {
  407.   delay(20);
  408.         if((bz_key==0)&&(s_mode==1))
  409.   {
  410.                 s_num++;  
  411.           s_num%=6;
  412.   }
  413.   while(!bz_key);
  414. }
  415. if(gb_key==0)
  416. {
  417.   delay_1ms(20);
  418.   if(gb_key==0)
  419.   {
  420.            x_mode=0;
  421.     s_mode=0;
  422.     x_num=0;
  423.     s_num=0;
  424.         x_LED=1;
  425.     s_LED=1;
  426.         qingling();
  427.   }
  428. }
  429. }
  430. void yuyin()
  431. {
  432. /******************************下行報站顯示***********/
  433. if(x_num==1)
  434. {
  435.   write_yhanzi(1,4,3*16,yihaozhan[0]);   //一
  436.   write_yhanzi(1,4,4*16,yihaozhan[1]);   //號
  437.   write_yhanzi(1,4,5*16,yihaozhan[2]);   //站

  438.   write_yhanzi(1,6,3*16,erhaozhan[0]);   //二
  439.   write_yhanzi(1,6,4*16,erhaozhan[1]);   //號
  440.   write_yhanzi(1,6,5*16,erhaozhan[2]);   //站
  441.                  putstring("列車即將出發,從成都東開往西安北\r\n");      //發送字符串,結尾回車換行
  442.                   delay(500);
  443.         
  444. }
  445. if(x_num==2)
  446. {
  447.   write_yhanzi(1,4,3*16,erhaozhan[0]);   //二
  448.   write_yhanzi(1,4,4*16,erhaozhan[1]);   //號
  449.   write_yhanzi(1,4,5*16,erhaozhan[2]);   //站

  450.   write_yhanzi(1,6,3*16,sanhaozhan[0]);   //三
  451.   write_yhanzi(1,6,4*16,sanhaozhan[1]);   //號
  452.   write_yhanzi(1,6,5*16,sanhaozhan[2]);   //站
  453.                           putstring("列車即將到達漢中站\r\n");      //發送字符串,結尾回車換行
  454.                           delay(500);
  455.                  putstring("漢中站到了\r\n");
  456. }

  457. if(x_num==3)
  458. {
  459.   write_yhanzi(1,4,3*16,sanhaozhan[0]);   //三
  460.   write_yhanzi(1,4,4*16,sanhaozhan[1]);   //號
  461.   write_yhanzi(1,4,5*16,sanhaozhan[2]);   //站

  462.   write_yhanzi(1,6,3*16,sinhaozhan[0]);   //四
  463.   write_yhanzi(1,6,4*16,sinhaozhan[1]);   //號
  464.   write_yhanzi(1,6,5*16,sinhaozhan[2]);   //站
  465. }
  466. if(x_num==4)
  467. {
  468.   write_yhanzi(1,4,3*16,sinhaozhan[0]);   //四
  469.   write_yhanzi(1,4,4*16,sinhaozhan[1]);   //號
  470.   write_yhanzi(1,4,5*16,sinhaozhan[2]);   //站

  471.   write_yhanzi(1,6,3*16,zhongdianzhan[0]);   //終
  472.   write_yhanzi(1,6,4*16,zhongdianzhan[1]);   //點
  473.   write_yhanzi(1,6,5*16,zhongdianzhan[2]);   //站
  474. }
  475. if(x_num==5)
  476. {
  477.   write_yhanzi(1,4,3*16,zhongdianzhan[0]);   //終
  478.   write_yhanzi(1,4,4*16,zhongdianzhan[1]);   //點
  479.   write_yhanzi(1,4,5*16,zhongdianzhan[2]);   //站

  480.   write_yhanzi(1,6,0*16,ganxiechengzuo[0]);   //感
  481.   write_yhanzi(1,6,1*16,ganxiechengzuo[1]);   //謝
  482.   write_yhanzi(1,6,2*16,ganxiechengzuo[2]);   //乘
  483.   write_yhanzi(1,6,3*16,ganxiechengzuo[3]);   //坐
  484.   write_yhanzi(1,6,4*16,ganxiechengzuo[4]);   //本
  485.   write_yhanzi(1,6,5*16,ganxiechengzuo[5]);   //公
  486.   write_yhanzi(1,6,6*16,ganxiechengzuo[6]);   //車

  487. }
  488. /******************************上行報站顯示***********/
  489. if(s_num==1)
  490. {
  491.   write_yhanzi(1,4,3*16,sinhaozhan[0]);   //四
  492.   write_yhanzi(1,4,4*16,sinhaozhan[1]);   //號
  493.   write_yhanzi(1,4,5*16,sinhaozhan[2]);   //站

  494.   write_yhanzi(1,6,3*16,sanhaozhan[0]);   //三
  495.   write_yhanzi(1,6,4*16,sanhaozhan[1]);   //號
  496.   write_yhanzi(1,6,5*16,sanhaozhan[2]);   //站

  497. }
  498. if(s_num==2)
  499. {
  500.   write_yhanzi(1,4,3*16,sanhaozhan[0]);   //三
  501.   write_yhanzi(1,4,4*16,sanhaozhan[1]);   //號
  502.   write_yhanzi(1,4,5*16,sanhaozhan[2]);   //站

  503.   write_yhanzi(1,6,3*16,erhaozhan[0]);   //二
  504.   write_yhanzi(1,6,4*16,erhaozhan[1]);   //號
  505.   write_yhanzi(1,6,5*16,erhaozhan[2]);   //站
  506. }
  507. if(s_num==3)
  508. {
  509.   write_yhanzi(1,4,3*16,erhaozhan[0]);   //二
  510.   write_yhanzi(1,4,4*16,erhaozhan[1]);   //號
  511.   write_yhanzi(1,4,5*16,erhaozhan[2]);   //站

  512.   write_yhanzi(1,6,3*16,yihaozhan[0]);   //一
  513.   write_yhanzi(1,6,4*16,yihaozhan[1]);   //號
  514.   write_yhanzi(1,6,5*16,yihaozhan[2]);   //站
  515. }
  516. if(s_num==4)
  517. {
  518.   write_yhanzi(1,4,3*16,yihaozhan[0]);   //一
  519.   write_yhanzi(1,4,4*16,yihaozhan[1]);   //號
  520.   write_yhanzi(1,4,5*16,yihaozhan[2]);   //站

  521.   write_yhanzi(1,6,3*16,zhongdianzhan[0]);   //終
  522.   write_yhanzi(1,6,4*16,zhongdianzhan[1]);   //點
  523.   write_yhanzi(1,6,5*16,zhongdianzhan[2]);   //站
  524. }
  525. if(s_num==5)
  526. {
  527.   write_yhanzi(1,4,3*16,zhongdianzhan[0]);   //終
  528.   write_yhanzi(1,4,4*16,zhongdianzhan[1]);   //點
  529.   write_yhanzi(1,4,5*16,zhongdianzhan[2]);   //站

  530.   write_yhanzi(1,6,0*16,ganxiechengzuo[0]);   //感
  531.   write_yhanzi(1,6,1*16,ganxiechengzuo[1]);   //謝
  532.   write_yhanzi(1,6,2*16,ganxiechengzuo[2]);   //乘
  533.   write_yhanzi(1,6,3*16,ganxiechengzuo[3]);   //坐
  534.   write_yhanzi(1,6,4*16,ganxiechengzuo[4]);   //本
  535.   write_yhanzi(1,6,5*16,ganxiechengzuo[5]);   //公
  536.   write_yhanzi(1,6,6*16,ganxiechengzuo[6]);   //車
  537. }
  538. }

  539. void main()
  540. {
  541. x_key=1;
  542. s_key=1;
  543. bz_key=1;
  544. gb_key=1;
  545. x_LED=1;
  546. s_LED=1;
  547. P0=P1=P2=P3=0xff;                //單片機IO口初始化為1        
  548. init_ds1302();
  549. delay_1ms(5);
  550. init_lcd();
  551. delay_1ms(5);        
  552. Clr_Scr();
  553. time0_init();
  554. delay_1ms(5);
  555. init_12864_dis(); //初始化顯示
  556. delay_1ms(5);
  557.                          uart_cfg();        
  558. while(1)
  559. {
  560.   baozhan();          //顯示上站和下站字頭
  561.   yuyin();            //顯示上站和下站是哪一站
  562.   key();                    //改變key_san的值,判斷K1-K4哪個鍵按下即設置時間的4個鍵哪個被按下
  563.   if(key_can<10)  
  564.   {
  565.    key_with();              //根據key_san的值執行相應程序
  566.   }
  567.   if(flag_100ms==1)
  568.   {         
  569.    flag_100ms=0;
  570.   }
  571.   if(flag_200ms==1)    //200ms
  572.   {
  573.    flag_200ms=0;
  574.    temperature=read_temp();        //先讀出溫度的值
  575.    ds1302_dis();    //時鐘顯示函數,同時顯示溫度函數也在里面
  576.   }
  577. }
  578. }

  579. /*********************定時器0中斷服務程序************************/
  580. void time0_int() interrupt 1  
  581. {                                                   
  582. static uchar value;        //定時10ms中斷一次
  583. TH0=0x3c;
  584. TL0=0xb0;         //50ms
  585. value++;
  586. if(value%2==0)
  587. {
  588.   flag_100ms=1;                //每20ms置flag_100ms位1一次
  589. }
  590. if(value%20==0)  //每200ms置flag_200ms為1一次
  591. {
  592.   flag_200ms = 1;
  593. }
  594. }
復制代碼
仿真用串口模擬語音播報,gps沒法仿真,Proteus版本是8.11,其他版本可能不兼容
Keil代碼與Proteus8.11仿真下載:
程序.7z (1 MB, 下載次數: 81)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:730009 發表于 2022-3-21 20:16 | 只看該作者
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

下載.png (218.18 KB, 下載次數: 104)

下載.png
回復

使用道具 舉報

板凳
ID:634028 發表于 2023-5-7 11:52 | 只看該作者
樓主,proteus仿真工程文件在哪里下載
回復

使用道具 舉報

地板
ID:641483 發表于 2023-5-13 13:17 | 只看該作者
謝謝樓主分享 收藏慢慢學習
回復

使用道具 舉報

5#
ID:1065790 發表于 2023-7-31 18:08 | 只看該作者
大佬,我想問一下,源文件里的文字用的漢字庫文件有嗎,能否分享一下
回復

使用道具 舉報

6#
ID:1147664 發表于 2025-4-10 19:27 | 只看該作者
這個東西蠻不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 羞羞羞视频 | 精品99在线 | 欧美日韩亚洲视频 | 亚洲成人毛片 | 久久青草av| 久久大陆 | 99视频网 | 国产一区二区三区四区在线观看 | 亚洲精品v | 精品成人佐山爱一区二区 | 国产视频一区二区 | 国内自拍视频在线观看 | 日韩成人精品一区二区三区 | 久久精品一| 综合色在线 | 福利久久 | 少妇性l交大片免费一 | 久久久成人网 | 成人欧美一区二区三区在线播放 | 亚洲协和影视 | 久久99视频 | 亚洲成人av在线播放 | 欧美性极品xxxx做受 | 伊人精品在线视频 | 久久久www成人免费无遮挡大片 | 欧美精品一区二区三区四区五区 | 日韩综合 | 午夜一区二区三区 | 久久久久久免费免费 | 99热在线观看精品 | 91社区在线高清 | 91在线一区二区三区 | 在线观看亚洲 | 99久久99热这里只有精品 | 欧洲精品码一区二区三区免费看 | 欧美aaaa视频 | aaa一区| 亚洲精品视频免费 | 久久国产精品-国产精品 | 日日干夜夜操 | 国产日韩中文字幕 |