找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3051|回复: 5
收起左侧

基于单片机公交语音报站系统设计 含源码,Proteus仿真原理图

[复制链接]
ID:730009 发表于 2022-3-21 19:33 | 显示全部楼层 |阅读模式
系统的总体设计需要充分运用STC单片机作为主控控制芯片,完成主控控制电路的基本设计,辅助控制电路是语音控制电路、12864显示电路、按键控制电路、GPS电路、LED显示、温度和时钟模块。仿真用串口模拟语音播报,gps没法仿真

电路原理图如下:
51hei.png

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
液晶显示程序
初始化12864液晶屏,开机只显示时间和温度信息。如果按站台显示按键,则会显示站台信息,如一号站,二号站,三号站,四号站。按下公交车信息显示按键,则会显示公交车内信息。按上下行设置键则会显示到达和下站,再按下手动播报键会接着显示本站和下站是哪站,按下关闭播报键回到开机只显示时间和温度界面。按下K1选择键会进入时间设置界面,反复按K1黑格会在年月日时分秒上跳动,再按加减键K2,K3进行数值调节,设置完毕按确定键K4回到开机显示的界面。
image002.png

单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:730009 发表于 2022-3-21 20:16 | 显示全部楼层
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
下载.png
回复

使用道具 举报

ID:634028 发表于 2023-5-7 11:52 | 显示全部楼层
楼主,proteus仿真工程文件在哪里下载
回复

使用道具 举报

ID:641483 发表于 2023-5-13 13:17 | 显示全部楼层
谢谢楼主分享 收藏慢慢学习
回复

使用道具 举报

ID:1065790 发表于 2023-7-31 18:08 | 显示全部楼层
大佬,我想问一下,源文件里的文字用的汉字库文件有吗,能否分享一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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