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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1878|回復: 5
收起左側

關于stm32單片機ds18b20負溫度顯示程序

[復制鏈接]
ID:1062898 發表于 2023-2-13 15:27 | 顯示全部樓層 |閱讀模式
我用stm32 ds18b20 四位數碼管顯示,測量凍肉的溫度是負的。但是把凍肉拿開測量大氣溫度的時候,負號就去不掉了。
請各位大佬幫我看看到底怎么回事

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

u8 LED_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽數碼管段碼“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);

}

//輸入輸出模式選擇函數
void Output_Input_Mode(u8 cmd)
{
        
        GPIO_InitTypeDef GPIO_InitStructure;//定義結構體
        
        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);//初始串口
}

//啟動信號 判斷是否成功
u8 DS18B20_Start_Signal(void)
{

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

//向DS18B20寫數據
//寫:輸出模式 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;//數據右移八次 既完成寫8bit數據
        }
}

//讀DS18B20數據
//讀:輸入模式 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;
        //溫度轉換
        DS18B20_Start_Signal();
        DS18B20_Write_Byte(0xcc);//跳過ROM
        DS18B20_Write_Byte(0x44);//溫度變換
        //delay_ms(750);
        //12位精度 750ms  數碼管本身有延時,故這個延時可以去掉
        
        //讀取寄存器
        DS18B20_Start_Signal();
        DS18B20_Write_Byte(0xcc);//跳過ROM
        DS18B20_Write_Byte(0xbe);//讀暫存存儲器
        
        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;              //整數部分
        xiaoshu1 = (LSB&0x0f)*10/16;                 //小數第一位
        xiaoshu2 = (LSB&0x0f)*100/16%10;        //小數第二位
        xiaoshu=xiaoshu1*10+xiaoshu2;                 //小數兩位
}
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);
    }
}



回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:629502 發表于 2023-2-14 09:29 | 顯示全部樓層
顯示沒看出啥問題,標志位賦值時沒看到fg=1
回復

使用道具 舉報

ID:584195 發表于 2023-2-14 16:25 | 顯示全部樓層
你開調試模式進去,看看測的溫度是不是對的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品综合 | 7777在线视频免费播放 | 羞羞网站在线免费观看 | 人人鲁人人莫人人爱精品 | 国产精品免费在线 | 久久国产精品-国产精品 | 国产黄色在线 | 久久午夜精品 | 日韩国产在线 | 成人国产精品入口免费视频 | 欧洲精品一区 | 久草网站| 国产在线一区二 | 国外成人免费视频 | 国产美女精品视频免费观看 | 成人天堂 | 一级高清免费毛片 | 黄在线 | 日韩视频区| 日韩av一区二区在线观看 | 91精品久久久久久久久久入口 | 综合国产第二页 | 成人欧美一区二区三区黑人孕妇 | 成人午夜在线观看 | 韩日精品一区 | 天天av天天好逼 | 日本不卡一区 | 免费a v网站 | 日韩精品视频在线 | 国产精品99999999| 国产精品国产精品 | 精品久久久久久久久久久久 | 国产一区二区久久 | 日韩在线中文 | 一级大黄 | 精品国产一区二区三区免费 | 在线免费观看a级片 | 成人深夜福利 | 欧美自拍第一页 | 精品中文字幕在线 | 不卡一区二区三区四区 |