女儿茶属于什么茶| 60岁男人喜欢什么样的女人| 6.26是什么星座| 肚子里面跳动是什么原因| 做梦梦到狮子是什么意思| 行善积德是什么生肖| 头大脸大适合什么发型| 喉咙有浓痰是什么原因| 为什么新疆人不吃猪肉| 陆代表什么生肖| 女攻是什么意思| 吹箫什么意思| 反差萌是什么意思| 鸽子咳嗽吃什么药最好| 梦见怀孕是什么意思| 煲电话粥什么意思| 怀孕上火吃什么降火| 痰多吃什么好| 女性经常手淫有什么危害| 晚上七点到九点是什么时辰| 四川的耗儿鱼是什么鱼| 力排众议是什么意思| 塑胶厂是做什么的| 喉咙长息肉有什么症状| 棉花是什么时候传入中国的| 执迷不悟是什么生肖| 白居易主张什么| 按摩椅什么牌子最好| 考试吃什么早餐| 舌头麻木吃什么药| 笑面虎比喻什么样的人| 为什么喜欢秋天| 日柱金舆是什么意思| 牛黄是什么东西| 脚底痒是什么原因| 什么药可以减肥瘦身| 吃知柏地黄丸有什么副作用| 伏特加是用什么酿造的| 怀孕孕酮低吃什么补得快| 阴阳和合是什么意思| cpc什么意思| 添堵是什么意思| 杨梅有什么功效| 中元节是什么节| 3.5是什么星座| simon什么意思| 氯是什么意思| 牛剖层皮革是什么意思| 封神是什么意思| 胆囊炎属于什么科| 肺上有结节是什么意思| 阴超可以检查出什么| 狗狗吐是什么原因| 包茎不割会有什么影响| 付诸行动是什么意思| 08是什么生肖| 龙葵是什么| 鱼和熊掌不可兼得什么意思| 预计是什么意思| 什么美白效果最好最快| face是什么意思| 山穷水尽疑无路是什么生肖| 什么军什么马| 双肺纹理增多是什么意思严重吗| 口疮反复发作什么原因| 白手套什么意思| 升白细胞的针剂叫什么| mac是什么意思啊| 凤仙花什么时候开花| sle是什么病| pku是什么意思| 梦见抽血是什么预兆| 小巧思什么意思| 栀子黄是什么| 蟋蟀用什么唱歌| 同样的药为什么价格相差很多| 石钟乳是什么意思| 左手发麻是什么病征兆| 尿酸高吃什么药效果好| 空调外机不出水是什么原因| 升米恩斗米仇是什么意思| 赫尔墨斯是什么神| 谢霆锋什么学历| 梦见自己给自己理发是什么意思| 乙肝挂什么科| 长江后浪推前浪是什么生肖| 茶不能和什么一起吃| 气血不足吃什么调理| 戊五行属什么| 什么叫甲沟炎| 心什么肉什么| 二级医院什么意思| 肾彩超能查出什么| 青团是用什么做的| 透析是什么| 什么的同学| 珍珠粉加蜂蜜做面膜有什么作用| 第一次见家长送什么礼物好| 白左什么意思| 龋齿和蛀牙有什么区别| 身体怕冷什么原因| 低血压吃什么好| 六月份适合种什么蔬菜| 射频消融术是什么意思| 肝回声稍密是什么意思| 足癣用什么药最快好| 嘴唇溃疡是什么原因| 血常规血红蛋白偏高是什么原因| 62年属什么生肖| 合胞病毒吃什么药| 为什么老是恶心想吐| 蛋白质是由什么组成的| acl是什么意思| 羊毛疔是什么病| 胸有成竹是什么生肖| 401什么意思| 甲不开仓财物耗散是什么意思| 凌晨三点半是什么时辰| 葡萄糖高是什么意思| ly是什么意思| 轻微脑震荡吃什么药| 什么是频率| 梦见穿破鞋是什么意思| 猫能看到什么颜色| 肠梗阻什么症状| 新生儿一直哭闹是什么原因| 阴囊瘙痒是什么原因| 曙光是什么意思| 三点水加分念什么| 白细胞低是什么意思| 师范类是什么意思| 生理期提前是什么原因| 5.5号是什么星座| 冰粉为什么要加石灰水| 屁眼疼是什么原因| 桑叶有什么作用| 乙丑是什么生肖| 剖腹产吃什么下奶最快| 尚可什么意思| 2037年是什么年| 代偿期和失代偿期是什么意思| 1992年属什么生肖| 封建社会是什么意思| 执迷不悟是什么生肖| 蝉什么时候叫| 倒春寒是什么意思| 满月脸水牛背是什么病| 貉是什么动物| 苏州为什么叫姑苏| 惨不忍睹是什么意思| 寄居蟹吃什么| 固液法白酒是什么意思| 吊兰开花有什么兆头| 4月16什么星座| usd什么意思| 天杀的是什么意思| 小奶猫吃什么| 家里放什么最招财| 口爆什么意思| 睾丸皮痒用什么药膏| 红头文件是什么意思| 头小脸小适合什么发型| 土豪是什么意思| 绝经三年了突然又出血了什么原因| 儿童经常头晕什么原因导致的| 智商125是什么水平| 铜绿假单胞菌用什么抗生素| 吃西兰花有什么好处| 小沈阳名字叫什么| 为什么头出汗特别多| fy是什么意思| 楚门的世界是什么意思| 小便憋不住是什么原因| 什么什么一窝| 逍遥丸配什么治失眠| 晚点是什么意思| 梦见找对象是什么意思| 为什么会打呼| 虫字旁的字和什么有关| 才情是什么意思| 月经有点黑是什么原因| 血糖为什么会高| 卡路里什么意思| 高血糖有什么症状| 墨鱼干和什么煲汤最好| 甘露是什么| 生力军什么意思| 计数单位是指什么| 荞麦枕头有什么好处| 身体缺硒有什么症状| 18k金是什么金| 狗能吃什么水果| 1997年什么命| 曲安奈德针治疗什么| 拔牙什么时间最好| 毛囊炎用什么洗发水| 一个黑一个出读什么| 女人的第二张脸是什么| 新生儿便秘吃什么好| 肌酐低有什么危害| 人死后为什么要盖住脸| bench是什么牌子| 点解是什么意思| 抗核抗体弱阳性说明什么| 第四个手指叫什么| 低血压高吃什么药好| 邮箱是什么| 善茬是什么意思| 女生吃什么能淡化胡子| 佛手是什么东西| 什么是幸福| 为什么会孕吐| 痿是什么意思| 肝内小囊肿是什么意思| 做些什么| 肚脐是什么穴位| 眼皮黑是什么原因| 五月十日是什么星座| 女生吃木瓜有什么好处| 梦见牙掉了一颗是什么意思| 乳头为什么会痒| 什么减肥产品最好| 十二月四号是什么星座| 坐骨神经疼有什么症状| www指什么| 阑尾炎什么症状表现| 鹅口疮有什么症状| is是什么组织| 氧化是什么意思| 一视同仁什么意思| 咳嗽喝什么| tct检查是什么检查| 老人过生日送什么礼物好| 吃什么提高免疫力和增强体质| 硅对人体有什么危害| 望尘莫及的及是什么意思| 老枞水仙属于什么茶| 虎头虎脑是什么生肖| 尿酸高是什么症状| 八仙过海指什么生肖| 扑朔迷离是什么意思| 小孩割包皮挂什么科| 吃什么增加卵泡| 炸酥肉用什么粉| 尿道感染要吃什么药才能快速治好| 长命百岁是什么生肖| 梦见洗脚是什么意思| 拔罐后需要注意什么| 五海瘿瘤丸主要治什么病| 低密度脂蛋白胆固醇高是什么意思| hpv疫苗什么时候打最好| 石斛花有什么功效| 老鼠属于什么类动物| 小孩干咳吃什么药| 长期口臭要看什么科| 喝酒头晕是什么原因| 痛风要吃什么药好得快| 胰腺炎吃什么好| 尿白细胞阳性什么意思| 那是什么| 伤口增生是什么原因造成的| 二甲双胍有什么副作用| 开塞露擦脸有什么效果| 樱桃什么季节成熟| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 高校专区 ? 坤创E-Geek/天科大新电社 ? 08. 单片机对DS18B20温度传感器进行数据采集和使用

