51单片机c语言编程的温湿度检测控制程序

51单片机c语言编程的温湿度检测控制程序,第1张

/

文件名

温度采集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单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存