基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程

基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程,第1张

/ds18b20子程序/

/ds18b20延迟子函数(晶振12MHz )/

#include<reg51h>

sbit DQ=P1^2;

#define uchar unsigned char

void delay_18B20(unsigned int i)

{

while(i--);

}

/ds18b20初始化函数/

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则初始化失败

delay_18B20(20);

}

/ds18b20读一个字节/

unsigned char 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_18B20(4);

}

return(dat);

}

/ds18b20写一个字节/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/读取ds18b20当前温度/

ReadTemp(void)

{ float val;

uchar temp_value,value;

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar(); //读取温度值低位

b=ReadOneChar(); //读取温度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

value=a&0x0f;

val=temp_value+value;

return(val);

}

以上是DS18B20的驱动程序。然后在主程序中直接调用函数就可以了。

以上是在主程序中的调用,你看关于温度的那个就可以。

#include "reg51h"

#include "18b20h"

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="Welcome To" ;//初始化日期和星期

uchar code table1[]="Our System!";//初始化时间

uchar code table2[]="Temperature is:";//初始化时间

//以下三个是定义LCD的引脚

sbit lcden=P2^2;

sbit lcdwrite=P2^1;

sbit lcdrs=P2^0;

char wendu;

//延时程序

void delay(uint z)

{ uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//lcd的写指令

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//lcd的写数据

void write_data(uchar da)

{ lcdrs=1;

lcden=0;

P0=da;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//初始化

void init()

{

uchar num;

lcdwrite=0;

lcden=0;

write_com(0x38); //162显示,57点阵,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;num<11;num++)

{

write_data(table1[num]);

delay(5);

}

}

void write_wendu(uchar add, char da)

{

uchar shi,ge;

shi=da/10;

ge=da%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

//主函数

void main ()

{

uchar num;

init();

delay(2000);

delay(2000);

delay(2000);

write_com(0x01);//清除LCD的显示内容

while(1)

{

write_com(0x80);

for (num=0;num<15;num++)

{

write_data(table2[num]);

delay(5);

}

wendu = ReadTemp( );

write_wendu(2,wendu);

}

}

下面是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

精度不知道

数字温度计的使用方法如下:

数字体温计使用之前,先检查电池是否有电以及完好。最好先用酒精擦拭探头,按开关键,听到蜂鸣声后准备开始测量体温,可以选择腋窝、口腔舌下或者直肠肛门测量。

放在腋窝时应该先用毛巾擦干腋窝的汗液,并且紧贴腋窝皮肤夹紧;放在口腔舌下时应该注意把探头都含在舌下;放在直肠时可以选择侧卧位或者趴着,大约20秒后会再次听到蜂鸣声以及LED显示屏幕停止闪烁,这时体温就测好了,可以直接在屏幕上读出数值。测量完毕后,及时关闭电源的开关键。

人的正常体温

人的体温受体温调节中枢的调控,维持在恒定的范围内,根据测量部位的不同,体温在一定范围内均为正常,采用最多的腋窝测温方法正常体温范围是36-37℃,口腔测温方法正常体温范围是363-372℃,直肠测温法正常体温范围是365-377℃,这三种测量方法较为普遍。另外还可以采用电子测温计测额头或者耳朵温度,额头温度正常值为35-37℃,耳温正常值为357-377℃。

测温,并和上位机通讯,你可以删掉上位机通讯部分。

#include < intrinsh >

#include <reg51h>

sbit DQ = P3^3; //定义DS18B20端口DQ

bit flash=0; //显示开关标记

//sbit BEEP=P3^7 ;

unsigned char presence,temp=0x00 ;//初始化标志

unsigned char ac=0,bc=1,cc=0,ff=0;

unsigned char data temp_save[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//存储8个传感器数据

unsigned char data yihuo_save[14] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00};//存储命令数据

unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,

0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

char code RomCode[8][8] = { 0x28,0xd3,0x3e,0xeb,0x01,0x00,0x00,0xd3, //n1

0x28,0x55,0x35,0xeb,0x01,0x00,0x00,0xfb, //n2

0x28,0x82,0x2d,0xeb,0x01,0x00,0x00,0xf8, //n3

0x28,0xe9,0x2f,0xeb,0x01,0x00,0x00,0x40, //n4

0x28,0xe5,0x67,0xeb,0x01,0x00,0x00,0xea, //n5

0x28,0x2f,0x52,0xeb,0x01,0x00,0x00,0xec, //n6

0x28,0xf1,0x3b,0xeb,0x01,0x00,0x00,0xd9, //n7

0x28,0xa8,0x44,0xeb,0x01,0x00,0x00,0x63 //n8

};//////温度传感器发生损坏需替换时,需更改对应传感器的RomCode////

char str1[] ={0x40,0x30,0x46,0x30,0x32,'\0'};//字头,标志等 传送两个字符

unsigned char Data_buf_ASCII[]={0x00,0x00};//拆分中使用

//

void hctoa(unsigned char buf_char) ; //拆分函数 一字节数据转换成两字节ASCII码

//void beep();

//

void Delay(unsigned int num)//延时函数

{

while( --num );

}

//

// 二、 18b20相关函数

// 1 初始化 2 读字节 3 写字节 4 读序列码 5 读取温度

/ 设想,讲DQ的定义,制成单独的函数,

对标准变量X0的访问,改为写入,根据写入的数据不同,选择不同的管脚,

从而实现程序复用和点数的扩展

//

Init_DS18B20(void) //初始化ds1820

{

DQ = 1; //DQ复位

Delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

Delay(90); //精确延时 大于 480us

DQ = 1; //拉高总线

Delay(8);

presence = DQ; //如果=0则初始化成功 =1则初始化失败

Delay(100);

DQ = 1;

return(presence); //返回信号,0=presence,1= no presence

}

//

ReadOneChar(void) // 读一个字节

{

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);

}

//

WriteOneChar(unsigned char dat) // 写一个字节

{

unsigned char i = 0;

for (i = 8; i > 0; i--)

{

DQ = 0;

DQ = dat&0x01;

Delay(5);

DQ = 1;

dat>>=1;

}

}

//

Read_Temperature() //读取温度 unsigned char n

{

unsigned char i,j,k,m=0,temp0=0,temp1=0; // m-第几个温度传感器 i-序列号的第几个字节

Init_DS18B20();

if(presence==1)

{ flash=1;} // DS18B20不正常,蜂鸣器报警

else

{

flash=0;

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

while(m<8) // 8个温度传感器18B20

{

unsigned char x=0;

Init_DS18B20();

WriteOneChar(0x55); // 匹配ROM命令

for(i=0;i<8;i++)

{

WriteOneChar(RomCode[m][i]); // 8个传感器中某一个的8个字节的ID号

}

WriteOneChar(0xBE); // 读取温度寄存器

temp0 = ReadOneChar(); // 温度低8位

temp1 = ReadOneChar(); // 温度高8位

/将温度保存到temp_save[]对应位置/

j=2m;

k=temp0&0x0f; // 温度低8位的低4位(小数部分)

x=ditab[k]; //查表得小数位的值

temp_save[j]=(temp0&0xf0)|x; // 将温度低8位的高4位和转换后的小数位存入-温度的第1字节

j++;

temp_save[j]=temp1; // 将温度高8位存入温度的第2字节

m++; // 下一个温度传感器

} // end while

} // end else

ff=1; // 测温成功标志 先存低字节

}

//

// 三、 串口 *** 作函数 1 发送字符 2 发送字符串

//

void send_char(unsigned char txd) // 1 传送一个字符

{

SBUF = txd;

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

}

//

void send_str() // 2 传送字符串之1 用于发送字符串

{

unsigned char i=0;

while(str1[i] != '\0')

{

SBUF = str1[i];

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

i++; // 下一个字符

}

}

//

void send_str0() // 3 传送字符串之2 传送Data_buf_ASCII[i]

{

unsigned char i;

for(i=0;i<2;i++)

{

SBUF =Data_buf_ASCII[i];

while(!TI); // 等特数据传送

TI = 0; // 清除数据传送标志

}

}

//

void delayms(unsigned char ms)

// 延时子程序

{

unsigned char i;

while(ms--)

{

for(i = 0; i < 120; i++);

}

}

//

// 四、 通信协议函数 发送1 发送2 拆分函数

//

void send_1() // 发送下位机发送数据的第1部分 40(字头) 30 46(设备地址15) 30 32(表示将发送两个字节的数据)

{

send_str(); // 发送数据位前的字符串 40(字头) 30 46(设备地址15) 30 32(表示将发送两个字节的数据)

}

//

void send_2(unsigned char a) //发送数据之 2

{

unsigned char x,i,j,k,s=0;

unsigned long m;

unsigned char xor=0x74; // 除去传送数据外的异或值

//// temp_save[] 先存的是低字节

k=temp_save[a]&0x0f; // 低8位的低4位(小数部分) ,查表后值

j=temp_save[a]&0xf0; // 低8位的高4位(整数部分的低4位+0000),原正整数部分 0010 0001 取

j=j/16; // 比实际数值大了16倍,所以要除以16

a++;

i=temp_save[a]&0x0f; // 高8位的低4位(0000+整数部分的高4位),比实际数值小了16倍

x=i16+j; // x为温度整数部分的实际值

m=x10+k; // 十倍数据,为避免给上位机传小数,将整数部分乘10倍,再加上小数。即测温375度,实际传375

// 在组态软件的变量中针对I/O变量,通过设置(最大原始值10000/原始值1000)=10的方式变换回375

// m=375 需要用2个字节表示 00000001 01110111

j=m/256; // 得到高字节的值 1

k=m%256; // 得到低字节的值 119

s=j; // 先传高位 00000001

hctoa(s); // 0000 0001 转换成ASCII码 30 31 实际在串口中传输的是两个字节二进制数 00110000 00110001

send_str0(); // 传送温度数据

xor^=Data_buf_ASCII[0];

xor^=Data_buf_ASCII[1];

s=k; // 再传低位 01110111

hctoa(s); // 0111 0111 转换成ASCII码 37 37 实际在串口中传输的是两个字节二进制数 00110000 00110001

send_str0(); // 传送温度数据

xor^=Data_buf_ASCII[0];

xor^=Data_buf_ASCII[1];

hctoa(xor); // 求异或位的ASC码

send_str0(); // 发送异或校验位

send_char(0x0d); // 发送结束字符0d

}

////////////////////////////////////////////

void hctoa(unsigned char buf_char) // 拆分函数,组态王传输协议决定的

//一字节十六进制数据转换成两字节ASCII码 例:00000001拆分成 0000和0001 再分别求两部分的ASCII码

{

unsigned char count,c;

for(count=0;count<2;count++)

{

if(count==0)

{

c = buf_char>>4; // 循环右移四位,使高4位移到低4位的位置,

}

else

{

c = buf_char; // 后取低4位

}

c &= 0x0f; // 高4位置0+取低4位 *** 作

if(c>=0&&c<=9)

Data_buf_ASCII[count] = '0' + c;

else

Data_buf_ASCII[count] = 'A' + c - 10;

}

}

//

//

/

void get_number()//计算发送数据的个数

{

num=16(str1[3]-30)+str1[4]-30;

}

//

//

void main(void)

{

TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率

TH1 = 0xF4; // 波特率2400 注意110592的晶振为F4,12M晶振为F3

TL1 = 0xF4;

SCON = 0x50; // 设定串行口工作方式

PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1

IE = 0x0; // 禁止任何中断

while(1)

{

unsigned char aa=0,bb=0; //a 通讯标志

if(RI) // 是否有数据到来,有数据到来时,RI被单片机自动置1,一个字节的数据被暂存在缓存器SUBF中

{

temp = SBUF; // 暂存接收到的数据

yihuo_save[cc]= SBUF;

if(temp==0x40)

ac=0x8f; // 标志一次命令的读入ac: 0-1

if(cc==8) // cc从0~8,共读入前9个字节

// [字头40,设备地址30 46,标志40 30,数据地址30 30 30 46]

{

bc=0;

if(yihuo_save[8]==0x30) // 每次新一轮测温都需要用组态王发送读I/O变量en的值来启动

// yihuo_save[8]==0x30 代表寄存器X0,即组态王中的变量en

{ff=2;} // ff=2表示启动测温 ff:0--2 标志着要进行温度测量

else

{

bc=yihuo_save[8]-0x31; // bc<9之前yihuo_save[8]依次为 31 33,35,37,39

// 此时yihuo_save[8]-0x31的值依次为 0,2,4,6,8

ff=1; // 为前5个温度传感器的值在temp_save[16]中的位置

}

if(bc>9) bc=bc-7; // 当寄存器地址为30 30 30 42时(组态王自动跳过40,40为字头),x42-x31=66-49=17

} // 17-7=10

cc++;

RI = 0; // 准备接收下一字节

} //end RI ,此循环接收组态王发送过来的读命令,共14个字节

//

if(temp==0x0d) // 如果缓存器SBUF中是0d,表示上位机的读命令的14个字节已经正确接收

{

delayms(5); // 短暂延时

//

if(ac>0)

{

if(ff==2) // 只有当组态王发读I/O变量en(寄存器X0)的命令时 ff==2,才发送此设定好的字节

{

send_char(0x40);

send_char(0x30);

send_char(0x46);

send_char(0x30);

send_char(0x31);

send_char(0x30);

send_char(0x30);

send_char(0x37);

send_char(0x37);

send_char(0x0d);

ac=0;

Read_Temperature();

}

if(ff==1&&ac>0) // ff=1表示测温成功

{

send_1(); // 发送数据位前的字符串40(字头)30 46(设备地址15)30 32(表示将发送两个字节的数据)

send_2(bc); // 上传1个传感器温度(bc指定是那个温度传感器的温度)

// bc的数值用来选择temp_save[ ]中存储的某个18B20的温度

// 如bc=0和bc=1为分别传送temp_save[ ]中的第1字节和第2字节。

// 发送温度值(30 32 37 37),异或值,结束符(0d)

ac=0; // 准备接收下一条读命令,进而发送指定温度传感器的温度

}

// 将变量置零,重新进入下一循环的读写 *** 作

cc=0x00; // cc代表命令数据的第几个字节,此处置0,将重新开始接收上位机的读命令。

temp=0x00; // temp暂存缓存器中的数据,此处清零

bc=0;

}//end if(ac==1)

}//end if (temp==0d)

}//end while

}//end main

/

send_char(temp_save[1]);

send_char(temp_save[0]);

send_char(temp_save[3]);

send_char(temp_save[2]);

send_char(temp_save[5]);

send_char(temp_save[4]);

send_char(temp_save[7]);

send_char(temp_save[6]);

send_char(temp_save[9]);

send_char(temp_save[8]);

send_char(temp_save[11]);

send_char(temp_save[10]);

send_char(temp_save[13]);

send_char(temp_save[12]);

send_char(temp_save[15]);

send_char(temp_save[14]);

//

这个电路很简单,我说一下就可以了。数字式温度传感器用最常用的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;

}

}

以上就是关于基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程全部的内容,包括:基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程、DS18B20数字温度计、数字温度计怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存