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

📄 9 ds18b20.c

📁 很好的51单片机仿真模板。
💻 C
字号:
//安装目录下的 EXE 文件,通过串口线连接计算机与实验板,打开 
//软件后可在软件界面上显示当前温度值。 
#include <reg52.h> 
#define uchar unsigned char 
#define uint unsigned int 
sbit DS=P2^2;           //define interface  定义 DS18B20 接口 
uint temp;             // variable of temperature 
uchar flag1;            // sign of the result positive or negative 
sbit dula=P2^6; 
sbit wela=P2^7; 
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 
							0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。 
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 
          					 0x87,0xff,0xef};          //    带小数点编码。 
void delay(uint count)      //延时子函数 
{ 
	uint i; 
	while(count) 
	{ 
		i=200; 
		while(i>0) 
		i--; 
		count--; 
	} 
} 
///////功能:串口初始化,波特率 9600,方式 1/////// 
void Init_Com(void)    
{ 
	TMOD = 0x20; 
	PCON = 0x00; 
	SCON = 0x50; 
	TH1 = 0xFd; 
	TL1 = 0xFd; 
	TR1 = 1; 
} 
 
void dsreset(void)       //发送初始化及复位信号 
{ 
	uint i;                //DS18B20 初始化 
	DS=0; 
	i=103; 
	while(i>0)i--; 
	DS=1; 
	i=4; 
	while(i>0)i--; 
} 
 
bit tmpreadbit(void)       //read a bit 读一位 
{ 
	uint i; 
	bit dat; 
	DS=0;i++;          //i++ for delay  小延时一下 
	DS=1;i++;i++; 
	dat=DS; 
	i=8;while(i>0)i--; 
	return (dat); 
} 
 
uchar tmpread(void)      //read a byte date  读一个字节 
{ 
	uchar i,j,dat; 
	dat=0; 
	for(i=1;i<=8;i++) 
	{ 
		j=tmpreadbit(); 
		dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好//一个字节在 DAT 里 
	} 
	return(dat);             //将一个字节数据返回 
} 
 
void tmpwritebyte(uchar dat)      //write a byte to ds18b20 
{                           //写一个字节到 DS18B20 里 
	uint i; 
	uchar j; 
	bit testb; 
	for(j=1;j<=8;j++) 
	{ 
		testb=dat&0x01; 
		dat=dat>>1; 
		if(testb)     //write 1     写 1 部分 
		{ 
			DS=0; 
			i++;i++; 
			DS=1; 
			i=8;while(i>0)i--; 
		} 
		else 
		{ 
			DS=0;       //write 0    写 0 部分 
			i=8;while(i>0)i--; 
			DS=1; 
			i++;i++; 
		} 
	} 
} 
 
void tmpchange(void)    //DS18B20 begin change  发送温度转换命令 
{ 
	dsreset();             //初始化 DS18B20 
	delay(1);             //延时 
	tmpwritebyte(0xcc);  //  跳过序列号命令 
	tmpwritebyte(0x44);  //发送温度转换命令 
} 
uint tmp()               //get the temperature  获得温度 
{ 
	float tt; 
	uchar a,b; 
	dsreset(); 
	delay(1); 
	tmpwritebyte(0xcc);    
	tmpwritebyte(0xbe);    //发送读取数据命令 
	a=tmpread();          //连续读两个字节数据 
	b=tmpread(); 
	temp=b; 
	temp<<=8;             //two byte  compose a int variable 
	temp=temp|a;         //两字节合成一个整型变量。 
	tt=temp*0.0625;       //得到真实十进制温度值,因为 DS18B20 
	//可以精确到 0.0625 度,所以读回数据的最低位代表的是 
	//0.0625 度。 
	temp=tt*10+0.5;   //放大十倍,这样做的目的将小数点后第一位 
	//也转换为可显示数字,同时进行一个四舍五入操作。 
	return temp;     //返回温度值 
} 
/*
void readrom()          //read the serial  读取温度传感器的序列号 
{                      //本程序中没有用到此函数 
	uchar sn1,sn2; 
	dsreset(); 
	delay(1); 
	tmpwritebyte(0x33); 
	sn1=tmpread(); 
	sn2=tmpread(); 
} 
*/
void display(uint temp)      //显示程序 
{ 
	uchar A1,A2,A2t,A3,ser; 
	ser=temp/10;           //分离出三位要显示的数字 
	SBUF=ser; 
	A1=temp/100; 
	A2t=temp%100; 
	A2=A2t/10; 
	A3=A2t%10; 
	dula=0; 

	P0=table[A1];    //显示百位 
	dula=1; 
	dula=0; 
	wela=0; 
	P0=0x7e; 
	wela=1; 
	wela=0; 
	delay(2); 
	
	P0=0;   	  //------------
	dula=1; 	  //该部分仿真必须要。
	dula=0; 	  //因为每次下一位的段选打开后,码值会先赋值给上一位,
	P0=0x7e; 	  //从而改变上一位的显示。然后再打开下一位的位选。
	wela=1; 	  //
	wela=0; 	  //------------

	//dula=0; 
	P0=table1[A2];   //显示十位  带小数点的 
	dula=1; 
	dula=0; 
	wela=0; 
	P0=0x7d; 
	wela=1; 
	wela=0; 
	delay(2); 	  //延时改为2 仿真需要

	P0=0;   	  //------------
	dula=1; 	  //该部分仿真需要
	dula=0; 	  //
	P0=0x7d; 	  //
	wela=1; 	  //
	wela=0;		  //-------------

	P0=table[A3];    //显示个位 
	dula=1; 
	dula=0; 
	P0=0x7b; 
	wela=1; 
	wela=0; 
	delay(2); 
	
	P0=0;   	  //------------
	dula=1; 	  //该部分仿真需要
	dula=0; 	  //
	P0=0x7b; 	  //
	wela=1; 	  //
	wela=0;		  //-------------
} 
void main()               //主函数 
{ 
	uchar a; 
	Init_Com();            //初始化串口 
	do 
	{ 
		tmpchange();      //温度转换 
		for(a=20;a>0;a--) 
		{    
			display(tmp());   //显示十次 
		} 
	}               
	while(1); 
} 
 

⌨️ 快捷键说明

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