51单片机DS18B20温度检测数码管显示

张开发
2026/4/13 19:26:21 15 分钟阅读

分享文章

51单片机DS18B20温度检测数码管显示
目录具体实现功能设计介绍51单片机简介设计思路设计内容程序Keil5仿真实现protues8.7全部资料具体实现功能利用51单片机和DS18B20温度传感器检测温度并用数码管显示。设计介绍51单片机简介51单片是一种低功耗、高性能CMOS-8位微控制器具有8K可编程Flash存储器使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。51系列单片机具有以下标准功能8k字节Flash512字节RAM32位I/O口线看门狗定时器内置4KB EEPROMMAX810复位电路三个16位定时器/计数器一个6向量2级中断结构全双工串行口。另外 51系列在空闲模式下CPU停止工作允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下RAM内容被保存振荡器被冻结单片机停止工作直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机包括AT系列和STC系列。设计思路文献研究法搜集整理相关研究资料阅读文献为研究做准备调查研究法通过调查、分析、具体实验等方法发现相关存在问题和解决办法比较分析法比较不同设计的具体原理以及同一类传感器性能的区别分析系统的研究现状与发展前景软硬件设计法通过软硬件设计实现硬件最后测试各项功能是否满足要求。设计内容程序Keil5本设计利用KEIL5软件实现程序设计全部程序如下/*********************************************************************/ //读取DS18B20温度通过数码管显示 /*********************************************************************/ #includereg51.h #include18B20.c #define uchar unsigned char #define uint unsigned int code uchar seven_seg[] {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; code uchar seven_bit[] {0xfe,0xfd,0xfb,0xf7}; uchar cp; uint temp1,temp2; sbit jdq P2^6; void timer0_init(void) //初始化 { TMOD 0x01; TH0 0xec; TL0 0x78; TR0 1; EA 1; ET0 1; } /*****************************************************************************/ void timer0_isr(void) interrupt 1 //中断 { uchar j; TR0 0; EA 0; TH0 0xec; TL0 0x78; TR0 1; EA 1; cp; if(cp 200) //刚好1秒 { cp 0; temp1 Read_Temperature();//得到温度 if((temp1 0x80) 0x80) //如果温度为负值 { temp2 0x7f ~temp1 (0x0f ~c) /15; //整数处理,需要加上小数来的借位 c 0x0f ~c 0x01; //小数处理 } else temp2 temp1;//如果温度为正值不用处理 } P0 0xff; switch(j) { case 0:P0 seven_seg[c * 10/16];break;//显示小数 case 1:P0 0x7f seven_seg[temp2 % 10];break;//显示个位并加上小数点 case 2:{ if((temp2 10) (temp1 0x80)){P0 0xff;break;}//如果温度小于10度且为正值十位0不显示 if((temp1 0x80) (temp2 10)){P0 0xbf;break;}//如果温度小于10度且为负值十位0不显示只显示“-” P0 seven_seg[temp2 / 10]; break;//如果温度大于10度10位正常显示 } case 3:{ if((temp1 0x80) ((temp2 / 10) 0))//如果温度为负值且十位不为0百位显示“-” P0 0xbf; break; } } P2 seven_bit[j]; j; if(j 4) j0; } void main(void) { timer0_init(); while(1) { if(temp2 35) jdq 0; else jdq 1; } } /*********************************************************************/ //读取DS18B20温度通过数码管显示在温度超过35度时继电器吸合 /*********************************************************************/ #includereg51.h #define uchar unsigned char #define uint unsigned int uchar a,b,c;//三个变量 sbit DQ P1^0;//ds18b20的数据脚 void delay(uint x)//延时函数 { while(x--); } void Init_DS18B20(void)//初始化ds18b20 { uchar x0; DQ1; //拉高电平 delay(8);//延时一会 DQ0;// 拉低电平 delay(80);//延时一会 DQ1;//拉高电平 delay(14);//延时一会 xDQ; //把数据脚的值赋给x delay(20);//延时一会 } /******************************从18B20中读一个字节****************************/ uchar Read_OneChar(void) { uchar i0;//变量 变量等于0 uchar dat0;//变量 变量等于0 for (i8;i0;i--)//循环八次 { DQ0;//拉低数据线 dat1;//dat往右移一位 DQ1;//拉高电平 if(DQ)//如果DQ等于1了 dat|0x80;//dat和0x8010000000或一下例 dat为0 等于00000000 dat为1 等于10000000 delay(8);//延时一会 } return(dat);//得到八位2进制数后返回dat } /******************************向18B20中写一个字节****************************/ void Write_OneChar(uchar dat) { uchar i0;//定义一个变量 并让他等于0 for(i8;i0;i--)//循环八次得到一个8位二进制数 { DQ0;//拉低电平 DQdat0x01;//dat和0x01与一下 例 dat为1 等于10000000 delay(10);//延时 DQ1;//拉高电平 dat1;//dat往右移一位 10000000等于01000000 } delay(8);//延时 } /***********************************读取温度**********************************/ uchar Read_Temperature(void) { uchar i0,t0;//定义连个变量 并让他等于0 Init_DS18B20();//初始化ds18b20 Write_OneChar(0xcc);//写指令 跳过rom Write_OneChar(0x44);//写指令 启动温度转换 Init_DS18B20();//初始化ds18b20 Write_OneChar(0xcc);//跳过rom检测 Write_OneChar(0xbe);//开始读取温度 aRead_OneChar();//第一次读温度 bRead_OneChar();//第二次读温度 c0x0fa;//屏蔽高a的高四位 得到小数部分 aa4; //屏蔽低四位 得到整数部分 bb4; //屏蔽高4位 得到整数部分 ta|b; //t等于ab 一个八位的二进制数 整数部分 return(t);//返回t } void write_temprom(uchar temp_up_set,uchar temp_down_set )//保存温度上下限temp_up_set,temp_down_set; { Init_DS18B20();//初始化ds18b20 Write_OneChar(0xcc);//跳过rom Write_OneChar(0x4e);//写指令 写入暂存器 Write_OneChar(temp_up_set);//写一个字节 温度上限 Write_OneChar(temp_down_set);//写一个字节 温度下限 Write_OneChar(0x7f);// Init_DS18B20();//初始化 Write_OneChar(0xcc);// 跳过rom检测 Write_OneChar(0x48);//赋值暂存器的数据 Init_DS18B20();//初始化ds18b20 Write_OneChar(0xcc);//跳过rom检测 Write_OneChar(0xb8);//重读存储器的数据 ;; } uchar temp_up,temp_down;//读出存储在DS18B20内的温度上下限值 void read_temprom(void)//读取温度温度上下限 { uchar i; Init_DS18B20(); Write_OneChar(0xcc); // 跳过读序号列号的操作 Write_OneChar(0xbe); // 读取温度寄存器等共可读9个寄存器 前两个就是温度 i Read_OneChar(); //读0地址寄存器扔掉 i Read_OneChar(); //读1地址寄存器扔掉 temp_up Read_OneChar(); //读2地址寄存器 temp_down Read_OneChar(); //读3地址寄存器 }代码运行截图仿真实现protues8.7本设计利用protues8.7软件实现仿真设计。

更多文章