共22条 1/3 1 2 3 跳转至

08. 单片机对DS18B20温度传感器进行数据采集和使用

高工
2025-08-04 23:36:24     打赏
百度 4月21日,在南开大学举行的第三届周恩来研究国际学术研讨会上,周恩来堂侄、南开大学周恩来研究中心研究员周尔鎏首次公开解读周恩来两封家书。

马上就是腊月23了,也是中华民族传统的小年了。赶在小年之前,大Z在此更新一篇代码~希望给大家助力一波。

在了解了单片机片上的IO口、中断和定时计数器等资源后,今天我们来进行一个单片机与其外部器件进行数据通信的习题操练。当然,今天我们首先进行的是大家学单片机第一个接触的传感器,即温度传感器DS18B20。对这个传感器,我就不过多的进行介绍了,相信大家也都看过它的使用手册和时序图。 DS18B20是蓝桥杯竞赛考过的题目,但是不排除今年不会考到。对于蓝桥板上的传感器资源,也不过DS18B20、超声波、红外、光敏电阻+AD转换了。因此,围绕这四个板上资源出题的概率还是比较大的。很有必要进行相关练习的。

DS18B20的使用,其实并不像大家想的那么难,只需按照其时序图,一步一步的来写它的各个函数,大家只要耐心一点,都能推出来。当然请务必注意一点,对于时序图中的延时函数产生的延时,一定要务必按照时序图中所限定的范围哦~不然是采集不到正确的温度数据的。

