DS18B20-51代码

来源:互联网 发布:沈阳seo外包公司 编辑:程序博客网 时间:2024/05/20 23:05

声明 :仅供参考  

单片机 :89c52      pnp三极管驱动共阳数码管      

# include <reg52.h># include <intrins.h># define uint unsigned int # define uchar unsigned charuchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x66,0x21,0x06,0x0e,0x0c,0x09,0x11};sbit led0=P2^0;sbit led1=P2^1;sbit led2=P2^2;sbit led3=P2^3;sbit led4=P2^4;sbit led5=P2^5;sbit ds=P2^6;float ftemp;uint temp,flag;void delay15us(uint temp)  //整个函数关键的部分就在这个延时函数  在ds18b20中 每一步的延时都要求比较精确  要严格依据时序来写{for(temp;temp>0;temp--){_nop_();_nop_();_nop_();}_nop_();_nop_();}void delay(uint k) //延时函数   这个延时是为了数码管{uint i,j;for(i=k;i>0;i--)for(j=113;j>0;j--) ;}bit RST()   //复位函数{bit ret=1; ds=0;delay15us(39);ds=1;delay15us(4);ret=ds;  //检测是否变位成功  即ds是否为零 下面用一个led/测试一下//led=ds;delay15us(27);//这都是根据时序图上来写的ds=1;    return ret ;//其实有点不明白  为什么加上这个返回值  有什么用吗}void writebit(bit dat_bit) //完全依据时序来写一位 的函数{ds=0;delay15us(0);ds=dat_bit;delay15us(2);ds=1;}void writebyte(uchar dat_byte){uint i;for(i=0;i<8;i++){ writebit((dat_byte&0x01)); dat_byte>>=1;}}bit readbit(){bit dat_bit;ds=0;_nop_();_nop_();_nop_();ds=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();dat_bit=ds;delay15us(3);ds=1;return dat_bit;}uchar readbyte(){uchar dat_byte=0;uchar i,j;for(i=0;i<8;i++){j= readbit();dat_byte=(j<<7)|(dat_byte>>1);}return dat_byte;}void sweap()  //启动温度转换{RST();_nop_();_nop_();writebyte(0xcc);writebyte(0x44);}uint get(){uint a,b,t;RST();_nop_();_nop_();writebyte(0xcc);writebyte(0xbe);a=readbyte();b=readbyte();if(b&0xfc){ temp=b; temp= temp<<8; temp|=a; temp=((~temp)+1); ftemp=temp*0.0625*100+0.5; t=ftemp; flag=1;}else{   ftemp=((b*256)+a)*0.0625;    t=ftemp*100+0.5;flag=0;}return t;}void display(disnum){led0=0;P1=table1[disnum/1000];delay(3);P1=0xff;led0=1;led1=0;P1=table2[disnum%1000/100];delay(3);P1=0xff;led1=1;led2=0;P1=table1[disnum%100/10];delay(3);P1=0xff;led2=1;led3=0;P1=table1[disnum%10];delay(3);P1=0xff;led3=1;led4=0;P1=0xc6;delay(1);led4=1;}void main(){uint disnum;led5=0;while(1){sweap() ;disnum=get();display(disnum);}}

原创粉丝点击