两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

1.小于0度的轉(zhuǎn)換

我們知道當(dāng)測量的實(shí)際溫度為0度以下時(shí),temp沒轉(zhuǎn)換時(shí)的情況為下圖所示

溫度傳感器7

我們已經(jīng)知道高5位為1表示的是負(fù)數(shù),那么-0.5度的時(shí)候?yàn)槭裁词?111 1111 1111 1000。

負(fù)數(shù)的計(jì)算涉及到補(bǔ)碼的知識。首先0xFFF8,除去高5位那就是

111 1111 1000

反碼為 000 0000 0111

而補(bǔ)碼就是反碼加1,也就是補(bǔ)碼為000 0000 1000

這樣0.5就是由補(bǔ)碼(十進(jìn)制的8)乘以0.0625得來。

我們要知道,負(fù)數(shù)的時(shí)候需要關(guān)注的是temp的低11位,補(bǔ)碼其實(shí)就是2的11次方(2048)減去temp的低11位的數(shù)值。

-55度的時(shí)候,補(bǔ)碼為2048-0x0490=880。 轉(zhuǎn)換就是880*0.0625=55。加上符號就是-55度了。

因?yàn)闇y量負(fù)數(shù)時(shí)只能測-0.1~-55.0,所以液晶屏的顯示就有像以下兩種情況

溫度傳感器8

溫度傳感器9


代碼上我們是這樣處理的

temp=temp&0x07FF;                   //清除掉高5位使其變?yōu)?
temp=2048-temp;                     //此時(shí)的temp為補(bǔ)碼     
temp_float=(float)temp*0.0625*10.0; //實(shí)際溫度值再乘以10倍
temp=(unsigned int)temp_float;      //得到16位整型的數(shù)值
 
str[0]='-';                         //添加負(fù)數(shù)的符號
str[1]='0'+( (temp/100)%10 );       //當(dāng)溫度在-10度以下時(shí)需要顯示十位數(shù)
str[2]='0'+( (temp/10)%10 );        //溫度必須顯示個(gè)位數(shù),哪怕是0,比如“-0.5”
str[3]='.';
str[4]='0'+( temp%10 );             //溫度必須顯示小數(shù)點(diǎn)后的一位
 
if(str[1]=='0')
{ 
    str[1]='-';                     //如果溫度沒有低于等于-10.0度(比如是-9.8度),讓str[1]填充負(fù)數(shù)符號,如果溫度低于等于-10.0度,那么填充負(fù)數(shù)符號的是str[0]
    LcdShowStr(0, 0, str+1);        //溫度高于-10.0度,只需顯示4個(gè)字符
}
else LcdShowStr(0, 0, str);         //溫度低于等于-10.0度,顯示5個(gè)字符

實(shí)際溫度是-10.0以下的話就是顯示5個(gè)字符(比如-11.7度)。

實(shí)際溫度大于-10.0的話,比如-9.8度,要做到高位為0不顯示,所以str[1]等于'0'時(shí)讓“str[1]='-';”。這樣的話“LcdShowStr(0, 0, str+1);”就是如下圖顯示了


溫度傳感器10


2.再談指針

以上兩種轉(zhuǎn)換方式我們整合成了一個(gè)“溫度轉(zhuǎn)換”的函數(shù)

unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)
{
    unsigned char res;
    float  temp_float;
    
    res = Get18B20Temp(temp);  //讀取當(dāng)前溫度,傳入的參數(shù)是指針類型
    if (res)                   //讀取成功時(shí),進(jìn)行溫度轉(zhuǎn)換
    {
        if( (*temp>>11)==0 )   //溫度大于等于0度     
        {   
            temp_float=( (float)(*temp) ) *0.0625*10.0;  //*temp就是沒有轉(zhuǎn)換時(shí)的16位那個(gè)變量,然后再把實(shí)際溫度值再乘以10倍
            *temp=(unsigned int)temp_float;              //得到16位整型的數(shù)值
            str[0]='0'+( (*temp/1000)%10 );              //當(dāng)溫度大于等于100度時(shí)需要顯示百位數(shù)
            str[1]='0'+( (*temp/100)%10 );               //當(dāng)溫度大于等于10度時(shí)需要顯示十位數(shù)
            str[2]='0'+( (*temp/10)%10 );                //當(dāng)溫度大于等于1度時(shí)需要顯示個(gè)位數(shù)
            str[3]='.';
            str[4]='0'+( (*temp)%10 );                   //溫度必須顯示小數(shù)點(diǎn)后的一位
 
            if(str[0]=='0')temp_i++;
            if(str[1]=='0')temp_i++;
 
            return 1;//讀取溫度成功,返回值一律為1
        } 
 
        else if( (*temp>>11)>0 )//溫度小于0度     
        {
            *temp=(*temp)&0x07FF;                       //清除掉高5位使其變?yōu)?
            *temp=2048-(*temp);                         //此時(shí)的temp為補(bǔ)碼     
            temp_float=( (float)(*temp) )*0.0625*10.0;  //實(shí)際溫度值再乘以10倍
            *temp=(unsigned int)temp_float;             //得到16位整型的數(shù)值
 
            str[0]='-';                                 //添加負(fù)數(shù)的符號
            str[1]='0'+( (*temp/100)%10 );              //當(dāng)溫度在-10度以下時(shí)需要顯示十位數(shù)
            str[2]='0'+( (*temp/10)%10 );               //溫度必須顯示個(gè)位數(shù),哪怕是0,比如“-0.5”
            str[3]='.';
            str[4]='0'+( (*temp)%10 );                  //溫度必須顯示小數(shù)點(diǎn)后的一位
 
            if(str[1]=='0')
            { 
                str[1]='-';
                temp_i=1;//實(shí)際溫度大于-10.0度的時(shí)候,假如是-5.4度,那么“LcdShowStr(0, 0, str+temp_i);”就是顯示“-5.4”,小數(shù)點(diǎn)就是在第3個(gè)顯示格上顯示
                         //實(shí)際溫度小于等于-10.0度的時(shí)候,假如是-12.6度,str[1]不等于‘0’,
                         //這樣temp_i是等于0的,那么“LcdShowStr(0, 0, str+temp_i);”顯示“-12.6”,小數(shù)點(diǎn)就是在第4個(gè)顯示格上顯示  
            }
 
            return 1;    //讀取溫度成功,返回值一律為1
        } 
    } 
     
    return 0;//讀取溫度不成功,返回值為0
}

這個(gè)函數(shù)在主函數(shù)里的用法就是判斷返回值是否為1

if( TEMP_CONV(&temp,str)==1 )     //返回值為1代表讀取溫度成功

我們在主函數(shù)里定義了一個(gè)u16類型的變量temp,

傳入給“unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)”的第一個(gè)參數(shù)是變量temp的指針,然后該函數(shù)執(zhí)行的第一句“res = Get18B20Temp(temp);”此時(shí)傳入的參數(shù)temp是個(gè)指針變量,“Get18B20Temp(temp)”函數(shù)內(nèi)部的執(zhí)行就是把溫度數(shù)據(jù)賦給傳入的指針的那個(gè)內(nèi)存里,后面的“*temp”代表的就是這個(gè)內(nèi)存的變量,也就是讀出的未轉(zhuǎn)換的溫度值。

點(diǎn)贊(1)

C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:

一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程

解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程

從零到寫出一個(gè)爬蟲的Python編程課程

只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程

手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運(yùn)行等待時(shí)間)