【小实验】C51单片机 DS18B20温度显示实验
生活随笔
收集整理的這篇文章主要介紹了
【小实验】C51单片机 DS18B20温度显示实验
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)驗(yàn)內(nèi)容:?
? ? ?利用單總線技術(shù)和數(shù)碼管動(dòng)態(tài)顯示的原理,要求實(shí)現(xiàn)DS18B20溫度采集并顯示,能夠設(shè)定溫度值上限值27.5度,當(dāng)超出上限值LED燈閃爍。?
?
實(shí)驗(yàn)前可先用protues繪制出原理圖:
仿真圖如下:
?
keil c51代碼:?
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7; sbit P2_0=P2^0; sbit k2=P2^2; sbit k4=P2^4; sbit k3=P2^3; uchar timp,F=0; float c; uchar a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uchar b[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay5(uchar n) { do{_nop_();_nop_();_nop_();n--;}while(n); }void init_DS18B20() {uchar x=0;DQ=0;delay5(120);DQ=1;delay5(16);delay5(80); }uchar readbyte() {uchar i=0;uchar date=0;for(i=8;i>0;i--){DQ=0;delay5(1);DQ=1;date>>=1;if(DQ)date|=0x80;delay5(11);}return(date); }void writebyte(uchar dat){uchar i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay5(12);DQ=1;dat>>=1;delay5(5);}}uchar retemp(){uchar a,b,tt;uint t;init_DS18B20();writebyte(0xCC);writebyte(0x44);init_DS18B20();writebyte(0xCC);writebyte(0xBE);a=readbyte();b=readbyte();t=b;t<<=8;t=t|a;if((t&0xf800)!=0xf800){ F=0;c=t*0.0625;tt=t*0.0625;timp=t*0.625-tt*10;}else{ F=1;t=(~t)+1;c=t*0.0625;tt=t*0.0625;timp=t*0.625-tt*10;}return tt;}void main(){uchar i,temp;delay5(1000);while(1){temp=retemp();if(c>=25&&F==0)P2_0=0;elseP2_0=1;for(i=0;i<15;i++){k2=1;k3=1;k4=1;if(F==0)P0=a[temp/100];elseP0=a[10];delay5(1000);// P2=0xfb;//11111011,0xfbk2=0;k3=1;k4=1;P0=a[temp%100/10];delay5(1000);//P2=0xf7;//11110111,0xf7k2=1;k3=0;k4=1;P0=b[temp%10];delay5(1000);//P2=0xf3;//11110011,0xf3k2=0;k3=0;k4=1;P0=a[timp];delay5(1000);}if(c>=25&&F==0)P2_0=1;elseP2_0=1;}}代碼僅供參考,希望大家能夠在此基礎(chǔ)上優(yōu)化代碼,而不是ctrl+c,ctrl+v。
謝謝!!!
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的【小实验】C51单片机 DS18B20温度显示实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue入门之Web端CURD前端项目示例
- 下一篇: 动态规划求解多段图最短路径