找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1911|回復(fù): 5
收起左側(cè)

關(guān)于stm32單片機(jī)ds18b20負(fù)溫度顯示程序

[復(fù)制鏈接]
ID:1062898 發(fā)表于 2023-2-13 15:27 | 顯示全部樓層 |閱讀模式
我用stm32 ds18b20 四位數(shù)碼管顯示,測(cè)量?jī)鋈獾臏囟仁秦?fù)的。但是把凍肉拿開測(cè)量大氣溫度的時(shí)候,負(fù)號(hào)就去不掉了。
請(qǐng)各位大佬幫我看看到底怎么回事

#include "74hc595.h"
#include "SysTick.h"
#include "ds18b20.h"
u8 fg=1;
u16 sdata;
unsigned char xiaoshu1;                //小數(shù)第一位
unsigned char xiaoshu2;                //小數(shù)第二位
unsigned char xiaoshu;                //兩位小數(shù)

u8 LED_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽(yáng)數(shù)碼管段碼“0123456789-”

u8 LED_table_dp[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};


u8 wei_table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//第一位至第八位位碼

void HC595_GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = SCL | RCL | DIO;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(SMG_PROT, &GPIO_InitStructure);
        
        GPIO_SetBits(SMG_PROT,SCL);
        GPIO_SetBits(SMG_PROT,RCL);
        GPIO_SetBits(SMG_PROT,DIO);
}
void HC595_Send_Byte(unsigned char byte)
{
        u8 i;
        
        for(i = 0; i < 8; i++)
        {
                if(byte & 0x80)
                        DIO_HIGH;
                else
                        DIO_LOW;
               
                SCL_LOW;
                delay_us(10);
                SCL_HIGH;
                delay_us(10);
               
                byte <<= 1;
        }
}
void DS18B20_UserConfig()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    GPIO_InitStructure.GPIO_Mode    =  GPIO_Mode_Out_PP;//推挽輸出是GPIO_Mode_Out_PP
    GPIO_InitStructure.GPIO_Pin     =  DS18B20;//定義管腳
    GPIO_InitStructure.GPIO_Speed   =  GPIO_Speed_10MHz;
    GPIO_Init(DS18B20_PROT,&GPIO_InitStructure);

    //GPIO_ResetBits(SMG_PROT,SCL|RCL|DIO);

}

//輸入輸出模式選擇函數(shù)
void Output_Input_Mode(u8 cmd)
{
        
        GPIO_InitTypeDef GPIO_InitStructure;//定義結(jié)構(gòu)體
        
        if(cmd)
    {//1:輸出模式
        
        GPIO_InitStructure.GPIO_Pin = DS18B20;//PB0
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//端口輸出速率
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出模式
        }
        else
    {//0:輸入模式
               
        GPIO_InitStructure.GPIO_Pin = DS18B20;//PB0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉模式
        }
        GPIO_Init(DS18B20_PROT,&GPIO_InitStructure);//初始串口
}

//啟動(dòng)信號(hào) 判斷是否成功
u8 DS18B20_Start_Signal(void)
{

        u8 data;
        
        //寫
        Output_Input_Mode(1);//輸入模式
        DS18B20_LOW;
        delay_us(480);
        DS18B20_HIGH;
        delay_us(30);
        
        //讀引腳狀態(tài) 1:DS18B20失敗 0:DS18B20成功
        Output_Input_Mode(0);//輸出模式
        data = GPIO_ReadInputDataBit(DS18B20_PROT,DS18B20);//讀取輸入狀態(tài)  60~240us
        delay_us(200);//200us  480+30+240=750  960-750=210  取200us即可
        
        return data;
}

//向DS18B20寫數(shù)據(jù)
//寫:輸出模式 1
void DS18B20_Write_Byte(u8 data)
{
        

        for(u8 i=0;i<8;i++){
               
                Output_Input_Mode(1);
                DS18B20_LOW;
                delay_us(2);
               
                ((data&0x01)) ? DS18B20_HIGH : DS18B20_LOW;//DS18B20 低位先出,故&0x01
                delay_us(45);
                DS18B20_HIGH;//拉高總線

                data>>=1;//數(shù)據(jù)右移八次 既完成寫8bit數(shù)據(jù)
        }
}

