我的毕设也用的18b20,可是使用stm32做mcu的。下面是我之前找的一段代码,你可以参考下。
#include <REGX52.H>
#include <intrins.h> // 声明_nop_() 便于实现延时
#define DS18B20 P1_0
unsigned char xdata LEDSEG _at_ 0xfeff; //P2.0
unsigned char xdata LEDBIT _at_ 0xfdff; //P2.1
unsigned char code LEDMAP[] =
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f, 0x00, 0x79, 0x46, 0x40,
// 灭 "E" "+" "-"
};
bit DS18B20_FLG = 0; //“1”:DS18B20存在 ;“0”:不存在
unsigned char LEDBuf[4];
void delay(unsigned int i);//延时
display();
//DS18B20温度采集子程序////////////////////////////DS18B20温度采集子程序///////////////////////DS18B20温度采集子程序/////
unsigned char Init_DS18B20(void);
unsigned char Read_DS18B20(void); //读DS18B20一个字节
Write_DS18B20(unsigned char d); //写一个字节
unsigned int TurnTemp(unsigned int temp); //温度返回值被放大100倍
startTempTrans(void); //启动温度转换
int ReadTemp(void); //读取温度
//////////////
//主函数//////////////////////////////////////////////主函数/////////////////////////////////////主函数/////////////////////
void main()
{
unsigned char i;
unsigned int t =0;
while(1)
{
t = ReadTemp(); //步骤3:读取温度
startTempTrans(); //步骤1:启动温度转换
LEDBuf[3] = 12; //显示“+”
LEDBuf[2] = t/1000; //显示温度的十位
LEDBuf[1] = (t/100)%10; //显示温度的个位
LEDBuf[0] = (t/10)%10; //显示温度的小数位
for(i = 0; i < 200; i++) //步骤2:等待温度转换完成(必须大于500ms)
{
display();
}
}
}
///////////////////////////////
//延时
void delay(unsigned int i)
{
while(i--);
}
//显示子函数
display()
{
unsigned char i;
unsigned char outbit;
outbit = 0x01; // 从右边开始显示
for (i = 0; i < 4; i++)
{
LEDBIT = 0x00; // 关所有LED
LEDSEG = LEDMAP[LEDBuf[i]];
LEDBIT = outbit;
delay(100);
outbit <<= 1; // 显示下一位
}
}
//DS18B20温度采集子程序////////////////////////////DS18B20温度采集子程序///////////////////////DS18B20温度采集子程序/////
//通信协议之初始化
//初始化DS18B20步骤:
// 1)总线拉低,并延时480us-960us
// 2)总线拉高,等待回应,如DS18B20为“0”则初始化成功,
// 如等待60us仍无回应,则DS18B20不存在
unsigned char Init_DS18B20(void)
{
bit re = 0;
unsigned char temp = 30;
DS18B20 = 1;
_nop_(); //无需精确
_nop_();
DS18B20 = 0; //拉低
delay(80); // ★务必在480us-960us之间
DS18B20 = 1; //拉高总线
delay(1); //无需精确
while(temp--) //等待60us以上
{
re = DS18B20; //如果re=0则初始化成功
if(0 == re)
{
DS18B20_FLG = 1;
delay(20); //无需精确
return(0);
}
}
return(0xff);
}
//读DS18B20一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i = 0;
unsigned char d = 0;
for (i=8;i>0;i--)
{
DS18B20 = 0; // 给脉冲信号
d >>= 1;
_nop_();
DS18B20 = 1; // 给脉冲信号
_nop_(); // 需延时10us-14us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(DS18B20 == 1)
{
d = d | 0x80;
}
delay(10); // 需延时60us以上
}
delay(10);
return(d);
}
//写一个字节
Write_DS18B20(unsigned char d)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DS18B20 = 1;
_nop_();
_nop_();
DS18B20 = 0;
_nop_(); // 需延时15us-60us
_nop_();
_nop_();
_nop_(); // ?奇怪:当此处延时超过30us时,会出错
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DS18B20 = d & 0x01;
delay(7); // 需延时60us-120us
d >>= 1;
}
DS18B20 = 1;
delay(7);
}
//温度返回值被放大100倍
unsigned int TurnTemp(unsigned int temp)
{
int t;
if(temp > 32768) //当读取的温度为负时
{
t = 0;
}
else //当读取的温度为正时
{
t = temp * 25 / 4;
}
return(t);
}
//启动温度转换
startTempTrans(void)
{
DS18B20_FLG = 0;
DS18B20_FLG = Init_DS18B20(); //步骤1):初始化
if(DS18B20_FLG) //如果没有检测到DS18B20返回
return(0);
Write_DS18B20(0xCC); //步骤2):跳过读序号操作(单个DS18B20适用)
Write_DS18B20(0x44); //步骤3):启动温度转换
}
//读取温度
int ReadTemp(void)
{
unsigned char tempLowChar = 0;
unsigned char tempHighChar = 0;
unsigned int tempInt = 0;
int temp = 0;
DS18B20_FLG = 0;
DS18B20_FLG = Init_DS18B20(); //步骤1):初始化
if(DS18B20_FLG) //如果没有检测到DS18B20返回
return(0);
Write_DS18B20(0xCC); //步骤2):跳过读序号操作(单个DS18B20适用)
Write_DS18B20(0xBE); //步骤3):读取温度寄存器设置(共可读9个寄存器,前两个就是温度)
tempLowChar = Read_DS18B20(); //步骤3):读取温度数据低8位
tempHighChar = Read_DS18B20(); //步骤3):读取温度数据高4位
tempInt = tempHighChar;
tempInt <<= 8;
tempInt = tempInt | tempLowChar;
temp = TurnTemp(tempInt);
return(temp);
}
//////////////
温馨提示:内容为网友见解,仅供参考
求:基于AT89C51单片机的多路DS18B20测温显示
delay(100);outbit <<= 1; \/\/ 显示下一位 } } \/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/ \/\/通信协议之初始化 \/\/初始化DS18B20步骤:\/\/ 1)总线拉低,并延时480us-960us \/\/ 2)总线拉高,等待回应,如DS18B20为“0”则初始化成功,\/\/ ...
急救!!基于AT89C51单片机的多路DS18b20测温显示系统的所有相关资料_百 ...
同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品...
求基于AT89C51单片机的DS18B20温度检测程序(用C语言)
\/\/DS18B20的读写程序,数据脚P3.3 \/\/ \/\/温度传感器18B20汇编程序,采用器件默认的12位转化 \/\/ \/\/最大转化时间750微秒,显示温度-55到+125度,显示精度 \/\/ \/\/为0.1度,显示采用4位LED共阳显示测温值 \/\/ \/\/P0口为段码输入,P24~P27为位选 \/\/ \/***\/ include "reg51.h"include...
急需:AT89C51单片机的DS18B20温度检测电路及程序。
MOV B,#10 ;10进制\/10=10进制 DIV AB MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV R0,#4 CLR C;多加的 DPL1: MOV R1,#250 ;显示1000次 DPLOP:MOV DPTR,#NUMTAB MOV A,TD MOVC A,@A+DPTR ;查通道的7段代码 MOV P0,A ;送出十位的7段代码 CLR P2.3 ;开通道显示...
单片机AT89C51和DS18B20温度检测并在数码管上显示出来,程序和现象如 ...
1、针对你的程序,先屏蔽掉1820,直接给数据,显示正常,说明显示程序部分可用,如下:include<reg51.h> define uchar unsigned char define uint unsigned int sbit DQ= P1^0;sbit smg0=P3^0 ;sbit smg1=P3^1 ;sbit smg2=P3^2 ;sbit smg3=P3^3;int temp ;unsigned char code smg_du...
求基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的数字温度...
write_com(0x38); \/\/16*2显示,5*7点阵,8位数据 write_com(0x0c);\/\/显示开,关光标 write_com(0x06); \/\/移动光标 write_com(0x01);\/\/清除LCD的显示内容 write_com(0x80);for (num=0;num<10;num++){ write_data(table[num]);delay(5);} write_com(0x80+0x40);for (num=0...
基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
void Init_DS18B20(void){ unsigned char x=0;DQ = 1; \/\/DQ复位 delay_18B20(8); \/\/稍做延时 DQ = 0; \/\/单片机将DQ拉低 delay_18B20(80); \/\/精确延时 大于 480us DQ = 1; \/\/拉高总线 delay_18B20(4);x=DQ; \/\/稍做延时后 如果x=0则初始化成功 x=1则初始化失败...
求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示...
include<reg52.h> \/\/ 试试#define uchar unsigned char #define uint unsigned int sbit DQ=P1^4; \/\/ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; \/\/共阴数码管字码表unsigned char code str1[]={0...
基于AT89C51&DS18B20的数字温度计设计:测温范围-50——+110,精度0.50C...
delay(5);lcden=0;lcdrw=1;} void init_ds18b20() \/\/初始化DS18B20 { uchar n;DQ=1;delay1(8);DQ=0;delay1(60);DQ=1;delay1(3);n=DQ;delay1(10);} void write_byte(uchar dat) \/\/写1字节进传感器 { uchar i;for(i=0;i<8;i++){ DQ=0;DQ=dat&0x01;delay1(3);...
用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程...
1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。2、单击图中的P,添加单片机等元件。3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。4、把元件排列放好,再放一...