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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機定時器0與定時器1沖突

[復制鏈接]
跳轉到指定樓層
樓主
ID:652483 發表于 2021-4-21 01:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用單片機定時器0作為LCD串行顯示,能正常顯示,但是加入定時器1作為波特率發生器后,LCD就不能顯示了,這是由于定時器優先級的問題呢,還是主函數邏輯錯誤,WiFi模塊這樣寫是不是有問題,各位大佬幫忙看一下。

單片機源程序如下:
  1. sbit beep = P2^0;//蜂鳴器
  2. sbit setKey = P3^3;//按鍵
  3. sbit addKey = P3^4;//
  4. sbit subKey = P3^5;//
  5. sbit paishui = P3^6;//排水---低電平觸發
  6. sbit jiashui = P3^7;//加水                             
  7. long s,W;  

  8. uchar table[40];//用于接收wifi模塊反饋到MCU上的數據
  9. uchar code ta[]="0123456789- "; //測試一下
  10. uchar table[]="溫度:00.0 C";//傳送用定位模
  11. uchar Receive,i,xm1,xm2,xm3,xm0;  
  12. uint tvalue;//定義一個全局變量,用來合高低8位溫度//顯示溫度

  13. float dataV[4]= {0};
  14. unsigned char dataTH[8]={110,30, 99, 30, 8,2, 45, 15};
  15. unsigned char lcd[8] = {0};
  16. void alarm();


  17. void delay(unsigned int i){//us
  18.     while(i--);
  19. }
  20. void delayms(uint t) //
  21. {  
  22.     uint i,j;  
  23.     for(i=t;i>0;i--)   
  24.     for(j=110;j>0;j--);
  25. }   

  26. float pre_ph_v, phv;
  27. void setKeyDeal();
  28. void addKeyDeal();
  29. void subKeyDeal();

  30. //初始化eeprom
  31. void init_eeprom(){
  32.     unsigned char is_first_init =  byte_read(0x2020);
  33.     if(is_first_init == 1){
  34.         dataTH[0] = byte_read(0x2000);
  35.         dataTH[1] = byte_read(0x2001);
  36.         dataTH[2] = byte_read(0x2002);
  37.         dataTH[3] = byte_read(0x2003);
  38.         dataTH[4] = byte_read(0x2004);
  39.         dataTH[5] = byte_read(0x2005);
  40.         dataTH[6] = byte_read(0x2006);
  41.         dataTH[7] = byte_read(0x2007);
  42.     }else{
  43.             SectorErase(0x2000);
  44.             byte_write(0x2000, dataTH[0]);
  45.             byte_write(0x2001, dataTH[1]);
  46.             byte_write(0x2002, dataTH[2]);
  47.             byte_write(0x2003, dataTH[3]);
  48.             byte_write(0x2004, dataTH[4]);
  49.             byte_write(0x2005, dataTH[5]);
  50.             byte_write(0x2006, dataTH[6]);
  51.             byte_write(0x2007, dataTH[7]);
  52.             byte_write(0x2020, 1);   
  53.     }
  54. }

  55. //更新eeprom存儲的數據
  56. void update_eeprom(){
  57.             SectorErase(0x2000);
  58.             byte_write(0x2000, dataTH[0]);
  59.             byte_write(0x2001, dataTH[1]);
  60.             byte_write(0x2002, dataTH[2]);
  61.             byte_write(0x2003, dataTH[3]);
  62.             byte_write(0x2004, dataTH[4]);
  63.             byte_write(0x2005, dataTH[5]);
  64.             byte_write(0x2006, dataTH[6]);
  65.             byte_write(0x2007, dataTH[7]);
  66.             byte_write(0x2020, 1);   
  67. }

  68. void updateLCD(){
  69.     dataV[0] = get_0832_AD_data(0); //PH
  70.     dataV[1] = get_0832_AD_data1(0);  //SW
  71.     dataV[2] = get_0832_AD_data(1);  //ZD
  72.     dataV[3] = Get18B20Temp();  //WD
  73.    
  74.     phv = -58.87*(dataV[0]*5.0/255.0) + 216.77;
  75.     if(phv > 141 || phv < 0 ) { phv = pre_ph_v; }
  76.     pre_ph_v = phv;
  77.     lcd[0] = ((int)phv)%1000/100+48;
  78.     lcd[1] = ((int)phv)%100/10 + 48;
  79.     lcd[2] =  '.';
  80.     lcd[3] = ((int)phv)%10 + 48;
  81.     lcd[4] =  '\0';
  82.     PutStr(0,1, lcd);
  83.     dataV[0] = phv;

  84.     dataV[2]  = dataV[2] /2.55;
  85.     if(dataV[2] > 99) dataV[2] = 99;
  86.     lcd[0] = ((int)dataV[2])%100/10 + 48;
  87.     lcd[1] = ((int)dataV[2])%10 + 48;
  88.     lcd[2] =  '\0';
  89.     PutStr(1,1, lcd);
  90.    
  91.     dataV[1]  = 10 - (130-dataV[1]) /19;
  92.     if(dataV[1] > 10) dataV[1] = 10;
  93.     if(dataV[1] < 0) dataV[1] = 0;
  94.     lcd[0] = ((int)dataV[1])%100/10 + 48;
  95.     lcd[1] = ((int)dataV[1])%10 + 48;
  96.     lcd[2] =  '\0';
  97.     PutStr(2,1, lcd);
  98.    
  99.     lcd[0] = ((int)dataV[3])%100/10 + 48;
  100.     lcd[1] = ((int)dataV[3])%10 + 48;
  101.     lcd[2] =  '\0';
  102.     PutStr(3,1, lcd);

  103. }

  104. void updateTH(){
  105.     lcd[0] = ((int)dataTH[0])%1000/100+48;
  106.     lcd[1] = ((int)dataTH[0])%100/10 + 48;
  107.     lcd[2] =  '\0';
  108.     PutStr(0,4, lcd);
  109.    
  110.   lcd[0] = ((int)dataTH[1])%1000/100+48;
  111.     lcd[1] = ((int)dataTH[1])%100/10 + 48;
  112.     lcd[2] =  '\0';
  113.     PutStr(0,7, lcd);
  114.    
  115.     lcd[0] = ((int)dataTH[2])%100/10+48;
  116.     lcd[1] = ((int)dataTH[2])%10 + 48;
  117.     lcd[2] =  '\0';
  118.     PutStr(1,4, lcd);

  119.     lcd[0] = ((int)dataTH[3])%100/10+48;
  120.     lcd[1] = ((int)dataTH[3])%10 + 48;
  121.     lcd[2] =  '\0';
  122.     PutStr(1,7, lcd);

  123.     lcd[0] = ((int)dataTH[4])%100/10+48;
  124.     lcd[1] = ((int)dataTH[4])%10 + 48;
  125.     lcd[2] =  '\0';
  126.     PutStr(2,4, lcd);

  127.     lcd[0] = ((int)dataTH[5])%100/10+48;
  128.     lcd[1] = ((int)dataTH[5])%10 + 48;
  129.     lcd[2] =  '\0';
  130.     PutStr(2,7, lcd);

  131.     lcd[0] = ((int)dataTH[6])%100/10+48;
  132.     lcd[1] = ((int)dataTH[6])%10 + 48;
  133.     lcd[2] =  '\0';
  134.     PutStr(3,4, lcd);

  135.     lcd[0] = ((int)dataTH[7])%100/10+48;
  136.     lcd[1] = ((int)dataTH[7])%10 + 48;
  137.     lcd[2] =  '\0';
  138.     PutStr(3,7, lcd);
  139. }


  140. void timer1(){
  141.     updateLCD();
  142.     updateTH();
  143.     alarm();
  144. }
  145. void Uart_Init()                //使用定時器1作為波特率發生器(STC89C52、STC89C51、AT89C51等均可)
  146. {  
  147.     TMOD = 0x21;
  148.     SCON = 0x50;                 //設置串行方式
  149.     TH1 = 0xFD;                     //波特率9600
  150.     TL1 = TH1;
  151.     PCON = 0x00;
  152.     EA = 1;                        //總中斷打開
  153.     ES = 1;                        //開串口中斷  
  154.     TR1 = 1;                    //啟動定時器1
  155. }
  156. /********************************************************************
  157. 名稱:串口發送函數  功能:MCU向無線WIFI模塊ESP8266發送數據  
  158. ********************************************************************/
  159. void Send_Uart(uchar value)
  160. {  
  161.     ES=0;                          //關閉串口中斷  
  162.     TI=0;                       //清發送完畢中斷請求標志位   
  163.     SBUF=value;                 //發送  
  164.     while(TI==0);                 //等待發送完畢   
  165.     TI=0;                       //清發送完畢中斷請求標志位   
  166.     ES=1;                          //允許串口中斷
  167.     TH0=0;
  168.     TL0=0;  
  169. }  
  170. void ESP8266_Set(uchar *puf)     // 數組指針*puf指向字符串數組               
  171. {   
  172.     while(*puf!='\0')            //遇到空格跳出循環  
  173.     {   
  174.         Send_Uart(*puf);          //向WIFI模塊發送控制指令。   
  175.         delay(5);   
  176.         puf++;   
  177.     }  
  178.     delay(5);  
  179.     Send_Uart('\r');             //回車  
  180.     delay(5);  
  181.     Send_Uart('\n');               //換行  
  182. }


  183. void main(){
  184.    
  185.     DS18B20Init();
  186.     LcmInit();           //LCD12864初始化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  187.     LcmClearTXT();       //LCD12864清屏        
  188.     init_eeprom();
  189.     Uart_Init();                                            //波特率發生器
  190.     delayms(10);
  191.     ESP8266_Set("AT+CWMODE=2");                             //設置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   
  192.     delayms(500);
  193. //    ESP8266_Set("AT+RST");                                     //重新啟動wifi模塊            
  194. //  ms_delay(1000);
  195.     ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4");      //AT+CWSAP="wifi_yuan","123456789",11,4  設置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
  196.     delayms(500);
  197.     ESP8266_Set("AT+CIPMUX=1");                                //開啟多連接模式,允許多個各客戶端接入
  198.     delayms(500);
  199.     ESP8266_Set("AT+CIPSERVER=1,5000");                      //啟動TCP/IP 實現基于網絡//控制     ESP8266_Set("AT+CIPSERVER=1,5000");  
  200.     delayms(500);
  201.     ESP8266_Set("AT+CIPSTO=0");                             //永遠不超時
  202.     delayms(500);     
  203.     ES=1;                  
  204.     timer1_start(1000, timer1);
  205.     PutStr(0,0, "PH     H     L  ");  
  206.     PutStr(1,0, "ZD     H     L  ");  
  207.     PutStr(2,0, "SW     H     L  ");  
  208.     PutStr(3,0, "WD     H     L  ");  
  209.    
  210.     while(1){
  211.           s=Get18B20Temp();
  212.           xm0=(s/100)%10;//存放百位數據
  213.           xm1=(s/10)%10;  //存放十位數據
  214.           xm2=s%10;  //存放個位數據
  215.         
  216.           table[6]=ta[xm0];
  217.           table[7]=ta[xm1];
  218.           table[9]=ta[xm2];  
  219.       
  220.           ESP8266_Set(table);//距離數據發送出去
  221.         delayms(500);
  222.         setKeyDeal();
  223.         addKeyDeal();
  224.         subKeyDeal();
  225.     }
  226. }

  227. //名稱:串行通訊中斷  作用:發送或接收結束后進入該函數,對相應的標志位軟件清0,實現模塊對數據正常的收發。  
  228. void Uart_Interrupt() interrupt 4         
  229. {   
  230.     static uchar i=0;  
  231.     if(RI==1)  
  232.     {   
  233.         RI=0;   
  234.         Receive=SBUF;                                //MCU接收wifi模塊反饋回來的數據      
  235.         table[i]=Receive;   
  236.         if((table[i]=='\n'))
  237.         {            
  238.             i=0;
  239.         }   
  240.         else i++;                                          //遇到換行 重新裝值  
  241.     }   
  242.     else TI=0;   
  243. }

  244. void alarm(){//報警
  245.     if( (int)dataV[0] > dataTH[0] || (int)dataV[0] < dataTH[1] || \
  246.             (int)dataV[2] > dataTH[2] || (int)dataV[2] < dataTH[3] ||  \
  247.             (int)dataV[3] > dataTH[6] || (int)dataV[3] < dataTH[7]   \
  248.     ){
  249.         beep=paishui=jiashui=0;//換水---同時加水排水
  250.     }
  251.     if((int)dataV[1] > dataTH[4]){    beep=paishui =0;}//水位高排水
  252.     else if((int)dataV[1] < dataTH[5]){    beep=jiashui =0;}//水位低加水
  253.     else{
  254.         beep=paishui=jiashui=1;
  255.     }
  256. }


  257. char flagSet = 0;

  258. void setDeal(){
  259.     switch(flagSet){
  260.         case 0: PutStr(3,6, " "); break;
  261.         case 1: PutStr(0,3, "*"); break;
  262.         case 2: PutStr(0,6, "*"); PutStr(0,3, " "); break;
  263.         case 3: PutStr(1,3, "*"); PutStr(0,6, " "); break;
  264.         case 4: PutStr(1,6, "*"); PutStr(1,3, " "); break;
  265.         case 5: PutStr(2,3, "*"); PutStr(1,6, " "); break;
  266.         case 6: PutStr(2,6, "*"); PutStr(2,3, " "); break;
  267.         case 7: PutStr(3,3, "*"); PutStr(2,6, " "); break;
  268.         case 8: PutStr(3,6, "*"); PutStr(3,3, " "); break;
  269.     }
  270. }

  271. void setKeyDeal(){
  272.     setKey = 1;
  273.     if(setKey == 0){
  274.         delay(1000);
  275.         if(setKey == 0){
  276.             flagSet++;
  277.             if(flagSet > 8){ flagSet = 0; }
  278.             setDeal();
  279.             while(setKey == 0);
  280.         }
  281.     }
  282. }

  283. void addKeyDeal(){
  284.     addKey = 1;
  285.     if(addKey == 0 && flagSet > 0){
  286.         delay(1000);
  287.         if(addKey == 0){
  288.             
  289.             switch(flagSet){
  290.                 case 1: if(dataTH[0] < 141)        dataTH[0]+=10;  break;
  291.                 case 2: if(dataTH[1] < dataTH[0]) dataTH[1]+=10;  break;
  292.                 case 3: if(dataTH[2] < 99)        dataTH[2]++;  break;
  293.                 case 4: if(dataTH[3] < dataTH[2]) dataTH[3]++;  break;
  294.                 case 5: if(dataTH[4] < 10)        dataTH[4]++;  break;
  295.                 case 6: if(dataTH[5] < dataTH[4]) dataTH[5]++;  break;
  296.                 case 7: if(dataTH[6] < 99)        dataTH[6]++;  break;
  297.                 case 8: if(dataTH[7] < dataTH[6]) dataTH[7]++;  break;
  298.             }
  299.             updateTH();
  300.             update_eeprom();
  301.             while(addKey == 0);
  302.         }
  303.     }
  304. }

  305. void subKeyDeal(){
  306.     subKey = 1;
  307.     if(subKey == 0 && flagSet > 0){
  308.         delay(1000);
  309.         if(subKey == 0){
  310.             
  311.             switch(flagSet){
  312.                 case 1: if(dataTH[0] > dataTH[1]+10)        dataTH[0]-=10;  break;
  313.                 case 2: if(dataTH[1] > 10) dataTH[1]-=10;  break;
  314.                 case 3: if(dataTH[2] > dataTH[3])        dataTH[2]--;  break;
  315.                 case 4: if(dataTH[3] > 0) dataTH[3]--;  break;
  316.                 case 5: if(dataTH[4] > dataTH[5])        dataTH[4]--;  break;
  317.                 case 6: if(dataTH[5] > 0) dataTH[5]--;  break;
  318.                 case 7: if(dataTH[6] > dataTH[7])        dataTH[6]--;  break;
  319.                 case 8: if(dataTH[7] > 0) dataTH[7]--;  break;
  320.             }
  321.             updateTH();
  322.             update_eeprom();
  323.             while(subKey == 0);
  324.         }
  325.     }

  326. }
  327. -----------------------------------------------------------------------
  328. int timer1_interrupt_counter_V = 0;

  329. typedef unsigned int u16;
  330. typedef unsigned char u8;

  331. static TIMER1_CallBackType tIMER1_CallBackTable[3];


  332. void timer1_IR() interrupt 1{
  333.     static u16 timer1_interrupt_counter = 0;
  334.       TR0 = 0;
  335.     TH0 = 0xFC;
  336.     TL0 = 0x6b;
  337.       TR0 = 1;
  338.     timer1_interrupt_counter++;
  339.     if( timer1_interrupt_counter >= timer1_interrupt_counter_V ) {  
  340.         timer1_interrupt_counter = 0;
  341.                 tIMER1_CallBackTable[1]();
  342.     }
  343. }

  344. void timer1_start(int ms, TIMER1_CallBackType AppCBFun){
  345.     timer1_interrupt_counter_V = ms;
  346.     tIMER1_CallBackTable[1] = AppCBFun;
  347.    
  348.     TMOD &= 0x0f;         
  349.     TMOD |= 0x01;         
  350.   TH0 = 0xFC;
  351.   TL0 = 0x6b;
  352.   EA = 1;   
  353.   ET0 = 1;
  354.   TR0 = 1;
  355.    
  356.   if(timer1_interrupt_counter_V < 1 || timer1_interrupt_counter_V > 60000 ){ TR1 = 0;}
  357. }
