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

📄 temp.c

📁 通过ds18b20的读写时序
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int


uchar dis[5]={0x10,0x10,0x10,0x10};
uchar c[4]={1, 2, 4, 8};
uchar seg7[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
uchar dot_seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

uint	tm; //从DS18B20读出的数据

uchar isNeg;/*是否为负数标志位*/
sbit DQ=P3^7;/*DS18B20的DQ端*/
/* ********************延时t毫秒 ***************************/
void delay(uint t)
{
	uchar m;
	while(t--)
	{
		for (m=0;m<100;m++)
			;
	}
} 

/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延时1微秒
{
   while(i--)
   	;
}


/********************* 产生复位脉冲初始化DS18B20 **************************/
void TxReset(void)
{
	DQ = 1;          //DQ复位
	delay_18B20(4); //延时
	DQ = 0;          //DQ拉低
	delay_18B20(100); //精确延时大于480us
	DQ = 1;          //拉高
	delay_18B20(4); 
}

/* ***********************等待应答脉冲 *********************/
void RxWait(void)
{
	while(DQ)
		;
	while(~DQ)
		;			// 检测到应答脉冲 

	delay_18B20(1);
}

/* ****************读取数据的一个字节 *****************************/
uchar RdByte(void)
{
	unsigned char i=0;
	unsigned char dat = 0;
	for(i = 8; i > 0; i--)
	{   
		DQ = 0; //给脉冲信号
    	dat >>= 1;
    	DQ = 1; //给脉冲信号
    	if(DQ)
    		dat |= 0x80;
    	delay_18B20(10);
	}
   return(dat);
}

/* ****************写数据的一个字节,满足写1和写0的时隙要求 *************/
void WrByte(uchar wdata)
{
	unsigned char i=0;
	for(i = 8; i > 0; i--)
	{
   		DQ = 0;
     	DQ = wdata&0x01;
     	delay_18B20(10);
     	DQ = 1;
     	wdata>>=1;
	 	delay_18B20(10);
	}
}

/* **************启动温度转换 *******************/
void convert(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20
	RxWait();			// 等待DS18B20给出应答脉冲
	WrByte(0xcc);		// skip rom 命令
	WrByte(0x44);		// convert T 命令
}

/**************** 读取温度值 *********************/
void RdTemp(void)
{
	uchar tpmsb, tplsb;

	convert();
	TxReset();			// 产生复位脉冲,初始化DS18B20 
	RxWait();			// 等待DS18B20给出应答脉冲
	WrByte(0xcc);		// skip rom 命令
	WrByte(0xbe);		// read scratchpad 命令
	tplsb = RdByte();	// 温度值低位字节(其中低4位为二进制的“小数”部分)
	tpmsb = RdByte();	// 高位值高位字节(其中高5位为符号位)		
	tm = tpmsb;
	tm <<= 8;
	tm = tm | tplsb;
	if(tm & 0x0fff)
		isNeg = 0;
	else
	{
		tm = ~tm + 1;
		isNeg = 1;
	}
}

//*************************8数据处理程序************************//
void dataProc(void)
{
    uchar temp1,temp2;
	uint tt;
	uint tmp;

	if(tm < 0) 
		tm = 0 - tm;
	temp2 = tm & 0x0f;
	temp1 = (tm >> 4) & 0xff;
	tmp = temp1 / 10 % 10;
	if(tmp >= 5 && tmp != 16)
		P1 = 0x08;
	else 
		P1 = 0x40;

	if(tmp == 0)
		dis[0] = seg7[16];
	else
		dis[0] = seg7[tmp];
	if(isNeg)
		dis[0] = 0xbf;
	tmp = temp1 % 10;
	dis[1] = dot_seg[tmp];
	tt = tm & 0x0f;
	if(isNeg == 0)
		tt = 625*tt;
	else 
	{
		tt = 0 - tt;
		tt = tt & 0x0f;
		tt = tt * 625;
	}
	tmp = tt / 1000;
	dis[2] = seg7[tmp];
	tmp = tt / 100 % 10;
	dis[3] = seg7[tmp];
}
//**************显示程序**************** 使用了时钟中断//
void display(void) interrupt 1
{   
	static uchar	i;   
	
	TH0 = 0xD8;
	TL0 = 0xF0;	 
	P2 = c[i];  
	P0 = dis[i];
	i = (i + 1) % 4;
}

void initINT(void)
{
	TMOD = 0x01;
	TH0 = 0xF0;
	TL0 = 0x5F;
	ET0 = 1;
	EX0 = 1;
    TR0 = 1;    
	EA = 1;
}

/* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
   tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
   5位为符号位。真正通过数码管输出时,需要进行到十进
   制有符号实数(包括小数部分)的转换。*/      
void main(void)
{	
	initINT();
	P0=0xff;
	P1 = 0;
  	while(1)
	{	
		RdTemp();		// 读取温度
		dataProc();
		delay(250);
	}
}

⌨️ 快捷键说明

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