/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数字温度计、数字温度计怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)