找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1460|回复: 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. }
复制代码

回复

使用道具 举报

ID:889094 发表于 2021-4-21 07:38 来自手机 | 显示全部楼层
我只看到了串口中断函数,定时器0,确定有函数响应并且开启了?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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