找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1996|回复: 7
收起左侧

STM32单片机温度报警器和无线通信的问题,要重新按一次rest按钮,温度才会改变

[复制链接]
ID:975500 发表于 2021-12-5 21:34 | 显示全部楼层 |阅读模式
这个程序一运行,温度就不会改变,每次都需要重新按一次rest按钮,温度才会改变,怎么去解决这个问题
单片机源程序如下:
#include "string.h"
#include "stm32f10x.h"
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "beep.h"
#include "key.h"
#include "ds18b20.h"
#include "24l01.h"
#include "spi.h"


u8 waring[] = {10,35};
u8 *p = waring;
u8 data[200];


int main(void)
{
    u8 key,mode;
    u8 t1=0;
    u16 t2=0;
    u8 tmp_buf[1];
    float temperature;
    int tmp;
    NRF24L01_Init();
    LED_Init();
    KEY_Init();
    delay_init();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
    uart_init(115200);
   
    LCD_Init();  
    BEEP_Init();
   
    POINT_COLOR=RED;
    LCD_ShowString(30,80,lcddev.width,lcddev.height,16,"4 ZU ZY PCC LXK YQK");
   
    while(DS18B20_Init())
    {
        LCD_ShowString(30,100,lcddev.width,lcddev.height,16,"DS18B20 Error");
        delay_ms(200);
        LCD_Fill(30,100,100,66,WHITE);
        delay_ms(200);
    }
    LCD_ShowString(30,100,lcddev.width,lcddev.height,16,"DS18B20 OK!");
    while(NRF24L01_Check())
    {
        LCD_ShowString(30,120,lcddev.width,lcddev.height,16,"NRF24L01 Error");
        delay_ms(200);
        LCD_Fill(30,120,239,120+16,WHITE);
         delay_ms(200);
    }
    LCD_ShowString(30,120,lcddev.width,lcddev.height,16,"NRF24L01 OK");
    POINT_COLOR=BLUE;
    LCD_ShowString(30,150,lcddev.width,lcddev.height,16,"xiaxian:");
    LCD_ShowString(30,170,lcddev.width,lcddev.height,16,"shangxian:");

   
    while(1)
    {
        if(t1%10==0)
        {
            temperature=DS18B20_Get_Temp();
            if(temperature<0)
            {
                LCD_ShowChar(30+80,190,'-',16,0);
                temperature = -temperature;
            }
            else LCD_ShowChar(30+80,190,' ',16,0);
            
            sprintf((char *)data,"temperature:%.2f",temperature);
                LCD_ShowString(30,190,lcddev.width,lcddev.height,16,data);
            LCD_ShowNum(30+80+8,150,waring[0],2,16);
            LCD_ShowNum(30+80+8,170,waring[1],2,16);        
        }   
        

        t1++;
        if(t1==20)
        {
            t1=0;
            LED0 = !LED0;
        }
        delay_ms(10);
        
        tmp = (int)temperature;
        if((tmp<=waring[0]) || (tmp >= waring[1]))
        {
            BEEP = !BEEP;
            LED1 = 1;
        }
        else
        {
            BEEP = 0;
            LED1 = 0;
        }
    while(1)
    {   
        key=KEY_Scan(0);
        if(key==KEY0_PRES)
        {
            mode=0;   
            break;
        }else if(key==KEY1_PRES)
        {
            mode=1;
            break;
        }
        t2++;
        if(t2==100)LCD_ShowString(10,210,lcddev.width,lcddev.height,16,"KEY0:RX_Mode  KEY1:TX_Mode");
         if(t2==200)
        {   
            LCD_Fill(10,210,240,210+16,WHITE);
            t2=0;
        }
        delay_ms(5);      
    }   
     LCD_Fill(10,210,240,210+16,WHITE);      
     POINT_COLOR=BLUE;   
    if(mode==0)
    {
        LCD_ShowString(30,210,lcddev.width,lcddev.height,16,"NRF24L01 RX_Mode");   
        LCD_ShowString(30,230,lcddev.width,lcddev.height,16,"Received DATA:");   
        NRF24L01_RX_Mode();         
        while(1)
        {                                               
            if(NRF24L01_RxPacket(tmp_buf)==0)
            {
                if((tmp<=waring[0]) || (tmp >= waring[1]))
        {
            LCD_ShowString(30,250,lcddev.width,lcddev.height,16,"wendubaojin");
        }
        else
        {
            LCD_ShowString(30,250,lcddev.width,lcddev.height,16,"wenduzhengchang");
        }
                                
            }else delay_us(100);      
            t2++;
            if(t2==10000)
            {
                t2=0;
                LED0=!LED0;
            }                     
        };   
    }else//TXģʽ
    {                                
        LCD_ShowString(30,210,lcddev.width,lcddev.height,16,"NRF24L01 TX_Mode");
        NRF24L01_TX_Mode();
        while(1)
        {                                 
            if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
            {
                LCD_ShowString(30,230,lcddev.width,lcddev.height,16,"Sended DATA:");   
                if((tmp<=waring[0]) || (tmp >= waring[1]))
        {
            LCD_ShowString(30,250,lcddev.width,lcddev.height,16,"wendubaojin");
        }
        else
        {
            LCD_ShowString(30,250,lcddev.width,lcddev.height,16,"wenduzhengchang");
        }
                key=mode;
                for(t2=0;t2<32;t2++)
                {
                    key++;
                    if(key>('~'))key=' ';
                    tmp_buf[t2]=key;   
                }
                mode++;
                if(mode>'~')mode=' ';        
                tmp_buf[0]=0;        
            }else
            {                                               
                 LCD_Fill(0,230,lcddev.width,230+16*3,WHITE);            
                LCD_ShowString(30,230,lcddev.width-1,32,16,"Send Failed ");
            };
            LED0=!LED0;
            delay_ms(1500);                    
    };
    }
}
}


回复

使用道具 举报

ID:975500 发表于 2021-12-5 21:35 | 显示全部楼层
无线通信模块没有while循环就发送不了信息
回复

使用道具 举报

ID:313048 发表于 2021-12-6 14:35 | 显示全部楼层
当你理解了while是做啥的  你就知道你程序为啥有问题了
回复

使用道具 举报

ID:228494 发表于 2021-12-6 16:17 | 显示全部楼层
大师们研究我学习
回复

使用道具 举报

ID:624769 发表于 2021-12-6 16:33 | 显示全部楼层
从表面来讲,问题在于 while(1) 太多了。

从本质来讲,你需要先学一下C语言的基础概念。
回复

使用道具 举报

ID:975500 发表于 2021-12-6 19:59 | 显示全部楼层
AUG 发表于 2021-12-6 14:35
当你理解了while是做啥的  你就知道你程序为啥有问题了

我知道是由while导致的,后面的while循环导致这个程序返回不到第一个while,就是不知道怎么改
回复

使用道具 举报

ID:624769 发表于 2021-12-6 20:16 | 显示全部楼层
2719221825zy 发表于 2021-12-6 19:59
我知道是由while导致的,后面的while循环导致这个程序返回不到第一个while,就是不知道怎么改

原则上,整个程序, 有且仅有一个 while(1)  你按这个思路去改就行了。
回复

使用道具 举报

ID:420836 发表于 2021-12-7 09:06 | 显示全部楼层
不要到处使用 while() 函数,它可能很容易捕获程序的执行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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