|
系统的总体设计需要充分运用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回到开机显示的界面。
单片机源程序如下:
- #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)
|
stc89c52, ds1302, 18b20, stc89c52, ds1302, 18b20, 公交, 语音, stc89c52, ds1302, 18b20
评分
-
查看全部评分
|