资讯详情

DS18B20延时函数版

程序运行效果图: //晶振12MHZ 常温下测量0--99.9度

#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sfr wdtrst=0xa6; uchar code seg7[]={0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60}; //整数 sbit dec=P0^5;//数码管小数位 sbit Dq=P3^4; //DS18B20读写口 sbit alarm=P3^3; //喇叭报警位 uint warning=0;//报警温度变量 //------------------- void rst() //看门狗系统复位函数晶振是12MHZ则看门狗自动复位时间为16ms { wdtrst=0x1e; wdtrst=0xe1; } //---------------------------- void alarmstart()interrupt 3 //报警中断子函数 { if(warning>270)//温度大于27度喇叭报警 {alarm=~alarm;} TH1=0xff; =0x60; TF1=0; EA=1; ET1=1; }

//-----------------------------延时函数集--------------------- void delay10us() //延时10us { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } //---------- void delay610us() //延时610us { uchar i,j; for(i=0;i<2;i++) for(j=0;j<100;j++); }

//---------- void delay34us() //延时34us { uchar i,j; for(i=0;i<2;i++) for(j=0;j<3;j++); } //---------- void delay(uint k) //常用延时函数 { uchar i,j; for(i=0;i<k;i++) for(j=0;j<100;j++); }

//-----------------DS18B20初始化函数---------- uchar init18b20() { uint k=0; Dq=0; delay610us(); //延时610us Dq=1; //释放总线 delay10us(); //延时10us while(Dq==1) //18b20应答信号判断是否超时 { if(k<800)k++; else return 1; } k=0; while(Dq==0) //18b20是否释放判断 { if(k<800)k++; else return 2; } return 3; //启动成功返回 3 }

//---------读1字节函数------------ uchar readbyte() { uchar i,byte=0; for(i=0;i<8;i++) { Dq=0; byte>>=1; Dq=1; if(Dq) { byte=byte|0x80; } delay34us(); } return byte; }

//-----------写1字节函数-------- void writebyte(uchar byt) { uchar i; for(i=0;i<8;i++) { Dq=0; Dq=byt&0x01; delay34us(); Dq=1; byt>>=1; } }

//---------温度读取函数-------- uint readtemp() { uint temp=0; uchar TH,TL; if(init18b20()!=3)return 1;//启动失败返回值1 writebyte(0xcc); writebyte(0x44); ;; if(init18b20()!=3)return 1; //启动失败返回值1 writebyte(0xcc); writebyte(0xbe); TL=readbyte(); TH=readbyte(); temp=TH; temp<<=8; temp=temp+TL; temp=temp*0.0625*10; //乘以10取出小数部分 return temp; }

//------------主函数----------

void main() { uint num=0; TMOD=0x50; TH1=0xff; TL1=0x60; EA=1; ET1=1; TR1=1; rst(); //看门狗 while(1) { start:num=readtemp(); if(num==1) //启动失败数码管最高位设置为1 { warning=1; //启动失败报警变量设置为 1 P0=seg7[1]; P2=0xfe; delay(40); goto start; //启动失败重新启动判断,直到成功才显示温度数值,然后启动判断失败1消失。 } rst();//看门狗 warning=num; P0=seg7[num/100]; P2=0xdf; delay(10); P0=seg7[num%100/10]; dec=0; P2=0xbf; delay(10); P0=seg7[num%100%10]; dec=1; P2=0x7f; delay(10); } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台