用8051单片机设计一数字式温度计 的电路图有程序的最好谢了

用8051单片机设计一数字式温度计 的电路图有程序的最好谢了,第1张

这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9344548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存