復制代碼

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

使用道具 舉報

沙發
ID:889094 發表于 2021-4-21 07:38 來自手機 | 只看該作者
我只看到了串口中斷函數,定時器0,確定有函數響應并且開啟了?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级片91 | www.国产91| 欧美一区二区三区视频 | 男人天堂手机在线视频 | av av在线 | 精品国产乱码久久久久久丨区2区 | 久久免费精品 | 国产午夜精品一区二区三区在线观看 | 五月天综合网 | 波多野结衣二区 | 色综合视频 | 欧美国产日韩一区二区三区 | 欧美日韩久久精品 | 国产精品成人一区二区三区 | 黄色av网站在线观看 | 国产美女黄色 | 国产精品免费一区二区三区四区 | 中文字幕在线观看 | 国产精品国产三级国产aⅴ浪潮 | 国产欧美一区二区三区另类精品 | 日日干日日射 | 亚洲精品久久久一区二区三区 | 欧美精品在线看 | 精品国产一区二区在线 | 国产美女在线观看 | 日本黄色大片免费 | 国产超碰人人爽人人做人人爱 | 国产精品久久久久久久午夜片 | 国产精品久久久久无码av | 免费的色网站 | 国产91在线视频 | 精品日韩在线 | 玖玖爱365 | 在线免费观看成年人视频 | 五月天婷婷久久 | 精品国产一区久久 | 亚洲欧美一区二区三区1000 | 精品久久伊人 | 精品久久一区 | 精品亚洲一区二区三区 | 国产精品爱久久久久久久 |