日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 技術(shù)學(xué)院 > 熱搜器件
[導(dǎo)讀]DS18B20溫度計(jì)的C語言程序

#include<reg51.h>
#include<intrins.h>
#include <math.H>  //要用到取絕對值函數(shù)abs()
//通過DS18B20測試當(dāng)前環(huán)境溫度, 并通過數(shù)碼管顯示當(dāng)前溫度值, 目前顯示范圍: -55~ +125度
sbit wela = P2^7;  //數(shù)碼管位選
sbit dula = P2^6;  //數(shù)碼管段選
sbit ds = P2^2;
int tempValue;
//0-F數(shù)碼管的編碼(共陽極)
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//0-9數(shù)碼管的編碼(共陽極), 帶小數(shù)點(diǎn)
unsigned char code tableWidthDot[]={0x40, 0x79, 0x24, 0x30,
0x19, 0x12, 0x02,0x78, 0x00, 0x10};
//延時函數(shù), 對于11.0592MHz時鐘, 例i=10,則大概延時10ms.
void delay(unsigned int i)
 {
  unsigned int j;
   while(i--)
    {
        for(j = 0; j < 125; j++);
    }
 }
 
//初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
void dsInit()
 {
   //對于11.0592MHz時鐘, unsigned int型的i, 作一個i++操作的時間大于?us
   unsigned int i;
   ds = 0;
    i = 100;   //拉低約800us, 符合協(xié)議要求的480us以上
    while(i>0) i--;
    ds = 1;    //產(chǎn)生一個上升沿, 進(jìn)入等待應(yīng)答狀態(tài)
     i = 4;
   while(i>0) i--;
 }
 
