求教高手帮编个AT89C52和DS18B20的数字温度计程序 我用的是8位数码管 希望显示效果为: 空空-18.5°C

2024-12-22 09:58:05
推荐回答(3个)
回答1:

/********************************************************************
* 文件名 : 温度采集DS18B20.c
该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来,并用232串口传给电脑。
注,在用串口软件发送1 是接收温度,发送2是停止接受
***********************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

sbit DQ = P2^3; //DS18B20数据口

unsigned char TMPH,TMPL,flag,a,a1,a2,a3,a4;

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar table2[6];
uchar table3[] = "现在的温度是: ";
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay_1()
{
int i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名称 : delay()
* 功能 : 延时函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint N)
{
int i;
for(i=0; i ;
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Reset()
* 功能 : 复位DS18B20
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}

/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}

/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}

/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}

/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}

void Com_init(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
}

void read_temp()
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
uint temp,num,aa;
Com_init();
while(1)
{

read_temp();
temp = (TMPL + (TMPH<<8) )*0.0625*100;
a1= temp/1000;
a2=temp%1000/100;
a3=temp%100/10;
a4=temp%10;

P0=table[temp/1000];
P2 = 0;
Delay_1ms(3);

P0=table1[temp%1000/100];
P2 = 1;
Delay_1ms(3);

P0=table[temp%100/10];
P2 = 2;
Delay_1ms(3);

P0=table[temp%10];
P2 = 3;
Delay_1ms(1);
table2[0]=a1+48;
table2[1]=a2+48;
table2[2]=a3+48;
table2[3]=a4+48;

if(flag==1)
{

ES=0;
flag=0;
if(a=='1')
{
ES=1;
while(1)
{

read_temp();
temp = (TMPL + (TMPH<<8) )*0.0625*100;
a1= temp/1000;
a2=temp%1000/100;
a3=temp%100/10;
a4=temp%10;

P0=table[temp/1000];
P2 = 2;
Delay_1ms(3);

P0=table1[temp%1000/100];
P2 = 3;
Delay_1ms(3);

P0=table[temp%100/10];
P2 = 4;
Delay_1ms(3);

P0=table[temp%10];
P2 = 5;
Delay_1ms(1);
aa++;
if(aa==50)
{
table2[0]=a1+48;
table2[1]=a2+48;
table2[2]='.' ;
table2[3]=a3+48;
table2[4]=a4+48;
table2[5]=10;
for(num=0;num<13;num++)
{
SBUF=table3[num];
while(!TI);
TI=0;
}

for(num=0;num<6;num++)
{
SBUF=table2[num];
while(!TI);
TI=0;
}

aa=0;
}

if(a=='2')
break;
}

}
if(a=='2')
{ES=0;}
ES=1;
}
}
}

void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}

回答2:

楼主,建议 去 我的领地 5d6d 的 proteus 论坛看看

那里有很多 仿真实例,包括仿真图 和 源码

回答3:

可以的,我来帮你啊!!