新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于51單片機的ds18B20溫度程序

        基于51單片機的ds18B20溫度程序

        作者: 時間:2012-10-24 來源:網絡 收藏
        在學習板上正常運行,目前只能簡單的檢測溫度。 溫度變化速度有點慢,需要再調試。數碼管顯示還有點鬼影,暫時沒想出來怎么去消鬼影。 沒有添加溫度上下限報警程序,沒有添加按鍵可調,暫時不能顯示小數部分。 以后還得繼續努力把功能添加進去。點擊瀏覽下一頁
        測得室溫為31度

        #include reg51.h> /************共陽LED段碼表*****************/ unsigned char code tab[ ]={0xc0,0xf9,0xa4,
        0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6}; /************端口定義*************/ sbit DQ=P3^6; //數據傳輸線接單片機的相應的引腳 sbit wx1=P1^0;sbit wx2=P1^1;sbit wx3=P1^2;sbit wx4=P1^3;/****************定義全局變量*******************/ unsigned char tempL=0; //臨時變量低位 unsigned char tempH=0; //臨時變量高位 float temperature; //溫度值 /****************************************函數功能:延時子程序 入口參數:k 出口參數: *************************************************/ void delay(unsigned int k) { unsigned int n; n=0; while(n  k) {n++;} return; } /**********************************************函數功能:數碼管掃描延時子程序 入口參數: 出口參數: **************************************************/ /*void delay1(void) { int k; for(k=0;k400;k++); } */void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}/*******************************************函數功能:數碼管顯示子程序 入口參數:k 出口參數: ***********************************************/ void display(int k) { wx1=1; P2=tab[k/100]; delay1(3); P1=0x00;wx2=1; P2=tab[k%100/10]; delay1(3); P1=0x00;wx3=1; P2=tab[k%10]; delay1(3); P1=0x00;wx4=1; P2=tab[12]; delay1(3); P1=0x00;} /************************************************** 函數功能:DS18B20初始化子程序 入口參數: 出口參數: ***************************************************/ Init_DS18B20(void) { unsigned char x=0; DQ=1; //DQ先置高 delay(8); //延時 DQ=0; //發送復位脈沖 delay(85); //延時(>480ms) DQ=1; //拉高數據線 delay(14); //等待(15~60ms) } /*********************************************函數功能:向DS18B20讀一字節數據 入口參數: 出口參數:dat ***********************************************/ ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for (i=8;i>0;i--) { DQ=1; delay(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } /*********************************************函數功能:向DS18B20寫一字節數據 入口參數:dat 出口參數: ***********************************************/ WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat0x01; delay(5); DQ=1; dat>>=1; } delay(4); } /**********************************************函數功能:向DS18B20讀溫度值 入口參數: 出口參數:temperature ************************************************/ ReadTemperature(void) { Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號的操作 WriteOneChar(0x44); //啟動溫度轉換 delay(125); //轉換需要一點時間,延時 Init_DS18B20(); //初始化 WriteOneChar(0xcc); //跳過讀序列號的操作 WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位) tempL=ReadOneChar(); //讀出溫度的低位LSB tempH=ReadOneChar(); //讀出溫度的高位MSB //溫度轉換,把高低位做相應的運算轉化為實際溫度 temperature=((tempH*256)+tempL)*0.0625; delay(200); return(temperature); } /*************************************************函數功能:主程序 入口參數: 出口參數: ***************************************************/ void main() { float i; while(1) { i=ReadTemperature(); display(i); } } 



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 仪陇县| 大同市| 临沂市| 剑河县| 尚志市| 新和县| 稷山县| 秭归县| 丽江市| 嘉荫县| 汝城县| 子长县| 深水埗区| 长兴县| 莱芜市| 高安市| 彝良县| 上思县| 合江县| 新乡市| 武冈市| 姜堰市| 博客| 贺州市| 满洲里市| 绥德县| 济宁市| 包头市| 新化县| 出国| 宜宾县| 东乡| 玉林市| 碌曲县| 桐乡市| 天台县| 郑州市| 上蔡县| 丹棱县| 萨嘎县| 双柏县|