//讀DS18B20數(shù)據(jù)
//讀:輸入模式 0
u8 DS18B20_Read_Byte(void)
{

        u8 data=0;
        
        for(u8 i=0;i<8;i++){
               
                data>>=1;
                Output_Input_Mode(1);
                DS18B20_LOW;
                delay_us(2);
                DS18B20_HIGH;//拉高總線
               
                Output_Input_Mode(0);
                if(GPIO_ReadInputDataBit(DS18B20_PROT,DS18B20) == SET){
                        
                        data |= 0x80;//從高位開始
                }
                        delay_us(45);
        }
        return data;
}

//獲取溫度值
void DS18B20_Read_Temperature()
{
        
        u8 LSB = 0,MSB = 0;
        u16 temp=0;
        //溫度轉(zhuǎn)換
        DS18B20_Start_Signal();
        DS18B20_Write_Byte(0xcc);//跳過(guò)ROM
        DS18B20_Write_Byte(0x44);//溫度變換
        //delay_ms(750);
        //12位精度 750ms  數(shù)碼管本身有延時(shí),故這個(gè)延時(shí)可以去掉
        
        //讀取寄存器
        DS18B20_Start_Signal();
        DS18B20_Write_Byte(0xcc);//跳過(guò)ROM
        DS18B20_Write_Byte(0xbe);//讀暫存存儲(chǔ)器
        
        LSB =  DS18B20_Read_Byte();//讀出溫度的低位LSB
        MSB =  DS18B20_Read_Byte();//讀出溫度的高位MSB
        if(MSB>0x7f)
    {
        LSB=~LSB+1;
        MSB=~MSB;
        fg=0;

    }
        sdata = LSB/16+MSB*16;              //整數(shù)部分
        xiaoshu1 = (LSB&0x0f)*10/16;                 //小數(shù)第一位
        xiaoshu2 = (LSB&0x0f)*100/16%10;        //小數(shù)第二位
        xiaoshu=xiaoshu1*10+xiaoshu2;                 //小數(shù)兩位
}
void SMG_Display(u16 data)
{
    if(fg==1)
    {
        HC595_Send_Byte(LED_table[data/10]);//送出段碼
        HC595_Send_Byte(wei_table[3]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table_dp[data%10]);//送出段碼
        HC595_Send_Byte(wei_table[2]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table[xiaoshu1]);//送出段碼
        HC595_Send_Byte(wei_table[1]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table[xiaoshu2]);//送出段碼
        HC595_Send_Byte(wei_table[0]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);
    }
    if(fg==0)
    {
        HC595_Send_Byte(LED_table[11]);//送出段碼
        HC595_Send_Byte(wei_table[3]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table[data/10]);//送出段碼
        HC595_Send_Byte(wei_table[2]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table_dp[data %10]);//送出段碼
        HC595_Send_Byte(wei_table[1]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

        HC595_Send_Byte(LED_table[xiaoshu1]);//送出段碼
        HC595_Send_Byte(wei_table[0]);//送出位碼
        RCL_LOW;
        RCL_HIGH;
        delay_ms(1);

    }

}

void main()
{
    SystemInit();
    SysTick_Init(72);
    HC595_GPIO_Configuration();
    DS18B20_UserConfig();
    while(1)
    {
       DS18B20_Read_Temperature();
       SMG_Display(sdata);
    }
}



回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-2-13 19:53 | 顯示全部樓層
只有fg=0;
沒有fg=1;
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2023-2-13 21:13 | 顯示全部樓層
程序太長(zhǎng)沒空看,只給出提示:每次刷新顯示都要連符號(hào)一起刷新。
回復(fù)

使用道具 舉報(bào)

ID:596109 發(fā)表于 2023-2-14 08:41 | 顯示全部樓層
       if(MSB>0x7f)     {         LSB=~LSB+1;         MSB=~MSB;         fg=0;      }//這段函數(shù)加上溫度為正的時(shí)候fg=1
回復(fù)

使用道具 舉報(bào)

ID:629502 發(fā)表于 2023-2-14 09:29 | 顯示全部樓層
顯示沒看出啥問(wèn)題,標(biāo)志位賦值時(shí)沒看到fg=1
回復(fù)

使用道具 舉報(bào)

ID:584195 發(fā)表于 2023-2-14 16:25 | 顯示全部樓層
你開調(diào)試模式進(jìn)去,看看測(cè)的溫度是不是對(duì)的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表