接下来我们一起先看一下本节针对DS18B20所设计的习题(注意今天和前几天不同,今天只有一道题哦~)。但是该题却有3个要求,如下:

(1)完成DS18B20温度采集,并使用数码管上显示;

(2)超限(上限30,下限20)声光报警;

(3)利用按键可以设定上下限报警值,超上限控制继电器吸合。

       说明:由于小红板上没有继电器,所以采用第五个led灯(即LED8)来模拟继电器

下面仍照惯例给出本题目的代码,并在文末给出所有代码压缩包的下载链接,需要的小可耐们,请移步下载哦~不要嫌贵,下载免费!!

-----------------------蓝桥板代码---------------------

蓝桥板 代码:

/************************************************************************************************
1、完成DS18B20温度采集,并使用数码管上显示。
2、超限(上限30,下限20)声光报警。
3、利用按键可以设定上下限报警值,超上限控制继电器吸合。
*************************************************************************************************/

#include<stc15f2k60s2.h>
#include"intrins.h"
#
#define uchar unsigned char
#define uint  unsigned int 

sbit DQ = P1^4;  //单总线接口

uchar code smgtab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

uchar tt;
uchar wendu;
uchar min=20,max=30;
uchar yi,er,san,si,wu,liu,qi,ba;
uchar shezhi,jia,jian,qingchu,flag;

void init();      //蓝桥杯板子初始化程序
void keyScan();   //键盘扫描
void delayms(uint z);//ms级延时函数
uchar temget();   //ds18b20获取温度
bit init_ds18b20(void);//ds18b20初始化
void timer0Init(void);//5毫秒@11.0592MHz
void Delay_OneWire(unsigned int t);//ds18b20延时函数
void Write_DS18B20(unsigned char dat);//ds18b20写函数
unsigned char Read_DS18B20(void);//ds18b20读函数

void  displayOne(uchar yi,uchar er);//第一 二个数码管显示函数
void  displayTwo(uchar san,uchar si);//第三 四个数码管显示函数
void  displayThree(uchar wu,uchar liu);//第五 六个数码管显示函数
void  displayFour(uchar qi,uchar ba);//第七 八个数码管显示函数


