/
文件名
:
温度采集DS18B20c
描述
:
该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。
创建人
:
东流,2009年4月10日
版本号
:
20
/
#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;
uchar
code
table[10]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/
名称
:
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);
}
}
/
名称
:
Main()
功能
:
主函数
输入
:
无
输出
:
无
/
void
main()
{
float
tt;
uint
temp;
P2
=
0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL
=
read_byte();
TMPH
=
read_byte();
temp
=
TMPL
/
16
+
TMPH
16;
P0
=
table[temp/10%10];
P2
=
6;
Delay_1ms(5);
P0
=
table[temp%10];
P2
=
7;
Delay_1ms(5);
}
}
这是一个项目中的汇编程序,供你参考
org 000h
jmp main
org 0030h
main:
mov r0,#40h
mov dptr,#0bff8h ;指向0809首地址
movx @dptr,a ;启动A/D转换
tt1:
movx a,@dptr ;读数
movx @r0,a ;存数
movx @dptr,a ;启动A/D转换
lcall delay128us ;等待转换完毕(至少128us)
movx a,@dptr
mov @r0,a
lcall tran ;模数-数据转换
lcall disp ;数据的静态显示
lcall delay1s
sjmp main
;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;
tran: ;数据转换
mov r0,#40h
mov r3,#00h
mov a,@r0 ;把r0中的数给a
mov b,#03h ;标度变换 3格一度
div ab
mov r3,b
mov b,#0ah ;将标度变换结果的整数部分进行BCD码转换
div ab
mov @r0,a ;将十位数送显示缓冲单元
inc r0 ;指向缓冲单元下一地址
mov @r0,b ;将个位数送显示缓冲单元
mov a,r3 ;标度转换结果小数部分处理
mov b,#03h ;实现三格一度
mul ab
inc r0
mov @r0,a ;送显示缓冲单元
lop: ret
;;;;;;;;;;静态显示子程序-串入并出;;;;;;;
disp:
mov dptr,#tab
mov r0,#40h ;r0指向缓存区首地址
mov a,@r0 ;将整数位数给a
movc a,@a+dptr ;利用表格计算十位七段LED数码管的段码
mov 40h,a ;将段码结果送入40h
inc r0 ;r0指向缓存区下一地址
mov a,@r0 ;将个位数给a
movc a,@a+dptr ;利用表格计算个位七段LED数码管的段码
mov 41h,a ;将段码结果送入41h
inc r0 ;r0指向缓存区下一地址
mov a,@r0 ;将小数给a
movc a,@a+dptr ;利用表格计算小数位七段LED数码管的段码
mov 42h,a ;将段码结果送入42h
;;;;;;;;;;;最后一位清零;;;;;;;;;;;;
mov 43h,#00h
mov a,43h
mov r7,#8
ccc: jb acc7,aaa ;
clr p30 ;
jmp bbb
aaa: setb p30
bbb: setb p31
clr p31
rl a
djnz r7,ccc
;;;;;;;;小数位数显示;;;;;;;
mov a,42h
mov r7,#8
cc:
jb acc7,aa ;
clr p30 ;
jmp bb
aa: setb p30
bb: setb p31
clr p31
rl a
djnz r7,cc ;所有位检测后顺序执行
;;;;;;;;;;;;个位数显示;;;;;;;;;;;
orl 41h,#80h ;个位数后置小数点
mov a,41h
mov r7,#8
dd: jb acc7,ee
clr p30
jmp ff
ee: setb p30
ff: setb p31
clr p31
rl a
djnz r7,dd
;;;;十位数数显示;;;;;
mov a,40h
mov r7,#8
gg: jb acc7,hh
clr p30
jmp ii
hh: setb p30
ii: setb p31
clr p31
rl a
djnz r7,gg
tab: db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,6fh
lop1:
ret
;;;;;;;;;;ADC0809转换所需时间;;;;;;;;;;
delay128us:
mov r5,#30
delay1:
mov r7,#5
delay2:
nop
nop
djnz r7,delay2
djnz r5,delay1
ret
;;;;;;;;;;为使数据显示稳定延时;;;;;;;;
delay1s:
mov r4,#10
delay00:
mov r5,#100
delay11:
mov r7,#249
delay22:
nop
nop
djnz r7,delay22
djnz r5,delay11
djnz r4,delay00
Ret
//安装目录下的EXE文件打开后可在电脑上显示当前温度值
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp00625;
temp=tt10+05;
return temp;
}
void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1]; //显示百位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
dula=0;
P0=table1[A2]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);
P0=table[A3]; //显示个位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
delay(1);
}
void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{
display(tmp());
}
}while(1);
}
将二管脚接到P22就可以了
具体的电路图你可以留个邮箱我发给你
我应经发给你了,那个是一个开发板的原理图,外设什么的都有了,你可以参考一下
DS18B20温度传感器、LCD1602液晶显示的代码
;XRF多功能51单片机开发板
;DS18B20测温程序(液晶显示,可测量0-99度)
;
;
TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区
TEMPER_H EQU 35H ;
TEMPER_NUM EQU 60H;温度值存储
TEMPER_GE EQU 61H
TEMPER_SHI EQU 62H
TEMPER_SAVE EQU 63H
FLAG1 BIT 00H
FLAG2 BIT 01H
RS BIT p20;液晶控制接口
RW BIT p21
E BIT p22
DQ BIT p35;单总线口
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#70H
LCALL GET_TEMPER
LCALL TEMPER_COV
LCALL LCDDISP
lcall d100ms
lcall d100ms
LJMP MAIN
NOP
;
;读出转换后的温度值
;
GET_TEMPER:
SETB DQ ; 定时入口
BCD: LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC命令
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL D100MS
CBA:LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;
;读DS18B20的程序,从DS18B20中读出一个字节的数据
;
READ_1820:
MOV R2,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;
;写DS18B20的程序
;
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;;
;将从DS18B20中读出的温度数据进行转换
;;
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A ;得到低四位
MOV A,TEMPER_L
JNB ACC3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM ;得到高四位,再与低四位相或得到值
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;;
;将16进制的温度数据转换成压缩BCD码
;;
BIN_BCD:
MOV A,TEMPER_NUM
MOV B,#10
DIV AB
MOV TEMPER_SHI,A
MOV TEMPER_GE,B
RET
;
;DS18B20初始化程序
;;
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#250
TSR1:
DJNZ R0,TSR1 ; 延时520us
SETB DQ
MOV R0,#25H ;96US-25H
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3;如D0为低则复位成功,DS18B20存在
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH ;200US
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ ;拉高总线
RET
;
;数码显示程序
;
;
;液晶显示程序
;
LCDDISP:
mov p1,#01h;清屏
call enrw
mov p1,#38h;设为8位,5*7字 型两行
call enrw
mov p1,#0Ch
call enrw
mov p1,#06h
call enrw
mov p1,#80h
call enrw
mov dptr,#yjtab
call rwram
mov p1,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
W_TEM:
mov p1,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,TEMPER_SHI
MOVC A,@A+DPTR
MOV P1,A
setb rs
clr rw
clr e
call D500us
setb e
MOV DPTR,#ASCII
MOV A,TEMPER_GE
MOVC A,@A+DPTR
MOV P1,A
setb rs
clr rw
clr e
call D500us
setb e
RET
enrw:clr rs
clr rw
clr e
call D500us
setb e
ret
rwram:mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call rwram2
inc r1
cjne a,#00h,a1
ret
rwram2:mov p1,a
setb rs
clr rw
clr e
call D500us
setb e
ret
;R
;延时子程序
;
D500us:
MOV R6,#250;延时500us
DJNZ R6,$
RET
DELAY1:MOV R7,#20H
DJNZ R7,$
RET
D100MS: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
RET
yjtab: db ' XRF MCS-51 ',00h
yjtab1:db 'temperature:`C',00h
ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
end
/lcd1602显示温度(使用温度传感器18b20)/
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
/液晶屏相关参数/
#define data_port P1 //液晶屏指令、数据通信接口
sbit rs=P2^0; //液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器)
sbit rw=P2^1; //液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出)
sbit en=P2^2; //液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)
uchar code line1_str[]={" Temperature "};//液晶屏第一行要显示的字符串
uchar code num_tab[]={"0123456789"};
/温度传感器18b20相关参数/
sbit DQ=P3^5; //温度传感器18b20的数据接口
/子函数声明部分/
void T1_int(); //定时器T1初始化子函数声明
void in_command(uchar com); //向液晶屏输入命令子函数声明
void in_data(uchar dat); //向液晶屏输入数据子函数声明
void lcd_disp_string(uchar str[]); //液晶屏显示一串字符子函数声明
void lcd_int(); //液晶屏初始化子函数声明
void disp_temperature(uint temp);//lcd1602显示温度子函数声明
bit ds18b20_ret(); //温度传感器18b20复位子函数声明
void ds18b20_wr_com(uchar com); //向温度传感器18b20写入命令子函数声明
void rd_ram_command(); //发送命令子函数(读取18b20的RAM)
uint ds18b20_rd_data(); //读出温度传感器18b20寄存器的相关数据(主要是温度值)子函数声明
void temperature_convert(); //18b20温度转换子函数声明
void delayms(uint ms); //毫秒延时子函数声明
void delay_n10_us(uchar n); //微秒延时子函数声明
//
void main()
{
T1_int(); //定时器T1初始化
DQ=1; //释放温度传感器18b20的数据接口
temperature_convert(); //第一次调用18b20温度转换子函数消除85°C问题
lcd_int(); //液晶屏初始化(放在18b20温度转换子函数后边用来延时,跳过85°C)
while(1)
{
temperature_convert(); //调用18b20温度转换子函数
rd_ram_command(); //发送命令子函数(读取18b20的RAM)
disp_temperature(ds18b20_rd_data());//调用lcd1602显示温度子函数
}
}
/定时器T1初始化/
void T1_int()
{
TMOD=0x10; //0001 0000 T1工作在定时方式1
TH1=0; //T1设定初值
TL1=0;
TR1=0; //暂时关闭T1
}
/18b20温度转换子函数/
void temperature_convert()
{
while(ds18b20_ret()==0);//温度传感器18b20复位
ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"
ds18b20_wr_com(0x44); //向温度传感器18b20写入"温度转换命令"
delay_n10_us(50); //500us延时,等待转换完成
}
/发送命令子函数(读取18b20的RAM)/
void rd_ram_command()
{
while(ds18b20_ret()==0);
ds18b20_wr_com(0xcc); //向温度传感器18b20写入"跳跃ROM命令"
ds18b20_wr_com(0xbe); //向温度传感器18b20写入"读RAM命令"
}
/读出18b20寄存器的相关数据(主要是温度值)子函数/
uint ds18b20_rd_data()
{
uchar i;
uint temp_val;
for(i=0;i<16;i++)
{
temp_val>>=1;
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
if(DQ==1)
{
temp_val|=0x8000;
}
delay_n10_us(7); //70us延时,确保读出
}
return(temp_val);
}
/向温度传感器18b20写入命令子函数声明/
void ds18b20_wr_com(uchar com)
{
uchar i;
for(i=0;i<8;i++)
{
if((com&0x01)==0)
{
DQ=0;
delay_n10_us(7); //70us延时,确保写入0
DQ=1;
_nop_();
}
else
{
DQ=0;
_nop_();
DQ=1;
delay_n10_us(7); //70us延时,确保写入1
}
com>>=1;
}
}
/温度传感器18b20复位子函数/
bit ds18b20_ret()
{
uint temp; //暂存脉冲时间
DQ=0; //启动复位脉冲
delay_n10_us(50); //500us延时(大于480us)
DQ=1; //停止复位脉冲
TR1=1; //启动T1
while(DQ==1 && TH1256+TL1<=60);//等待18b20回应,等待时间不超过60us
if(DQ==0) //18b20回应
{
temp=TH1256+TL1;
while(TH1256+TL1-temp<40); //等待60us再次检测回应脉冲是否存在
if(DQ==0) //18b20正常回应
{
while(TH1256+TL1<=480);//等待正常复位完成
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(1); //18b20有正常回应返回1
}
else
{
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(0); //18b20有正常回应返回0
}
}
else
{
TR1=0; //关闭T1
TH1=0; //计时归零
TL1=0;
return(0); //18b20没有回应返回0
}
}
/lcd1602显示温度子函数声明/
void disp_temperature(uint temp)
{
uchar temp_h,temp_l,flag=0; //温度整数部分,小数部分(二进制)和最高位是否为'0'标志
uint temp_decimal=0; //存储温度值的小数部分(十进制)
in_command(0xc2); //设定第二行字符串起始显示位置
if(temp>=0x8000)
{
in_data('-'); //显示'-'号
temp=~temp;
temp+=1;
}
else
{
in_data(' '); //'+'号不显示
}
temp_h=temp/16;
temp_l=temp%16;
if(temp_h/100!=0)
{
flag=1;
in_data(num_tab[temp_h/100]); //显示温度值的百位
}
else
{
in_data(' '); //百位为'0'则百位不显示
}
temp_h%=100;
if(temp_h/10!=0 || flag==1)
{
flag=1;
in_data(num_tab[temp_h/10]); //显示温度值的十位
}
else
{
in_data(' '); //百位,十位都为'0'则十位不显示
}
temp_h%=10;
in_data(num_tab[temp_h]); //显示温度值的个位
in_data(''); //显示小数点
if(temp_l/8==1)
{temp_decimal+=5000;}
temp_l=temp_l%8;
if(temp_l/4==1)
{temp_decimal+=2500;}
temp_l=temp_l%4;
if(temp_l/2==1)
{temp_decimal+=1250;}
temp_l=temp_l%2;
if(temp_l==1)
{temp_decimal+=625;}
in_data(num_tab[temp_decimal/1000]);//显示温度值的十分位
in_data(' ');
in_data(223); //显示温度单位标志'摄氏度'
in_data('C');
}
/液晶屏初始化子函数/
void lcd_int()
{
/LCD初始设置/
delayms(15); //延时15MS,等待LCD初始化
in_command(0x01); //清显示屏
in_command(0x38); //8位通信,2行显示,57点阵
in_command(0x0c); //开显示,关光标,关闪烁
in_command(0x06); //字符不动,光标右移动,地址加一
/1602显示上电后电机默认的状态信息/
in_command(0x80); //设定第一行字符串起始显示位置
lcd_disp_string(line1_str); //显示数据(字符)
}
/液晶屏显示一串字符/
void lcd_disp_string(uchar str[])
{
uchar i=0;
while(str[i]!='\0')
{
in_data(str[i]); //显示数据(字符)
i++;
delayms(50); //延时
}
}
/向液晶屏输入命令子函数/
void in_command(uchar com)
{
delayms(2);
en=0;//关闭通信,为设置参数做准备
rs=0;//选择指令寄存器
rw=0;//写入液晶
_nop_();
data_port=com;
en=1;//开始通信
_nop_();
en=0;//关闭通信,为设置参数做准备
}
/向液晶屏输入数据子函数/
void in_data(uchar dat)
{
delayms(2);
en=0;//关闭通信,为设置参数做准备
rs=1;//选择数据寄存器
rw=0;//写入液晶
_nop_();
data_port=dat;
_nop_();
en=1;//开始通信
_nop_();
en=0;//关闭通信,为设置参数做准备
}
/微秒延时子函数/
void delay_n10_us(uchar n)
{
while(n--)
{
_nop_();
_nop_();
}
}
/毫秒延时子函数/
void delayms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<124;i++);
}
}
第一要完成温度传感器与单片机的硬件连接:
(1)温度传感器是将非电量转换为电量 即温度转换成电压(一般电压值较小 为毫伏级的)因此需要加一级运算放大电路,放大到0~5伏或1~5伏
(2)需要完成模拟量到数字量的转换:将代表温度的电压(0~5V)经过A/D转换器转换成8位或16位数字量。
第二要编写软件:
实现温度采集的A/D转换,并根据标度变换公式,把转换的8位或16位数字量转换成具有单位物理量的温度值。
两个单片机之间先建立相互间的外部中断,
如:第一只单片机的P10引脚与第二只单片机的P32相连,
同时,第二只单片机的P10引脚也与第一只单片机的P32相连,
在两个单片机的中断子程序里,当任一只单片机去读温度传感器的数据时,
另一只单片机也同时去读数据即可。
注意:只能有一只单片机发布控制字命令。
中断和串口已经他用。
那么就用引脚查询方式让两个单片机之间先建立相互间的通信。
以上就是关于51单片机c语言编程的温湿度检测控制程序全部的内容,包括:51单片机c语言编程的温湿度检测控制程序、基于51单片机和AD590温度传感器温度采集的程序、跪求用温度传感器ds18b20显示温度的单片机程序,我用的是89c52单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)