我用單片機定時器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;}
- }
復制代碼
|