/**********************主函数***********************************/
void main()
{
	init();
	timer0Init();		//5毫秒@11.0592MHz
	yi=11;er=11;san=11;si=11;wu=11;liu=11; 
	while(1)
	{
		if(shezhi==0)
		{
			EA=1;    //开总中断
			ET0=1;   //开定时器0中断
			P2=0x80;P0=0xef;
			wendu=temget();
			yi=11;er=11;san=11;si=11;wu=11;liu=11; qi=wendu/10; ba=wendu%10;
		}

		else if(shezhi==1)
		{
			EA=0;ET0=0; //关闭总中断与定时器0的中断
			P2=0x80;P0=0x7f;
			if(flag==1)
			{
				if(jia==1)
				{
					jia=0;
					if(min>=0){min=min+1;}
				}
				else if(jian==1)
				{
					jian=0;
					if(min>0){min=min-1;}
					else if(min==0){min=0;}
				}
			}
			else if(flag==0)
			{
				if(jia==1){jia=0;max=max+1;}
				else if(jian==1){jian=0;max=max-1;}
			} 
			yi=10;er=min/10;san=min%10;si=11;wu=11;liu=10;qi=max/10;ba=max%10;
		}
		keyscan();
		displayOne(yi,er);
		displayTwo(san,si);
		displayThree(wu,liu);
		displayFour(qi,ba);
	}
}


void delayms(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=845;y>0;y--);
}
	
	
void init()
{
   P2=0xa0; 
	 P0=0x00;  //关闭继电器蜂鸣器
	 P2=0x80;
	 P0=0xff;  //关闭led灯
	 P2=0xc0;
	 P0=0xff;  //选择数码管
	 P2=0xff;
	 P0=0xff;  //关闭数码管
}

void timer0Init(void)		//5毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x28;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void timer0()interrupt 1
{
	tt++; 	
	if(tt>=200)
	{
		tt=0;
		if(wendu<min)
		{
			P2=0xa0;P0=0x40;	 
			P2=0x80;P0=0xfe;
		}
		else if((wendu>min)&&(wendu<max))
		{
			P2=0xa0;P0=0x00;	 
			P2=0x80;P0=0xff;
		}
		else if(wendu>max)
		{
			P2=0xa0;P0=0x50;	 //继电器开启
			P2=0x80;P0=0xfe;
		}	
	} 
}

void keyScan()
{
	if(P30==0)   //s7  设置
	{
		delayms(5);
		if(P30==0)
		{
			if(shezhi==0){shezhi=1;}
			else if(shezhi==1){shezhi=0;}
		}
		while(!P30);
	}

	else if(P31==0)  //s6 修改最小值与最大值的切换
	{
		delayms(5);
		if(P31==0)
		{
			if(flag==0){flag=1;}
			else if(flag==1){flag=0;}
		}
		while(!P31);
	}

	else if(P32==0)   //s5  设置加
	{
		delayms(5);
		if(P32==0)
		{
			jia=1;
		}
		while(!P32);
	}

	else	if(P33==0)  //s4  设置减  
	{
		delayms(5);
		if(P33==0)
		{
			jian=1;  
		}
		while(!P33);
	}
}

//单总线延时函数
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0; i<8; i++);
	}
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    	initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

uchar  temget()
{
   uchar temp,low,high;
	 init_ds18b20();
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0x44);    //转换温度
	
	 Delay_OneWire(200);
   
   init_ds18b20();
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0xbe);
	
	 low=Read_DS18B20();   //读取温度
	 high=Read_DS18B20(); //读取温度
	
	 temp=high<<4;
	 temp|=(low>>4);
	
	 return temp;
}

void  displayOne(uchar yi,uchar er)
{
   P2=0xc0;
	 P0=0x01;     //选通第一个数码管
	 P2=0xff;
	 P0=smgtab[yi];//位选
	 delayms(1);
	
	 P2=0xc0;
	 P0=0x02;    //选通第二个数码管
	 P2=0xff;
	 P0=smgtab[er];//位选
	 delayms(1);
}

void  displayTwo(uchar san,uchar si)
{
   P2=0xc0;
	 P0=0x04;     //选通第三个数码管
	 P2=0xff;
	 P0=smgtab[san];//位选
	 delayms(1);
	
	 P2=0xc0;
	 P0=0x08;    //选通第四个数码管
	 P2=0xff;
	 P0=smgtab[si];//位选
	 delayms(1);
}

void  displayThree(uchar wu,uchar liu)
{
   P2=0xc0;
	 P0=0x10;   //选通第五个数码管
   P2=0xff;
	 P0=smgtab[wu];//位选
	 delayms(1);
	
	 P2=0xc0;
	 P0=0x20;  //选通第六个数码管
	 P2=0xff;
	 P0=smgtab[liu];//位选
	 delayms(1);
}

