先贴上DS18B20的驱动,这个我是照着书抄的,可以确定没抄错,因为是初学所以想先用现成的。
下面的程序是DS18B20.c里的代码,是用来驱动18B20的。我的工程包含多个文件。
#include<STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; //DS18B20的DQ脚
void Delay(int num)
{
for (;num>0;num--);
}
void Init_DS18B20(void) //初始化18B20
{
unsigned char x=0;
DQ = 1;
Delay(8);
DQ = 0;
Delay(80);
DQ = 1;
Delay(14);
x=DQ;
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void) //从18B20读取一个字节
{
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(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat) 向18B20写入一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
uchar printTemperature(void)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature();
a=i/100;
b=i/10-a*10;
i = a*10 + b;
return i;
}
下面的程序是main.c里的:
#include<STC12C5A60S2.H>
#include<STDIO.H>
#define uint unsigned int
#define uchar unsigned char
extern void Init_UART(void);
extern void UART_T_CHAR(uchar);
extern void UART_T_STRING(uchar *);
extern unsigned int ReadTemperature(void);
extern uchar printTemperature(void);
uchar code string[]="Current Temperature Is:";
void delayms(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=100;j>0;j--);
}
void Init_MCU()
{
EX0=1;
EA=1;
}
void main()
{
uint tempr; //用于存储当前温度
uchar temp_char[3]="000"; //存储当前温度的字符数组
Init_MCU();
Init_UART();
while(1)
{
tempr=ReadTemperature();
/*tempr=tempr/10;
temp_char[1]=tempr%10+*0*;
temp_char[0]=(tempr-tempr%10)/10+*0*;
temp_char[2]=*\0*;*/ //以上4行是将数值型温度数据转换为对应的字符数组,因为现在在测试
UART_T_STRING(string); //这个程序,暂未使用
//UART_T_STRING(temp_char); //此语句也暂未使用
TI=1; //从此行起到TI=0;是为了测试DS18B20的驱动是否工作正常而临时加入的
printf("%d\n",tempr); //用printf函数将tempr的数值发送到上位机,如果DS18B20驱动正常,ze
while(!TI); //上位机可收到数值,给18B20加温,数值会变化。
TI=0;
delayms(5000);
}
}
void ISP_Download() interrupt 0 //该中断子程序通过使用外中断0,在INT0脚对地短接时将软复位MCU
{ //从而实现不冷启动也能下载程序
IAP_CONTR=0x60;
}
下面的程序是UART.c里的,用来驱动串口,向上位机发送温度数据,实测以下的代码没有问题
#include<STC12C5A60S2.H>
#include<STDIO.H>
#define uint unsigned int
#define uchar unsigned char
void Init_UART(void)//初始化串口,12MHZ晶体,9600bps,使用定时器T1,8位自动重装模式,串口模式1.
{
PCON &= 0x7F;
SCON = 0x50;
AUXR |= 0x40;
AUXR &= 0xFE;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xD9;
TH1 = 0xD9;
ET1 = 0;
TR1 = 1;
}
void UART_T_CHAR(uchar T_c)//该子程序实现通过串口向上位机发送一个字符的功能
{
SBUF=T_c;
while(!TI);
TI=0;
}
void UART_T_STRING(uchar *string)//该子程序实现通过串口向上位机发送字符串的功能。
{
TI=1;
puts(string);
while(!TI);
TI=0;
}
程序就是以上了,因为现在处于测试18B20驱动是否正常的阶段,一些代码是临时加上去的,为了测试之用。
问题就是,串口助手收到的数值是-24577,而且不随温度变化,弄了一天,还是不知道怎么回事,我甚至都以为自己买成三极管了。希望各路大神帮忙看一下。
顺便手画一下DS18B20与单片机的连接
下面的程序是DS18B20.c里的代码,是用来驱动18B20的。我的工程包含多个文件。
#include<STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; //DS18B20的DQ脚
void Delay(int num)
{
for (;num>0;num--);
}
void Init_DS18B20(void) //初始化18B20
{
unsigned char x=0;
DQ = 1;
Delay(8);
DQ = 0;
Delay(80);
DQ = 1;
Delay(14);
x=DQ;
Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void) //从18B20读取一个字节
{
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(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat) 向18B20写入一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/******************************************************************************/
unsigned int ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
uchar printTemperature(void)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature();
a=i/100;
b=i/10-a*10;
i = a*10 + b;
return i;
}
下面的程序是main.c里的:
#include<STC12C5A60S2.H>
#include<STDIO.H>
#define uint unsigned int
#define uchar unsigned char
extern void Init_UART(void);
extern void UART_T_CHAR(uchar);
extern void UART_T_STRING(uchar *);
extern unsigned int ReadTemperature(void);
extern uchar printTemperature(void);
uchar code string[]="Current Temperature Is:";
void delayms(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=100;j>0;j--);
}
void Init_MCU()
{
EX0=1;
EA=1;
}
void main()
{
uint tempr; //用于存储当前温度
uchar temp_char[3]="000"; //存储当前温度的字符数组
Init_MCU();
Init_UART();
while(1)
{
tempr=ReadTemperature();
/*tempr=tempr/10;
temp_char[1]=tempr%10+*0*;
temp_char[0]=(tempr-tempr%10)/10+*0*;
temp_char[2]=*\0*;*/ //以上4行是将数值型温度数据转换为对应的字符数组,因为现在在测试
UART_T_STRING(string); //这个程序,暂未使用
//UART_T_STRING(temp_char); //此语句也暂未使用
TI=1; //从此行起到TI=0;是为了测试DS18B20的驱动是否工作正常而临时加入的
printf("%d\n",tempr); //用printf函数将tempr的数值发送到上位机,如果DS18B20驱动正常,ze
while(!TI); //上位机可收到数值,给18B20加温,数值会变化。
TI=0;
delayms(5000);
}
}
void ISP_Download() interrupt 0 //该中断子程序通过使用外中断0,在INT0脚对地短接时将软复位MCU
{ //从而实现不冷启动也能下载程序
IAP_CONTR=0x60;
}
下面的程序是UART.c里的,用来驱动串口,向上位机发送温度数据,实测以下的代码没有问题
#include<STC12C5A60S2.H>
#include<STDIO.H>
#define uint unsigned int
#define uchar unsigned char
void Init_UART(void)//初始化串口,12MHZ晶体,9600bps,使用定时器T1,8位自动重装模式,串口模式1.
{
PCON &= 0x7F;
SCON = 0x50;
AUXR |= 0x40;
AUXR &= 0xFE;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xD9;
TH1 = 0xD9;
ET1 = 0;
TR1 = 1;
}
void UART_T_CHAR(uchar T_c)//该子程序实现通过串口向上位机发送一个字符的功能
{
SBUF=T_c;
while(!TI);
TI=0;
}
void UART_T_STRING(uchar *string)//该子程序实现通过串口向上位机发送字符串的功能。
{
TI=1;
puts(string);
while(!TI);
TI=0;
}
程序就是以上了,因为现在处于测试18B20驱动是否正常的阶段,一些代码是临时加上去的,为了测试之用。
问题就是,串口助手收到的数值是-24577,而且不随温度变化,弄了一天,还是不知道怎么回事,我甚至都以为自己买成三极管了。希望各路大神帮忙看一下。
顺便手画一下DS18B20与单片机的连接