打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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;
  TL1=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);
 }
 }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
温度测量DSB1820 lcd1602液晶显示
DS18B20 测温程序完全解读
DS18B20和串口通信的那点事儿 ? 笨笨剥壳
LED数码管和DS18B 20温度显示器设计
单片机温度检测报警程序(ds18b20)-Changing's Blog
温度传感器18B20驱动程序(C语言)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服