⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20.txt

📁 基于单片机c51的开发程序,温度采集系统,开发
💻 TXT
字号:
#include<reg51.h>
#include<absacc.h>
#include<math.h>

#define uint  unsigned int
#define uchar unsigned char

#define PA8155 XBYTE[0x7101]
#define PB8155 XBYTE[0x7102]
#define COM8155 XBYTE[0x7100]

sbit dq= P1^7;                                                       //定义DS18B20数据输入输出端

bit flag;
uint b1,x,z;

unsigned int table1[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};  //0~9的段码

//延时函数
void delay(uchar i)                                                  //延时函数
{   
	while(i--);  
} 

//初始化DS18B20
void init1820()                                                      
{
	dq = 1;                                                      //dq复位
   	delay(8);                                                    //稍做延时
  	dq=0;                                                        //单片机将dq拉低
   	delay(80);                                                   //精确延时 大于 480us
   	dq = 1;                                                      //拉高总线
   	delay(14);
   	if(dq==0)                                                    //稍做延时后 如果dq=0则初始化成功 dq=1则初始化失败
   		flag=1;
   	else 
		flag=0;
   	delay(20);
}

//读一个字节
uchar read1820()                                                     
{ 
	uchar i,u=0;  
  	for (i=1;i<=8;i++)
  	{ 
   		dq=0;                                                // 给脉冲信号
   		u>>=1;
   		dq=1;                                                // 给脉冲信号
   		if(dq) 
			u|=0x80;
   		delay(4);
  	}
  	return(u);
}

//写一个字节
uchar wr1820(uchar wr)                                              
{   
	uchar j;
  	for(j=1;j<=8;j++)
  	{  
   		dq=0;
   		dq= wr&0x01; 
   		delay(5);                                             //17us
   		dq=1;
   		wr>>=1;                                               // ????(??????)
  	} 
  	return 0;
}

//DS18B20 开始转换
void tmpchange(void)                                                   
{
	init1820();
   	wr1820(0xcc);                                                //跳过读序号列号的操作
   	wr1820(0x44);                                                // 启动温度转换
}

//读取温度
uint tmp()                                                                                            
{
	uint a,b,t;
   	init1820();
   	wr1820(0xcc);                                                //跳过读序号列号的操作
   	wr1820(0xbe);                                                // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   	a= read1820();                                               // 读取温度值低位
   	b= read1820();                                               //读取温度值高位
   	a=a>>4;                                                      //低位右移4位,舍弃小数部分
   	t=b<<4;                                                      //高位左移4位,舍弃符号位
   	t=t|a;                                                       //将高低位合并成一个整型量
   	return t;
}

//显示函数,将温度显示在数码管上
void disp(uint i1,uint i2,uint i3,uint i4)                           //数码管显示程序
{
	COM8155=0x03;                                                //启动8155控制口
   	for(z=0;z<10;z++)
   	{
  		PA8155=0x10;                                         //选中个位数码管
   		b1=table1[i1];                                       //取段码
   		PB8155=b1;                                           //送数码管显示
   		delay(500);
   		PA8155=0x20;                                         //十位
   		b1=table1[i2];
   		PB8155=b1;
   		delay(500);
   		PA8155=0x40;                                         //百位
   		b1=table1[i3];
   		PB8155=b1;
   		delay(500);
   		PA8155=0x80;                                         //千位
   		b1=table1[i4];
   		PB8155=b1;
   		delay(500);
  	} 
}

//主函数
void main()
{
	uint temp;
   	while(1)                                                     //不断循环采集温度
  	{
   		tmpchange();                                         //启动转换
   		temp=tmp();     				     //读取温度      
   		disp(temp%10,temp%100/10,temp%1000/100,temp/1000);   //显示温度
  	}   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -