189 8069 5689

用c语言温湿度函数 温湿度传感器c语言代码详解

基于5AT89C51单片机温湿度控制系统的C语言的编程。急急急!!!好心人回答下 传感器是DHT11 LCD1602显示

说的很复杂,其实很简单,完成两点:

目前创新互联已为上1000+的企业提供了网站建设、域名、虚拟空间、成都网站托管、企业网站设计、宜川网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1,用传感器来采集数据,然后用AD转换,传给单品机,单片机做出比较,高于设定值执行一个操作。

2,采用一个大循环,各个功能循环。

没有难点,主要是关系多点

嵌入式温湿度传感器C语言代码求帮忙注释

#include "ioCC2430.h"  //包含头文件,相应的板子以及传感器一些信息

#include "hal.h"

#include math.h

//#include intrins.h

#include stdio.h

typedef union    //定义联合体,

{

unsigned int i;

float f;

} value;      //定义联合体类型名称为value

#define noACK 0

#define ACK 1

#define STATUS_REG_W 0x06    //0x06 = 0000 0110

#define STATUS_REG_R 0x07    //0x07 = 0000 0111

#define MEASURE_TEMP 0x03    //0x03 = 0000 0011

#define MEASURE_HUMI 0x05    //0x05 = 0000 0101

#define RESET 0x1e           //0x1e = 0001 1110

#define SDA P1_6             //定义SDA代表的是P1_6脚

#define SCL P1_7

#define begin P2_0

unsigned char d1,d2,d3,d4,d5,d6,d7; //定义无符号字符型变量

void Wait(unsigned int ms)   //定义wait函数,主要用于软件循环,延时作用

{

unsigned char g,k;

while(ms)

{

for(g = 0;g = 167; g++)

{

for(k = 0;k = 48; k++);

}

ms--;

}

}

void QWait() //1us的延时

{

asm("NOP");  //加入汇编操作语句,空操作,主要用于机器周期执行

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

}

void initUART(void)     //初始化单片机的串口

{

IO_PER_LOC_USART0_AT_PORT0_PIN2345();  //具体函数的定义与用法,你得参考头文件中的程序代码了

IO_DIR_PORT_PIN(1, 6, IO_OUT);

IO_DIR_PORT_PIN(1, 7, IO_OUT);

//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);

//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);

IO_DIR_PORT_PIN(2, 0, IO_OUT);

IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);

//SET_MAIN_CLOCK_SOURCE(RC);

SET_MAIN_CLOCK_SOURCE(CRYSTAL);

UART_SETUP(0, 115200, HIGH_STOP);  //设置传输数据的波特率115200

UTX0IF = 1;

U0CSR |= 0XC7;     //U0CSR = U0CSR | 0x1010 0111  (进行位或操作)

IEN0 |= 0x84;

SDA = 1;

SCL = 0;

}

int putchar (int c)    //定义输入字符函数,给的参数是一个整型的数

{

if (c == '\n')      //判断参数c的值是否和'\n'的值相等

{

while (!UTX0IF);    //执行的时候UTX0IF的值是0,此处不是很理解?

UTX0IF = 0;         //给UTX0IF赋0

U0DBUF = 0x0d;      //U0DBUF赋值0x0d = 0000 1011

}

while (!UTX0IF);

UTX0IF = 0;

return (U0DBUF = c);    //如果c的值不是'\n'也就是换行符的时候,将c的值传递到U0DBUF寄存器中

}

char s_write_byte(unsigned char value)   //定义写字节函数(8位)

{

unsigned char i,error = 0;

for (i = 0x80;i 0;i /= 2)   //i 赋初始值0x80 = 128, 执行判断是i 0,执行语句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位

{

if (i value)

SDA = 1;

else

SDA = 0;

SCL = 1;      //此时SCL端口处,也就是p1_7引脚处是高电平

QWait();      //因为写入需要时间,所以程序之中加入下面几条语句

QWait();

QWait();

QWait();

QWait();

SCL = 0;      //使能p1_7眼角处低电平,使的数据写入(具体需要看单片机控制芯片的手册

asm("NOP");

asm("NOP");

}

SDA = 1;

SCL = 1;

asm("NOP");

error = SDA;

QWait();

QWait();

QWait();

SDA = 1;

SCL = 0;

return error;

}

char s_read_byte(unsigned char ack)   //读取数据,按照字节位的顺序读取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001

{

unsigned char i,val = 0;

SDA= 1;

for(i = 0x80;i 0;i /= 2)   //同上

{

SCL = 1;

if (SDA)      //判断SDA处是否有高电平

val = (val | i);      //进行或操作

else

val = (val | 0x00);

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

}

SDA = !ack;

SCL = 1;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 0;

SDA = 1;

return val;   //返回读取到的数据,一个字节,八位

}

void s_transstart(void)  //传输使能函数,就是给控制器引脚处相应电平,使对应模块工作

{

SDA = 1;

SCL = 0;

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 0;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

void s_connectionreset(void)   //复位操作函数

{

unsigned char i;

SDA = 1;

SCL = 0;

for(i = 0;i 9; i++)

{

SCL = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

s_transstart();   //调用开始函数

}

char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函数,主要统计传输的数据个数

{

unsigned er = 0;

unsigned int i,j;

s_transstart();

switch(mode)

{

case 3 :er += s_write_byte(3);

break;

case 5 :er += s_write_byte(5);

break;

default :break;

}

for(i = 0;i 65535;i++)

{

for(j = 0;j 65535;j++)

{if(SDA == 0)

{

break;

}

}

if(SDA == 0)

{

break;

}

}

if(SDA)

{

er += 1;

}

*(p_value) = s_read_byte(ACK);

*(p_value + 1) = s_read_byte(ACK);

*p_checksum = s_read_byte(noACK);

d6 = *(p_value);

d7=*(p_value + 1);

return er;

}

void calc_sth11(float *p_humidity ,float *p_temperature)//计算温度值

{

const float C1 =- 4.0;

const float C2 =+ 0.0405;

const float C3 =- 0.0000028;

const float T1 =+ 0.01;

const float T2 =+ 0.00008;

float rh =* p_humidity;

float t =* p_temperature;

float rh_lin;

float rh_true;

float t_C;

t_C = t * 0.01 - 44.0 ;

rh_lin = C3 * rh * rh + C2 * rh + C1;

rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;

if(rh_true 100)

{

rh_true = 100;

}

if(rh_true 0.1)

{

rh_true = 0.1;

}

*p_temperature = t_C;

*p_humidity = rh_true;

}

void main()  //主函数

{

value humi_val,temp_val;  //声明两个联合体变量

unsigned char error,checksum;  //声明两个无符号的字符型变量

initUART();    //初始化串口

P1INP |= 0xC0;   //初始化P1引脚 , 0xC0 = 1010 0000 ,使P1_7和P1_5引脚为1

begin = 0;

s_connectionreset();

while(1)  //无限循环操作

{

error = 0;

error += s_measure((unsigned char*) humi_val.i,checksum,5);  //读入串口的数据进行温度的计算

d1 = d6;

d2 = d7;

error += s_measure((unsigned char*) temp_val.i,checksum,3);

d3 = d6;

d4 = d7;

if(error != 0)

s_connectionreset();

else

{

humi_val.f = (float)humi_val.i;

temp_val.f = (float)temp_val.i;

humi_val.f = d1 * 256 + d2;

temp_val.f = d3 * 256 + d4;

calc_sth11(humi_val.f,temp_val.f);

printf("temp:%5.1fC humi:%5.1f%%\n",temp_val.f,humi_val.f);

// printf("t1:%x h1:%x\n",d1,d2);

//printf("t2:%x h2:%x\n",d3,d4);

}

Wait(150);

}

}

C语言用函数写出华氏度转摄氏度的程序,代码如下,请问错在哪?

5/9都是整型 结果取整 为0.

改成

#includestdio.h

float getCelsius(float y);

int main()

{

float fahr;

printf("Please input fahr:");

scanf_s("%f", fahr);

printf("fahr:%f,celsius=%f\n",fahr,getCelsius(fahr));

return 0;

}

float getCelsius(float y)

{

float a;

a = y * 5 / 9 - 32;

return a;

}

这样先计算y*5 就是浮点型了.

也可以

a = y * (5.0 / 9) - 32;

谁有SHT10的C语言程序,要是通过C51单片机控制的,急求!

//这是我用成功的

/*************定义接口********************

P2.6------SCK P2.7------DATA

*****************************************/

#include AT89x51.h

#include intrins.h

#include math.h //Keil library

#include stdio.h //Keil library

/******定义函数****************/

#define uchar unsigned char

#define uint unsigned int

void delay_n10us(uint n); //延时函数

/*--------------------------------------

;模块名称:delay_n10us();

;功 能:延时函数,延时约n个10us

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.1(函数版本Function Version)

;修改日期:2008.08.26

;修改说明:修改为较精确的延时函数,"_nop_()"延时1us@12M晶振

;-------------------------------------*/

void delay_n10us(uint n) //延时n个10us@12M晶振

{

uint i;

for(i=n;i0;i--)

{

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

}

}

//*********************第二部分DHT90设置 START****************************************

sbit SCK = P2^6; //定义通讯时钟端口

sbit DATA = P2^7; //定义通讯数据端口

typedef union

{ unsigned int i; //定义了两个共用体

float f;

} value;

enum {TEMP,HUMI}; //TEMP=0,HUMI=1

#define noACK 0 //用于判断是否结束通讯

#define ACK 1 //结束数据传输

//adr command r/w

#define STATUS_REG_W 0x06 //000 0011 0

#define STATUS_REG_R 0x07 //000 0011 1

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000 0010 1

#define RESET 0x1e //000 1111 0

/****************定义函数****************/

void s_transstart(void); //启动传输函数

void s_connectionreset(void); //连接复位函数

char s_write_byte(unsigned char value);//DHT90写函数

char s_read_byte(unsigned char ack); //DHT90读函数

char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数

void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿

/*--------------------------------------

;模块名称:s_transstart();

;功 能:启动传输函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

void s_transstart(void)

// generates a transmission start

// _____ ________

// DATA: |_______|

// ___ ___

// SCK : ___| |___| |______

{

DATA=1; SCK=0; //Initial state

_nop_();

SCK=1;

_nop_();

DATA=0;

_nop_();

SCK=0;

_nop_();_nop_();_nop_();

SCK=1;

_nop_();

DATA=1;

_nop_();

SCK=0;

}

/*--------------------------------------

;模块名称:s_connectionreset();

;功 能:连接复位函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

void s_connectionreset(void)

// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart

// _____________________________________________________ ________

// DATA: |_______|

// _ _ _ _ _ _ _ _ _ ___ ___

// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______

{

unsigned char i;

DATA=1; SCK=0; //Initial state

for(i=0;i9;i++) //9 SCK cycles

{

SCK=1;

SCK=0;

}

s_transstart(); //transmission start

}

/*--------------------------------------

;模块名称:s_write_byte();

;功 能:DHT90写函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

char s_write_byte(unsigned char value)

//----------------------------------------------------------------------------------

// writes a byte on the Sensibus and checks the acknowledge

{

unsigned char i,error=0;

for (i=0x80;i0;i/=2) //shift bit for masking

{

if (i value) DATA=1; //masking value with i , write to SENSI-BUS

else DATA=0;

SCK=1; //clk for SENSI-BUS

_nop_();_nop_();_nop_(); //pulswith approx. 3 us

SCK=0;

}

DATA=1; //release DATA-line

SCK=1; //clk #9 for ack

error=DATA; //check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。

_nop_();_nop_();_nop_();

SCK=0;

DATA=1; //release DATA-line

return error; //error=1 in case of no acknowledge //返回:0成功,1失败

}

/*--------------------------------------

;模块名称:s_read_byte();

;功 能:DHT90读函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

char s_read_byte(unsigned char ack)

// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"

{

unsigned char i,val=0;

DATA=1; //release DATA-line

for (i=0x80;i0;i/=2) //shift bit for masking

{ SCK=1; //clk for SENSI-BUS

if (DATA) val=(val | i); //read bit

_nop_();_nop_();_nop_(); //pulswith approx. 3 us

SCK=0;

}

if(ack==1)DATA=0; //in case of "ack==1" pull down DATA-Line

else DATA=1; //如果是校验(ack==0),读取完后结束通讯

_nop_();_nop_();_nop_(); //pulswith approx. 3 us

SCK=1; //clk #9 for ack

_nop_();_nop_();_nop_(); //pulswith approx. 3 us

SCK=0;

_nop_();_nop_();_nop_(); //pulswith approx. 3 us

DATA=1; //release DATA-line

return val;

}

/*--------------------------------------

;模块名称:s_measure();

;功 能:测量温湿度函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)

// makes a measurement (humidity/temperature) with checksum

{

unsigned error=0;

unsigned int i;

s_transstart(); //transmission start

switch(mode){ //send command to sensor

case TEMP : error+=s_write_byte(MEASURE_TEMP); break;

case HUMI : error+=s_write_byte(MEASURE_HUMI); break;

default : break;

}

for (i=0;i65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement

if(DATA) error+=1; // or timeout (~2 sec.) is reached

*(p_value) =s_read_byte(ACK); //read the first byte (MSB)

*(p_value+1)=s_read_byte(ACK); //read the second byte (LSB)

*p_checksum =s_read_byte(noACK); //read checksum

return error;

}

/*--------------------------------------

;模块名称:calc_dht90();

;功 能:温湿度补偿函数

;占用资源:--

;参数说明:--

;创建日期:2008.08.15

;版 本:FV1.0(函数版本Function Version)

;修改日期:--

;修改说明:--

;-------------------------------------*/

void calc_dht90(float *p_humidity ,float *p_temperature)

// calculates temperature [C] and humidity [%RH]

// input : humi [Ticks] (12 bit)

// temp [Ticks] (14 bit)

// output: humi [%RH]

// temp [C]

{ const float C1=-4.0; // for 12 Bit

const float C2=+0.0405; // for 12 Bit

const float C3=-0.0000028; // for 12 Bit

const float T1=+0.01; // for 14 Bit @ 5V

const float T2=+0.00008; // for 14 Bit @ 5V

float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit

float t=*p_temperature; // t: Temperature [Ticks] 14 Bit

float rh_lin; // rh_lin: Humidity linear

float rh_true; // rh_true: Temperature compensated humidity

float t_C; // t_C : Temperature [C]

t_C=t*0.01 - 40; //calc. temperature from ticks to [C]

rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]

if(rh_true100)rh_true=100; //cut if the value is outside of

if(rh_true0.1)rh_true=0.1; //the physical possible range

*p_temperature=t_C; //return temperature [C]

*p_humidity=rh_true; //return humidity[%RH]

}

//*********************第二部分DHT90设置 END****************************************

//*********主函数*****************

void dht90(void)

{

value humi_val,temp_val;

unsigned char error,checksum;

unsigned int wendu,shidu;

s_connectionreset();

//*********初始化温度显示区*********

LCD_disp_str(2,1,"TTT.TC");

//*********初始化湿度显示区*********

LCD_disp_str(2,2,"RRR.R%");

delay_n10us(20000); //延时0.2s

while(1)

{ error=0;

error+=s_measure((unsigned char*) humi_val.i,checksum,HUMI); //measure humidity

error+=s_measure((unsigned char*) temp_val.i,checksum,TEMP); //measure temperature

if(error!=0) s_connectionreset(); //in case of an error: connection reset

else

{ humi_val.f=(float)humi_val.i; //converts integer to float

temp_val.f=(float)temp_val.i; //converts integer to float

calc_dht90(humi_val.f,temp_val.f); //calculate humidity, temperature

wendu=10*temp_val.f;

LCD_disp_char(2,1,wendu/1000+'0'); //显示温度百位

LCD_disp_char(3,1,(wendu%1000)/100+'0'); //显示温度十位

LCD_disp_char(4,1,(wendu%100)/10+'0'); //显示温度个位

LCD_disp_char(6,1,(wendu%10)+'0'); //显示温度小数点后第一位

shidu=10*humi_val.f;

LCD_disp_char(2,2,shidu/1000+'0'); //显示湿度百位

LCD_disp_char(3,2,(shidu%1000)/100+'0'); //显示湿度十位

LCD_disp_char(4,2,(shidu%100)/10+'0'); //显示湿度个位

LCD_disp_char(6,2,(shidu%10)+'0'); //显示湿度小数点后第一位

}

//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------

delay_n10us(80000); //延时约0.8s

}

}

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

/********************************************************************

*

文件名

温度采集DS18B20.c

*

描述

:

该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。

*

创建人

东流,2009年4月10日

*

版本号

2.0

***********************************************************************/

#includereg52.h

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

iN;

i++)

;

}

/********************************************************************

*

名称

:

Delay_1ms()

*

功能

:

延时子程序,延时时间为

1ms

*

x

*

输入

:

x

(延时一毫秒的个数)

*

输出

:

***********************************************************************/

void

Delay_1ms(uint

i)//1ms延时

{

uchar

x,j;

for(j=0;ji;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;

i3;

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;

i8;

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;

i8;

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

}

}

基于单片机的温湿度采集与控制程序(C语言)

给你一个DS18B20的温度采集程序!

//ICC-AVR application builder : 2009-10-25 10:43:39

// Target : M16

// Crystal: 16.000Mhz

#include iom16v.h

#include macros.h

#define uint unsigned int

#define uchar unsigned char

#include "xianshi.c"

#include "delay.h"

#define CLR_DIR_1WIRE DDRD=~BIT(4) //只要修改这里的参数就可以了

#define SET_DIR_1WIRE DDRD|=BIT(4) //里面什么都不用该!

#define CLR_OP_1WIRE PORTD=~BIT(4)

#define SET_OP_1WIRE PORTD|=BIT(4)

#define CHECK_IP_1WIRE (PIND0x10) //检测

unsigned char wmh,wml;

void init_1820()

{

SET_DIR_1WIRE; //设置PD4 为输出

SET_OP_1WIRE;

CLR_OP_1WIRE;

delay_nus(480); //480us以上

SET_OP_1WIRE;

CLR_DIR_1WIRE;

delay_nus(20); //15~60us

while(CHECK_IP_1WIRE);

SET_DIR_1WIRE;

SET_OP_1WIRE;

delay_nus(140); //60~240us

}

void write_1820(unsigned char x)

{

unsigned char m;

for(m=0;m8;m++)

{

CLR_OP_1WIRE;

if(x(1m)) //写数据了,先写低位的!

SET_OP_1WIRE;

else

{CLR_OP_1WIRE;}

delay_nus(40); //15~60us

SET_OP_1WIRE;

}

SET_OP_1WIRE;

}

unsigned char read_1820()

{

unsigned char temp,k,n;

temp=0;

for(n=0;n8;n++)

{

CLR_OP_1WIRE;

SET_OP_1WIRE;

CLR_DIR_1WIRE;

k=(CHECK_IP_1WIRE); //读数据,从低位开始

if(k)

temp|=(1n);

else

temp=~(1n);

delay_nus(50); //60~120us

SET_DIR_1WIRE;

}

return (temp);

}

unsigned int gettemp() //读取温度值

{

unsigned char temh,teml,wm0,wm1,wm2,wm3;

init_1820(); //复位18b20

write_1820(0xcc); // 发出转换命令

write_1820(0x44);

// delay_nms(800); //不延时也好使,不知道怎么回事!

init_1820();

write_1820(0xcc); //发出读命令

write_1820(0xbe);

teml=read_1820(); //读数据

temh=read_1820();

wm0=teml4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!

wm1=temh4;

wm2=wm1+wm0; //16进制转10进制

return wm2;

}

