这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的DS18B20,它只有3个管脚,一个接电源,一个接地,另一个接8051单片机就可以了。温度值用数码管显示。这样整个电路就接好了。如果楼主觉得我回答的可以别忘了给我加分哦,为了你的问题我花费了半天的时间啊。程序如下:
#include<reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
#define Self_Define_ISP_Download_Command 0x3D
sfr IAP_CONTR=0xE7;
sbit DQ = P3^5; //DS18B20接入口
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90} ;
char bai,shi,ge; //定义变量
void Init_Com(void)
{
TMOD = 0x20;
SM0=0;
SM1=1;
REN=1;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
EA=1;
ES=1;
}
/延时子函数/
void delay(uint num)
{
while(num--) ;
}
/DS18b20温度传感器函数/
Init_DS18B20(void) //传感器初始化
{
uchar x=0;
DQ = 1; //DQ复位
delay(10); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us //450
DQ= 1; //拉高总线
delay(20);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(8);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(10);
DQ = 1;
dat>>=1;
}
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a,b;
uint t;
float tt;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的 *** 作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的 *** 作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
tt=(b256+a)00625100;//2个8位合成16位
t=(int)tt;
/t=b;
t<<=8;
t=t|a;
tt=t00625;
t= tt10+05; /
return(t);
}
/显示子函数/
void display(int bai,int shi,int ge)
{
int temp;
temp=ReadTemperature();//读温度
bai=temp/1000;//显示百位
shi=temp%1000/100;//显示十位
ge=temp%100/10;//显示个位
//xiao=temp%10;
P2=0xfd; //位选
P0=0X7f; //显示小数点
delay(500);
P2=0xfe;
P0=table[bai];//显示千位
delay(500);//一小段延时动态显示
P2=0xfd;
P0=table[shi];//显示百位
delay(500);
P2=0xfb;
P0=table[ge];//显示十位
delay(500);
P2=0xf7;// 显示°
P0=0x9c;
// delay(50);
}
void main()
{
Init_Com();
while(1)
{
display(bai,shi,ge);//显示函数
}
}
void UART_Interrupt_Receive(void) interrupt 4
{
unsigned char k=0;
unsigned int a,b;
if(RI==1)
{
RI=0;
k=SBUF;
if(k==Self_Define_ISP_Download_Command)
{
for(a=1000;a>0;a--)
for(b=100;b>0;b--); //延时约1S
IAP_CONTR = 0x60;
}
}
else
{
TI=0;
}
}
下面是DS18B20测温实验源程序
ORG 0000H
START: MOV SP,#60H ;开机初始化
MOV P0,#0FFH
MOV P1,#0FEH
MOV P2,#0FFH
MOV P3,#0FFH
MAIN: LCALL GET_TEMPER ;调用读温度子程序
LCALL DISP ;调用数码管显示子程序
AJMP MAIN ;重复循环
;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
SETB P33
LCALL RST18B20 ;复位DS18B20
JB 00H,DSS2
RET
DSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#44H ;向DS18B20发出温度转换命令
LCALL WR18B20
LCALL RST18B20 ;准备读温度前先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#0BEH ;向DS18B20发出读温度命令
LCALL WR18B20
LCALL RE18B20 ;读出温度数据
RET
;------ DS18B20复位初始化程序 ------
RST18B20:
SETB P33
NOP
CLR P33
MOV R0,#06BH ;主机发出复位低脉冲
MOV R1,#03H
DSR1: DJNZ R0,DSR1
MOV R0,#6BH
DJNZ R1,DSR1
SETB P33 ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DSR2: JNB P33,DSR3 ;等待DS18B20回应
DJNZ R0,DSR2
LJMP DSR4
DSR3: SETB 00H ;置标志位,表示DS1820存在
LJMP DSR5
DSR4: CLR 00H ;清标志位,表示DS1820不存在
LJMP DSR7
DSR5: MOV R0,#06BH
DSR6: DJNZ R0,DSR6 ;延时一段时间
DSR7: SETB P33
RET
;------ 写DS18B20的子程序 ------
WR18B20:
MOV R2,#8
CLR C
WR1: CLR P33
MOV R3,#6
DJNZ R3,$
RRC A
MOV P33,C
MOV R3,#23
DJNZ R3,$
SETB P33
NOP
DJNZ R2,WR1
SETB P33
RET
;------ 从DS18B20中读温度数据程序 ------
RE18B20:
MOV R4,#2
MOV R1,#2FH
RE00: MOV R2,#8
RE01: CLR C
SETB P33
NOP
NOP
CLR P33
NOP
NOP
NOP
SETB P33
MOV R3,#09
RE10: DJNZ R3,RE10
MOV C,P33
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------- 显示子程序 --------
DISP: MOV A,2FH
MOV C,70H
RRC A
MOV C,71H
RRC A
MOV C,72H
RRC A
MOV C,73H
RRC A
MOV 2FH,A
MOV A,2FH
MOV B,#10
DIV AB
MOV 30H,A
MOV 31H,B
MOV A,30H
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A ;显示温度“十位”值
CLR P22
SETB P20
SETB P21
SETB P23
SETB P24
LCALL YS4722U
MOV A,31H
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A ;显示温度“个位”值
CLR P23
SETB P20
SETB P21
SETB P22
SETB P24
LCALL YS4722U
MOV A,#01000110B
MOV P0,A ;显示温度符号“ ℃”
CLR P24
SETB P20
SETB P21
SETB P22
SETB P23
LCALL YS4722U
RET
; 8位共阳数码管显示器字型码表
SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
YS4722U:
MOV R4,#10 ;延时子程序
Y3: MOV R5,#216
DJNZ R5,$
DJNZ R4,Y3
RET
END
精度不知道
/
文件名 : 温度采集DS18B20c
该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来,并用232串口传给电脑。
注,在用串口软件发送1 是接收温度,发送2是停止接受
/
#include<reg52h>
#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<N; i++)
;
}
/
名称 : Delay_1ms()
功能 : 延时子程序,延时时间为 1ms x
输入 : x (延时一毫秒的个数)
输出 : 无
/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;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) )00625100;
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) )00625100;
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;
}
以上就是关于用8051单片机设计一数字式温度计 的电路图 有程序的最好 谢了全部的内容,包括:用8051单片机设计一数字式温度计 的电路图 有程序的最好 谢了、DS18B20数字温度计、求教高手帮编个AT89C52和DS18B20的数字温度计程序 我用的是8位数码管 希望显示效果为: 空空-18.5°C等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)