void  displayFour(uchar qi,uchar ba)
{
   P2=0xc0;
	 P0=0x40;  //选通第七个数码管
	 P2=0xff;
	 P0=smgtab[qi];//位选
	 delayms(1);
	
	 P2=0xc0;
	 P0=0x80;  //选通第八个数码管
	 P2=0xff;
	 P0=smgtab[ba];//位选
	 delayms(1);
}


-----------------------小红板代码----------------------

小红板 代码:

/**************************************************
1、完成DS18B20温度采集,并使用数码管上显示。
2、超限(上限30,下限20)声光报警。
3、利用按键可以设定上下限报警值,超上限控制继电器吸合。
由于小红板没有继电器模块,因此用LED8点亮来模拟继电器开启
**************************************************/
#include"reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int 

sbit	P_HC595_SER   = P2^7;	//pin 14	SER		data input
sbit	P_HC595_RCLK  = P2^5;	//pin 12	RCLk	store (latch) clock
sbit	P_HC595_SRCLK = P2^6;	//pin 11	SRCLK	Shift data clock

sbit  s5=P3^0;
sbit  s10=P3^1;
sbit  s15=P3^2;
sbit  s20=P3^3;
sbit DQ = P2^2;  //单总线接口
sbit  beep=P2^3; //蜂鸣器

uchar  code smgtab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40,0X00};	//共阴数码管段值


bit fla;
uchar min=20,max=30;
uchar wendu,tt;
uchar shanshuo;
uchar shezhi,jia,jian,qingchu,flag;
uchar yi,er,san,si,wu,liu,qi,ba;

uchar  temget();//ds18b20获取温度
void smg_Init();//数码管初始化函数
void delayms(uint z);//ms级延时函数
bit init_ds18b20(void);//ds18b20初始化
void timer0Init(void);		//50毫秒@11.0592MHz
void keyScan();//键盘扫描
void Send_595(unsigned char dat);
void Delay_OneWire(unsigned int t);  //ds18b20延时函数
void Write_DS18B20(unsigned char dat);//ds18b20写函数
unsigned char Read_DS18B20(void);//ds18b20读函数
void  displayOne(uchar yi,uchar er);//第一 二个数码管显示函数
void  displayTwo(uchar san,uchar si);//第三 四个数码管显示函数
void  displayThree(uchar wu,uchar liu);//第五 六个数码管显示函数
void  displayFour(uchar qi,uchar ba);//第七 八个数码管显示函数


/*****************************主函数**********************************************/
void main()
{
	smg_Init();
	timer0Init();
	while(1)
	{
		if(shezhi==0)     //未设置前只显示当前室温
		{
			EA=1;    //开总中断
			ET0=1;	 //开定时器0中断
			wendu=temget();
			if(wendu<min)
			{
				shanshuo=0; 
			}
			else if((wendu>=min)&&(wendu<=max))
			{
				shanshuo=1;
			}
			else if(wendu>max)
			{
				beep=0; 
				P1=0xef;  //由于小红板没有继电器模块,因此用LED8点亮来模拟继电器开启
			}	

			yi=11;er=11;san=11;si=11;wu=11;liu=11; qi=wendu/10; ba=wendu%10;
		}
		else if(shezhi==1)  //设置后可以调整温度上下限值
		{
			EA=0;ET0=0;
			beep=1; 
			if(flag==0)
			{
				if(jia==1){jia=0;max=max+1;}
				else if(jian==1){jian=0;max=max-1;}
			}
			else if(flag==1)
			{
				if(jia==1)
				{
					jia=0;
					if(min>=0){min=min+1;}  
				}
				else if(jian==1) 
				{
					jian=0;
					if(min>0){min=min-1;}
					else if(min==0){min=0;}
				}
			}	 
			yi=10;er=min/10;san=min%10;si=11;wu=11;liu=10;qi=max/10;ba=max%10;
		}
		keyScan();
		displayOne(yi,er);
		displayTwo(san,si);
		displayThree(wu,liu);
		displayFour(qi,ba);
	}
}