void dsWait()
 {
     unsigned int i;
     while(ds);
    while(~ds);  //檢測到應(yīng)答脈沖
    i = 4;
    while(i > 0) i--;
}
//向DS18B20讀取一位數(shù)據(jù)
//讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,
//之后DS18B20則會輸出持續(xù)一段時間的一位數(shù)據(jù)
bit readBit()
{
    unsigned int i;
   bit b;
   ds = 0;
  i++;   //延時約8us, 符合協(xié)議要求至少保持1us
  ds = 1;
  i++; i++;  //延時約16us, 符合協(xié)議要求的至少延時15us以上
   b = ds;
    i = 8;
    while(i>0) i--;  //延時約64us, 符合讀時隙不低于60us要求
   return b;
}
//讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readBit()來實(shí)現(xiàn)
unsigned char readByte()
{
   unsigned int i;
     unsigned char j, dat;
    dat = 0;
   for(i=0; i<8; i++)
   {
        j = readBit();
       //最先讀出的是最低位數(shù)據(jù)
       dat = (j << 7) | (dat >> 1);
    }
    return dat;
}
//向DS18B20寫入一字節(jié)數(shù)據(jù)
void writeByte(unsigned char dat)
{
 unsigned int i;
   unsigned char j;
    bit b;
  for(j = 0; j < 8; j++)
   {
       b = dat & 0x01;
       dat >>= 1;
       //寫"1", 將DQ拉低15us后, 在15us~60us內(nèi)將DQ拉高, 即完成寫1
        if(b)
       {
            ds = 0;
           i++; i++;  //拉低約16us, 符號要求15~60us內(nèi)
            ds = 1; 
           i = 8; while(i>0) i--;  //延時約64us, 符合寫時隙不低于60us要求
       }
      else  //寫"0", 將DQ拉低60us~120us
           ds = 0;
            i = 8; while(i>0) i--;  //拉低約64us, 符號要求
            ds = 1;
           i++; i++;  //整個寫0時隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時64us了
    
    }
}
//向DS18B20發(fā)送溫度轉(zhuǎn)換命令
void sendChangeCmd()
{
   dsInit();    //初始化DS18B20, 無論什么命令, 首先都要發(fā)起初始化
   dsWait();   //等待DS18B20應(yīng)答
   delay(1);    //延時1ms, 因?yàn)镈S18B20會拉低DQ 60~240us作為應(yīng)答信號
    writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
   writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字 Convert T
}
//向DS18B20發(fā)送讀取數(shù)據(jù)命令
void sendReadCmd()
{
   dsInit();
   dsWait();
   delay(1);
   writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
   writeByte(0xbe); //寫入讀取數(shù)據(jù)令字 Read Scratchpad
}
//獲取當(dāng)前溫度值
int getTmpValue()
{
    unsigned int tmpvalue;
   int value; //存放溫度數(shù)值
  float t;
    unsigned char low, high;
   sendReadCmd();
    //連續(xù)讀取兩個字節(jié)數(shù)據(jù)
  low = readByte();
  high = readByte();
    //將高低兩個字節(jié)合成一個整形變量
    //計(jì)算機(jī)中對于負(fù)數(shù)是利用補(bǔ)碼來表示的
    //若是負(fù)值, 讀取出來的數(shù)值是用補(bǔ)碼表示的, 可直接賦值給int型的
value
    tmpvalue = high;
    tmpvalue <<= 8;
    tmpvalue |= low;
   value = tmpvalue;
 
    //使用DS18B20的默認(rèn)分辨率12位, 精確度為0.0625度, 即讀回?cái)?shù)據(jù)的最低位代表0.0625度
   t = value * 0.0625;
    //將它放大100倍, 使顯示時可顯示小數(shù)點(diǎn)后兩位, 并對小數(shù)點(diǎn)后第三進(jìn)行4舍5入
   //如t=11.0625, 進(jìn)行計(jì)數(shù)后, 得到value = 1106, 即11.06 度
   //如t=-11.0625, 進(jìn)行計(jì)數(shù)后, 得到value = -1106, 即-11.06 度
    value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
   return value;
}
unsigned char const timeCount = 3; //動態(tài)掃描的時間間隔
//顯示當(dāng)前溫度值, 精確到小數(shù)點(diǎn)后一位
//若先位選再段選, 由于IO口默認(rèn)輸出高電平, 所以當(dāng)先位選會使數(shù)碼管出現(xiàn)亂碼
void display(int v)
{
    unsigned char count;
   unsigned char datas[] = {0, 0, 0, 0, 0};
   unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
   datas[1] = tmp % 10000 / 1000;
   datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
    datas[4] = tmp % 10;
   if(v < 0)
    {
       //關(guān)位選, 去除對上一位的影響
       P0 = 0xff;
       wela = 1; //打開鎖存, 給它一個下降沿量
       wela = 0;
       //段選
      P0 = 0x40; //顯示"-"號
       dula = 1;  //打開鎖存, 給它一個下降沿量
      dula = 0;
       //位選
      P0 = 0xfe;
       wela = 1; //打開鎖存, 給它一個下降沿量
        wela = 0;
      delay(timeCount);
    }
    for(count = 0; count != 5; count++)
    {
        //關(guān)位選, 去除對上一位的影響
       P0 = 0xff;
      wela = 1; //打開鎖存, 給它一個下降沿量
       wela = 0;
        //段選
        if(count != 2)
      {
    
               P0 = table[datas[count]];  //顯示數(shù)字
        }
       else
        {
            P0 = tableWidthDot[datas[count]]; //顯示帶小數(shù)點(diǎn)數(shù)字
       }
        dula = 1;  //打開鎖存, 給它一個下降沿量
        dula = 0;
        //位選
        P0 = _crol_(0xfd, count); //選擇第(count + 1) 個數(shù)碼管
       wela = 1; //打開鎖存, 給它一個下降沿量
       wela = 0;
       delay(timeCount);
    }
}
void main()
{
  unsigned char i;
 
   while(1)
    {
        //啟動溫度轉(zhuǎn)換
       sendChangeCmd();
       //顯示5次
        for(i = 0; i < 40; i++)
        {
           display(tempValue);
     }
        tempValue = getTmpValue();
    }

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