void main()

{

uint tem,ad[4],i;

port_init();

while(1)

{

tem = gettemp();

for(i=0;i4;i++)

{

ad[3-i]=tem%10;

tem=tem/10;

}

for(i=0;i4;i++)

{

show1(ad[i],i);

delay(5);

}

}

}

显示函数:

#include iom16v.h

#include macros.h

#define uint unsigned int

#define uchar unsigned char

#pragma data:code

const uint tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; //共阳数码管代码表

const uint tab2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00};//共阴数码管代码表

void port_init(void)

{

DDRA = 0xFF;

DDRB = 0xFF;

DDRC = 0xFF;

DDRD = 0x00;

}

void delay(uint ms)

{

uint i,j;

for(i=0;ims;i++)

{

for(j=0;j1141;j++);

}

}

void show1(uchar j,uchar k)//显示函数

{

PORTB = ~BIT(k);

PORTA = tab2[j];

delay(1);

}

void show(uint ada)

{

uint i,ad[4];

for(i=0;i4;i++)

{

ad[3-i]=ada%10;

ada = ada/10;

}

while(1)

{

for(i=0;i4;i++)

{

show1((ad[i]),i);

delay(100);

}

}

}

程序我都调试过的,都是好的,有不会再问我。可以给分了吗?嘿嘿


网站标题:用c语言温湿度函数 温湿度传感器c语言代码详解
转载注明:http://cdxtjz.cn/article/hjhoeh.html

其他资讯