我用单片机定时器0作为LCD串行显示,能正常显示,但是加入定时器1作为波特率发生器后,LCD就不能显示了,这是由于定时器优先级的问题呢,还是主函数逻辑错误,WiFi模块这样写是不是有问题,各位大佬帮忙看一下。
单片机源程序如下:
- sbit beep = P2^0;//蜂鸣器
- sbit setKey = P3^3;//按键
- sbit addKey = P3^4;//
- sbit subKey = P3^5;//
- sbit paishui = P3^6;//排水---低电平触发
- sbit jiashui = P3^7;//加水
- long s,W;
- uchar table[40];//用于接收wifi模块反馈到MCU上的数据
- uchar code ta[]="0123456789- "; //测试一下
- uchar table[]="温度:00.0 C";//传送用定位模
- uchar Receive,i,xm1,xm2,xm3,xm0;
- uint tvalue;//定义一个全局变量,用来合高低8位温度//显示温度
- float dataV[4]= {0};
- unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};
- unsigned char lcd[8] = {0};
- void alarm();
- void delay(unsigned int i){//us
- while(i--);
- }
- void delayms(uint t) //
- {
- uint i,j;
- for(i=t;i>0;i--)
- for(j=110;j>0;j--);
- }
- float pre_ph_v, phv;
- void setKeyDeal();
- void addKeyDeal();
- void subKeyDeal();
- //初始化eeprom
- void init_eeprom(){
- unsigned char is_first_init = byte_read(0x2020);
- if(is_first_init == 1){
- dataTH[0] = byte_read(0x2000);
- dataTH[1] = byte_read(0x2001);
- dataTH[2] = byte_read(0x2002);
- dataTH[3] = byte_read(0x2003);
- dataTH[4] = byte_read(0x2004);
- dataTH[5] = byte_read(0x2005);
- dataTH[6] = byte_read(0x2006);
- dataTH[7] = byte_read(0x2007);
- }else{
- SectorErase(0x2000);
- byte_write(0x2000, dataTH[0]);
- byte_write(0x2001, dataTH[1]);
- byte_write(0x2002, dataTH[2]);
- byte_write(0x2003, dataTH[3]);
- byte_write(0x2004, dataTH[4]);
- byte_write(0x2005, dataTH[5]);
- byte_write(0x2006, dataTH[6]);
- byte_write(0x2007, dataTH[7]);
- byte_write(0x2020, 1);
- }
- }
- //更新eeprom存储的数据
- void update_eeprom(){
- SectorErase(0x2000);
- byte_write(0x2000, dataTH[0]);
- byte_write(0x2001, dataTH[1]);
- byte_write(0x2002, dataTH[2]);
- byte_write(0x2003, dataTH[3]);
- byte_write(0x2004, dataTH[4]);
- byte_write(0x2005, dataTH[5]);
- byte_write(0x2006, dataTH[6]);
- byte_write(0x2007, dataTH[7]);
- byte_write(0x2020, 1);
- }
- void updateLCD(){
- dataV[0] = get_0832_AD_data(0); //PH
- dataV[1] = get_0832_AD_data1(0); //SW
- dataV[2] = get_0832_AD_data(1); //ZD
- dataV[3] = Get18B20Temp(); //WD
-
- phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
- if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
- pre_ph_v = phv;
- lcd[0] = ((int)phv)%1000/100+48;
- lcd[1] = ((int)phv)%100/10 + 48;
- lcd[2] = '.';
- lcd[3] = ((int)phv)%10 + 48;
- lcd[4] = '\0';
- PutStr(0,1, lcd);
- dataV[0] = phv;
- dataV[2] = dataV[2] /2.55;
- if(dataV[2] > 99) dataV[2] = 99;
- lcd[0] = ((int)dataV[2])%100/10 + 48;
- lcd[1] = ((int)dataV[2])%10 + 48;
- lcd[2] = '\0';
- PutStr(1,1, lcd);
-
- dataV[1] = 10 - (130-dataV[1]) /19;
- if(dataV[1] > 10) dataV[1] = 10;
- if(dataV[1] < 0) dataV[1] = 0;
- lcd[0] = ((int)dataV[1])%100/10 + 48;
- lcd[1] = ((int)dataV[1])%10 + 48;
- lcd[2] = '\0';
- PutStr(2,1, lcd);
-
- lcd[0] = ((int)dataV[3])%100/10 + 48;
- lcd[1] = ((int)dataV[3])%10 + 48;
- lcd[2] = '\0';
- PutStr(3,1, lcd);
- }
- void updateTH(){
- lcd[0] = ((int)dataTH[0])%1000/100+48;
- lcd[1] = ((int)dataTH[0])%100/10 + 48;
- lcd[2] = '\0';
- PutStr(0,4, lcd);
-
- lcd[0] = ((int)dataTH[1])%1000/100+48;
- lcd[1] = ((int)dataTH[1])%100/10 + 48;
- lcd[2] = '\0';
- PutStr(0,7, lcd);
-
- lcd[0] = ((int)dataTH[2])%100/10+48;
- lcd[1] = ((int)dataTH[2])%10 + 48;
- lcd[2] = '\0';
- PutStr(1,4, lcd);
- lcd[0] = ((int)dataTH[3])%100/10+48;
- lcd[1] = ((int)dataTH[3])%10 + 48;
- lcd[2] = '\0';
- PutStr(1,7, lcd);
- lcd[0] = ((int)dataTH[4])%100/10+48;
- lcd[1] = ((int)dataTH[4])%10 + 48;
- lcd[2] = '\0';
- PutStr(2,4, lcd);
- lcd[0] = ((int)dataTH[5])%100/10+48;
- lcd[1] = ((int)dataTH[5])%10 + 48;
- lcd[2] = '\0';
- PutStr(2,7, lcd);
- lcd[0] = ((int)dataTH[6])%100/10+48;
- lcd[1] = ((int)dataTH[6])%10 + 48;
- lcd[2] = '\0';
- PutStr(3,4, lcd);
- lcd[0] = ((int)dataTH[7])%100/10+48;
- lcd[1] = ((int)dataTH[7])%10 + 48;
- lcd[2] = '\0';
- PutStr(3,7, lcd);
- }
- void timer1(){
- updateLCD();
- updateTH();
- alarm();
- }
- void Uart_Init() //使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51等均可)
- {
- TMOD = 0x21;
- SCON = 0x50; //设置串行方式
- TH1 = 0xFD; //波特率9600
- TL1 = TH1;
- PCON = 0x00;
- EA = 1; //总中断打开
- ES = 1; //开串口中断
- TR1 = 1; //启动定时器1
- }
- /********************************************************************
- 名称:串口发送函数 功能:MCU向无线WIFI模块ESP8266发送数据
- ********************************************************************/
- void Send_Uart(uchar value)
- {
- ES=0; //关闭串口中断
- TI=0; //清发送完毕中断请求标志位
- SBUF=value; //发送
- while(TI==0); //等待发送完毕
- TI=0; //清发送完毕中断请求标志位
- ES=1; //允许串口中断
- TH0=0;
- TL0=0;
- }
- void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组
- {
- while(*puf!='\0') //遇到空格跳出循环
- {
- Send_Uart(*puf); //向WIFI模块发送控制指令。
- delay(5);
- puf++;
- }
- delay(5);
- Send_Uart('\r'); //回车
- delay(5);
- Send_Uart('\n'); //换行
- }
- void main(){
-
- DS18B20Init();
- LcmInit(); //LCD12864初始化
- LcmClearTXT(); //LCD12864清屏
- init_eeprom();
- Uart_Init(); //波特率发生器
- delayms(10);
- ESP8266_Set("AT+CWMODE=2"); //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式
- delayms(500);
- // ESP8266_Set("AT+RST"); //重新启动wifi模块
- // ms_delay(1000);
- ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4"); //AT+CWSAP="wifi_yuan","123456789",11,4 设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
- delayms(500);
- ESP8266_Set("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入
- delayms(500);
- ESP8266_Set("AT+CIPSERVER=1,5000"); //启动TCP/IP 实现基于网络//控制 ESP8266_Set("AT+CIPSERVER=1,5000");
- delayms(500);
- ESP8266_Set("AT+CIPSTO=0"); //永远不超时
- delayms(500);
- ES=1;
- timer1_start(1000, timer1);
- PutStr(0,0, "PH H L ");
- PutStr(1,0, "ZD H L ");
- PutStr(2,0, "SW H L ");
- PutStr(3,0, "WD H L ");
-
- while(1){
- s=Get18B20Temp();
- xm0=(s/100)%10;//存放百位数据
- xm1=(s/10)%10; //存放十位数据
- xm2=s%10; //存放个位数据
-
- table[6]=ta[xm0];
- table[7]=ta[xm1];
- table[9]=ta[xm2];
-
- ESP8266_Set(table);//距离数据发送出去
- delayms(500);
- setKeyDeal();
- addKeyDeal();
- subKeyDeal();
- }
- }
- //名称:串行通讯中断 作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据正常的收发。
- void Uart_Interrupt() interrupt 4
- {
- static uchar i=0;
- if(RI==1)
- {
- RI=0;
- Receive=SBUF; //MCU接收wifi模块反馈回来的数据
- table[i]=Receive;
- if((table[i]=='\n'))
- {
- i=0;
- }
- else i++; //遇到换行 重新装值
- }
- else TI=0;
- }
- void alarm(){//报警
- if( (int)dataV[0] > dataTH[0] || (int)dataV[0] < dataTH[1] || \
- (int)dataV[2] > dataTH[2] || (int)dataV[2] < dataTH[3] || \
- (int)dataV[3] > dataTH[6] || (int)dataV[3] < dataTH[7] \
- ){
- beep=paishui=jiashui=0;//换水---同时加水排水
- }
- if((int)dataV[1] > dataTH[4]){ beep=paishui =0;}//水位高排水
- else if((int)dataV[1] < dataTH[5]){ beep=jiashui =0;}//水位低加水
- else{
- beep=paishui=jiashui=1;
- }
- }
- char flagSet = 0;
- void setDeal(){
- switch(flagSet){
- case 0: PutStr(3,6, " "); break;
- case 1: PutStr(0,3, "*"); break;
- case 2: PutStr(0,6, "*"); PutStr(0,3, " "); break;
- case 3: PutStr(1,3, "*"); PutStr(0,6, " "); break;
- case 4: PutStr(1,6, "*"); PutStr(1,3, " "); break;
- case 5: PutStr(2,3, "*"); PutStr(1,6, " "); break;
- case 6: PutStr(2,6, "*"); PutStr(2,3, " "); break;
- case 7: PutStr(3,3, "*"); PutStr(2,6, " "); break;
- case 8: PutStr(3,6, "*"); PutStr(3,3, " "); break;
- }
- }
- void setKeyDeal(){
- setKey = 1;
- if(setKey == 0){
- delay(1000);
- if(setKey == 0){
- flagSet++;
- if(flagSet > 8){ flagSet = 0; }
- setDeal();
- while(setKey == 0);
- }
- }
- }
- void addKeyDeal(){
- addKey = 1;
- if(addKey == 0 && flagSet > 0){
- delay(1000);
- if(addKey == 0){
-
- switch(flagSet){
- case 1: if(dataTH[0] < 141) dataTH[0]+=10; break;
- case 2: if(dataTH[1] < dataTH[0]) dataTH[1]+=10; break;
- case 3: if(dataTH[2] < 99) dataTH[2]++; break;
- case 4: if(dataTH[3] < dataTH[2]) dataTH[3]++; break;
- case 5: if(dataTH[4] < 10) dataTH[4]++; break;
- case 6: if(dataTH[5] < dataTH[4]) dataTH[5]++; break;
- case 7: if(dataTH[6] < 99) dataTH[6]++; break;
- case 8: if(dataTH[7] < dataTH[6]) dataTH[7]++; break;
- }
- updateTH();
- update_eeprom();
- while(addKey == 0);
- }
- }
- }
- void subKeyDeal(){
- subKey = 1;
- if(subKey == 0 && flagSet > 0){
- delay(1000);
- if(subKey == 0){
-
- switch(flagSet){
- case 1: if(dataTH[0] > dataTH[1]+10) dataTH[0]-=10; break;
- case 2: if(dataTH[1] > 10) dataTH[1]-=10; break;
- case 3: if(dataTH[2] > dataTH[3]) dataTH[2]--; break;
- case 4: if(dataTH[3] > 0) dataTH[3]--; break;
- case 5: if(dataTH[4] > dataTH[5]) dataTH[4]--; break;
- case 6: if(dataTH[5] > 0) dataTH[5]--; break;
- case 7: if(dataTH[6] > dataTH[7]) dataTH[6]--; break;
- case 8: if(dataTH[7] > 0) dataTH[7]--; break;
- }
- updateTH();
- update_eeprom();
- while(subKey == 0);
- }
- }
- }
- -----------------------------------------------------------------------
- int timer1_interrupt_counter_V = 0;
- typedef unsigned int u16;
- typedef unsigned char u8;
- static TIMER1_CallBackType tIMER1_CallBackTable[3];
- void timer1_IR() interrupt 1{
- static u16 timer1_interrupt_counter = 0;
- TR0 = 0;
- TH0 = 0xFC;
- TL0 = 0x6b;
- TR0 = 1;
- timer1_interrupt_counter++;
- if( timer1_interrupt_counter >= timer1_interrupt_counter_V ) {
- timer1_interrupt_counter = 0;
- tIMER1_CallBackTable[1]();
- }
- }
- void timer1_start(int ms, TIMER1_CallBackType AppCBFun){
- timer1_interrupt_counter_V = ms;
- tIMER1_CallBackTable[1] = AppCBFun;
-
- TMOD &= 0x0f;
- TMOD |= 0x01;
- TH0 = 0xFC;
- TL0 = 0x6b;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
-
- if(timer1_interrupt_counter_V < 1 || timer1_interrupt_counter_V > 60000 ){ TR1 = 0;}
- }
复制代码
|