void delayms(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void smg_Init()
{
	Send_595(0x00);  //同时选择8个数码管
	Send_595(0x00);	 //让8个数码管同时显示消隐字符
	P_HC595_RCLK = 0;
	P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选	
}

void Send_595(unsigned char dat)	//发送一个字节
{		
	unsigned char	i;
	for(i=0; i<8; i++)
	{
		if(dat & 0x80)	    //判断dat的最高位是否为1
			P_HC595_SER = 1;  //最高位如果为1,则令P2.7 = 1
		else			
			P_HC595_SER = 0;  //最高位如果为0,则令P2.7 = 0
		
		P_HC595_SRCLK = 0;
		P_HC595_SRCLK = 1;
		P_HC595_SRCLK = 0;  //使用P2.6制造一个上升沿将这一位数据送到74HC595的QA输出端
		dat = dat << 1;     //将dat左移一位,取次高位
	}
}
void timer0Init(void)		//50毫秒@11.0592MHz
{
	TR0 = 1;//启动T0
	TMOD = 0x01;//T0为定时器,工作模式1 16位计数器
	TH0 = 0x4b;
	TL0 = 0xfc;//0x4bfc	定时50ms	
   
}

void timer0()interrupt 1
{
	tt++;
	if((shanshuo==0)&&(tt==8))     //室温小于设定值
	{
		tt=0;
		if(fla==0) {fla=1;P1=0XFE;beep=0;}    //D3闪烁
		else if(fla==1){fla=0;P1=0XFF;beep=0;} 
	}
	else if((shanshuo==1)&&(tt==6))     //室温在最小值与最大值之间
	{
		tt=0;
		if(fla==0) {fla=1;P1=0XFD;beep=1;}   //D4闪烁  
		else if(fla==1){fla=0;P1=0XFF;beep=1;} 
	}
}

void keyScan()
{
	if(s5==0)   //s5             //设置
	{
		delayms(5);
		if(s5==0)
		{
			if(shezhi==0){shezhi=1;}
			else if(shezhi==1){shezhi=0;}
		}
		while(!s5);
	}

	else if(s10==0)  //s10
	{
		delayms(5);
		if(s10==0)
		{
			if(flag==0){flag=1;}     //切换温度上下限的状态
			else if(flag==1){flag=0;}
		}
		while(!s10);
	}

	else if(s15==0)       //s15      设置加
	{
		delayms(5);
		if(s15==0)
		{
			jia=1;
		}
		while(!s15);
	}

	else	if(s20==0)  //s20   设置减
	{
		delayms(5);
		if(s20==0)
		{
			jian=1;  
		}
		while(!s20);
	}
}


void  displayOne(uchar yi,uchar er)
{
	  Send_595(0xfe);     //选通第一个数码管
		Send_595(smgtab[yi]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
	
	  Send_595(0xfd);     //选通第二个数码管
		Send_595(smgtab[er]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
}

void  displayTwo(uchar san,uchar si)
{
	  Send_595(0xfb);    //选通第三个数码管
		Send_595(smgtab[san]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
	 
	  Send_595(0xf7);   //选通第四个数码管
		Send_595(smgtab[si]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
}

void  displayThree(uchar wu,uchar liu)
{
	  Send_595(0xef);   //选通第五个数码管
		Send_595(smgtab[wu]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
	
	  Send_595(0xdf);  //选通第六个数码管
		Send_595(smgtab[liu]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
}

void  displayFour(uchar qi,uchar ba)
{
	  Send_595(0xbf);   //选通第七个数码管
		Send_595(smgtab[qi]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
	
	  Send_595(0x7f);   //选通第八个数码管
		Send_595(smgtab[ba]);//段选
		P_HC595_RCLK = 0;
		P_HC595_RCLK = 1; //使用P2.5制造一个上升沿将这两个字节数据同时送给数码管,完成段选和位选
    delayms(1);
}

/**********************************************************************************************
                        ds18b20驱动函数
/***********************************************************************************************/
//单总线延时函数
void Delay_OneWire(unsigned int t)  
{
	while(t--);
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    	initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

uchar  temget()       
{
   uchar temp,low,high;
	 init_ds18b20();
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0x44);    //温度转换
	
	 Delay_OneWire(200);
   
   init_ds18b20();
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0xbe);
	
	 low=Read_DS18B20();   //读温度
	 high=Read_DS18B20();  //读温度
	
	 temp=high<<4;
	 temp|=(low>>4);
	 return temp;
}
/***************************************************************************************/


----------------所有代码打包下载链接------------------

08单片机对DS18B20温度传感器进行数据和使用_全部代码打包.zip

 

    大家可以继续提前接着往下进行 09单片机 进行AD转换并存储(EEPROM) 的题目练习~如对代码有任何问题,请回帖留言咯。别忘了,常来留言会增加得到U盘的概率哦~

今天文末依旧没鸡汤,赶在小年前,提前祝大家小年快乐,回家不“挨打”,嘿嘿~!





关键词: DS18B20     DS18B20     单片机     数据采集         

助工
2025-08-04 23:55:46     打赏
2楼
哈哈,占个沙发,给楼主点赞

管理员
2025-08-04 09:28:44     打赏
3楼

谢谢楼主分享


院士
2025-08-04 09:59:31     打赏
4楼

这个温传非常考验时序的处理。

可以充分理解定时器的使用,大家努力学习啊


高工
2025-08-04 10:45:49     打赏
5楼

支持楼主,点赞。如果多取几个温度值来求平均值,输出数据更稳定准确呦。


菜鸟
2025-08-04 12:15:55     打赏
6楼

       关于定时器装初值有个小疑问

平时用的比较多的是

TH0 = (65536-46080)/256;
 TL0 = (65536-46080)%256;

而这种确实没见过 ,为啥0x4bfc是50ms  ?     

   TH0 = 0x4b;  

   TL0 = 0xfc;//0x4bfc   定时50ms    


菜鸟
2025-08-04 15:24:21     打赏
7楼

一样道理的,只是16进制转10进制,没啥不同的


菜鸟
2025-08-04 15:26:10     打赏
8楼

只是不同的人写法不一样而已,


高工
2025-08-04 15:38:13     打赏
9楼

用stc-isp烧录软件可以生成定时器的,比较节省时间。生成的就是初值就是十六进制的。了解一下QQ图片20190128153139.png


菜鸟
2025-08-04 15:38:57     打赏
10楼

(65536-(50000/1.08))/256算出结果为19452,而19452的高8位为4B,低八位为fc,高8位给值是TH0,低八位给值是Tl0;



共22条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
指甲上的月牙代表什么 胃疼发烧是什么原因 注意力不集中是什么原因 甄别是什么意思 盲袋是什么
鼻涕是绿色的是什么原因 7月7日是什么星座 心思重是什么意思 孕妇能吃什么水果最好 高考准考证有什么用
xswl什么意思 元阳是什么意思 子宫肌瘤吃什么食物好 宫腔粘连有什么危害 胆红素高吃什么食物能降得快
五月七号是什么星座 什么面料不容易皱 身先士卒是什么意思 吃什么对胰腺好 金丝皇菊有什么功效
bigbang是什么意思hcv9jop2ns4r.cn 什么叫前庭功能hcv9jop4ns3r.cn 汇总压缩是什么意思hcv8jop8ns9r.cn 黄体囊肿是什么hcv9jop6ns8r.cn 乘务员是干什么的hcv8jop3ns9r.cn
34岁属什么的生肖hcv8jop6ns1r.cn 现在有什么水果ff14chat.com 部队股长是什么级别hcv8jop0ns2r.cn b是什么hcv9jop3ns8r.cn 一直吐口水是什么原因hcv7jop9ns8r.cn
丁亥日五行属什么hcv7jop5ns5r.cn 舌头两侧溃疡吃什么药hcv8jop6ns0r.cn 具象是什么意思hcv9jop3ns9r.cn 杠杆是什么意思ff14chat.com 胃疼需要做什么检查hcv8jop5ns3r.cn
兽中之王是什么动物hcv9jop7ns9r.cn 怀孕甲减对孩子有什么影响hcv7jop4ns8r.cn 宝宝惊跳反射什么时候消失hcv8jop1ns4r.cn 尿液检查红细胞高是什么原因hcv8jop2ns0r.cn 皮肤干燥是什么原因hcv7jop9ns8r.cn
百度