|
SHT10 虽然能读取温度值和湿度值,但我总觉得值不大对,有SHT10的朋友希望能试一下我的程序,
我在SHT10 在data 线上加了一个1.6K的电阻.
编译器:GCC 3.4.1
调试时:m128的uart0 过232接pc
makefile:中将
.........
#Additional libraries.
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB =$(PRINTF_LIB_FLOAT) #----->在PRINTF_LIB = 后加上$(PRINTF_LIB_FLOAT) 就可以printf 浮点数
我在网老出问题,传不上东东.
只能贴了
文件包括:temp_humi.h
UART.h
main.c
temp_humi.h 如下:
/***************************************************************
温湿度传感器头文件
MCU:m128
控制口:默认为 DATA-PC0;SCK-PC1口
用户函数: temp_humi_test(float *tp,float *hi)反两个float值
用法:在主程序中定义IO口:如
#define IO_PF
#define IO_DATA 0
#define IO_SCK 1
.....
表示使用PF0接DATA线,PF1接SCK线
注意头文件加入的顺序
****************************************************************/
#ifdef IO_PA
#define DIR_ DDRA
#define IO_ PORTA
#define DAT_ PINA
#endif
#ifdef IO_PB
#define DIR_ DDRB
#define IO_ PORTB
#define DAT_ PINB
#endif
#ifdef IO_PC
#define DIR_ DDRC
#define IO_ PORTC
#define DAT_ PINC
#endif
#ifdef IO_PD
#define DIR_ DDRD
#define IO_ PORTD
#define DAT_ PIND
#endif
#ifdef IO_PE
#define DIR_ DDRE
#define IO_ PORTE
#define DAT_ PINE
#endif
#ifdef IO_PF
#define DIR_ DDRF
#define IO_ PORTF
#define DAT_ PINF
#endif
#ifdef IO_PG
#define DIR_ DDRG
#define IO_ PORTG
#define DAT_ PING
#endif
/**/
#ifndef IO_DATA
#define DIR_ DDRC
#define IO_ PORTC
#define DAT_ PINC
#define IO_DATA 0
#define IO_SCK 1
#endif
//==========================================================================
#define _nop_() asm volatile( "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t" "nop
\t": : )
#define DATA_in DIR_&=~(1<<IO_DATA);IO_|=(1<<IO_DATA)//set in and release DATA-line
#define DATA_out DIR_|=(1<<IO_DATA) //set out
#define DATA_in_N (DAT_&(1<<IO_DATA))//
#define DATA_out_1 IO_|=(1<<IO_DATA)
#define DATA_out_0 IO_&=~(1<<IO_DATA)
#define SCK_1 DIR_|=(1<<IO_SCK);IO_|=(1<<IO_SCK)
#define SCK_0 DIR_|=(1<<IO_SCK);IO_&=~(1<<IO_SCK)
/*
#define DATA_in DDRC&=~(1<<0)//in
#define DATA_out DDRC|=(1<<0) //out
#define DATA_in_N (PINC&(1<<0))//
#define DATA_out_1 PORTC|=(1<<0)
#define DATA_out_0 PORTC&=~(1<<0)
#define SCK_1 PORTC|=(1<<1)
#define SCK_0 PORTC&=~(1<<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
/*====================================================
【函数原形】:char s_write_byte(unsigned char value)
【参数说明】:
【功能说明】:
【修改时间】: 2007.01.09
====================================================*/
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
DATA_out;//out data
DATA_out_1;
SCK_0;
_nop_();
SCK_1; //Initial state
_nop_();
DATA_out_0;
_nop_();
SCK_0;
_nop_();
SCK_1;
_nop_();
DATA_out_1;
_nop_();
SCK_0;
_nop_();_nop_(); _nop_();
for (i=0x80;i>0;i/=2) //shift bit for masking
{
if (i & value) DATA_out_1; //masking value with i , write to SENSI-BUS
else {DATA_out_0;}
_nop_();_nop_();
SCK_1; //clk for SENSI-BUS
_nop_();_nop_(); //pulswith approx. 5 us
SCK_0;
} // DATA_out_1; //release DATA-line
_nop_();_nop_();
SCK_1;DATA_in;
error=DATA_in_N; //clk for SENSI-BUS
_nop_();_nop_(); //pulswith approx. 5 us
SCK_0;
return error; //error=1 in case of no acknowledge
}
/*====================================================
【函数原形】:char s_read_byte(unsigned char ack)
【参数说明】:
【功能说明】:
【修改时间】: 2007.01.09
====================================================*/
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_out;
//DATA_out_1; //release DATA-line
SCK_0;
DATA_in;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ _nop_();_nop_();
SCK_1; //clk for SENSI-BUS
_nop_();
if (DATA_in_N) val=(val | i); //read bit
_nop_();
SCK_0;
}
_nop_();_nop_();
DATA_out;//out data
if(ack==1)DATA_out_0; //in case of "ack==1" pull down DATA-Line
else DATA_out_1;
_nop_();_nop_();
SCK_1; //clk #9 for ack
_nop_();_nop_(); //pulswith approx. 5 us
SCK_0;
// DATA_out_1; //release DATA-line
return val;
}
/*====================================================
【函数原形】:void s_connectionreset(void)
【参数说明】:
【功能说明】:
【修改时间】: 2007.01.09
====================================================*/
void s_connectionreset(void)
{
unsigned char i;
DATA_out; DATA_out_1;
SCK_0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{ _nop_();_nop_();
SCK_1;
_nop_();_nop_();
SCK_0;
}
_nop_(); _nop_();
SCK_1; //Initial state
_nop_();
DATA_out_0;
_nop_();
SCK_0;
_nop_();
SCK_1;
_nop_();
DATA_out_1;
_nop_();
SCK_0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*====================================================
【函数原形】:void temp_humi_test(float *tp,float *hi)
【参数说明】:*tp为温度存入地址, *hi 为湿度存入地址
【功能说明】: 读取温湿度值
【修改时间】: 2007.01.09
====================================================*/
void temp_humi_test(float *tp,float *hi)
{ uchar err=0;
volatile float Temp=0,Humi=0;;
volatile uint THVAL=0,RHVAL=0;
uint i;
//init_IO();
s_connectionreset();
err=s_write_byte(MEASURE_TEMP);
for(i=0;i<20000;i++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
DATA_in;//in data
if(DATA_in_N==0)
{
THVAL=s_read_byte(ACK);
THVAL=(THVAL<<8)+s_read_byte(ACK);
s_read_byte(noACK);
Temp=THVAL*0.01 - 40;
*tp=Temp;
//printf("Temp=%d
",tp);
}else s_connectionreset();
//=========================
for(i=0;i<20000;i++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
RHVAL=0;
//======================
err= s_write_byte(MEASURE_HUMI);
for(i=0;i<20000;i++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
DATA_in;//in data
if(DATA_in_N==0)
{
RHVAL=s_read_byte(ACK);
RHVAL=(RHVAL<<8)+s_read_byte(ACK);
s_read_byte(noACK);
Humi=(-0.0000028)*RHVAL*RHVAL + 0.0405*RHVAL - 4.0;
Humi=(Temp-25)*(0.01+0.00008*RHVAL)+Humi;
*hi=Humi;
//printf("Humi=%d
",hi);
} else s_connectionreset();
//==================
for(i=0;i<10000;i++)
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
//==================
}
UART.H 如下
/*******************************************
m128 uart 头文件
********************************************/
#define UART0_RXDIEON UCSR0B=UCSR0B|0X80
#define UART0_RXDIEOFF UCSR0B=UCSR0B&0X7F
#define UART1_RXDIEON UCSR1B=UCSR1B|0X80
#define UART1_RXDIEOFF UCSR1B=UCSR1B&0X7F
//#if mcu_fosc=
#define fosc 8000000 //8M晶振11059200
#define baud 9600 //波特率
/*====================================================
【函数原形】: void init_UART(void)
【参数说明】:
【功能说明】: 波特率为19200,
【修改时间】: 2006.06.01
====================================================*/
void init_UART(void)
{
//--UART0--
UCSR0B=(1<<RXEN0)|(1<<TXEN0); //允许发送接收,无中断--|(1<<RXCIE0)
UBRR0L=(fosc/16/(baud-1))%256; //baud high bit
UBRR0H=(fosc/16/(baud-1))/256; //baud low bit
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //8位数据位,1位停止位(1<<USBS0)|
//--UART1--
UCSR1B=(1<<RXEN1)|(1<<TXEN1); // //允许发送接收,无中断---|(1<<RXCIE1)
UBRR1L=(fosc/16/(baud-1))%256; //baud high bit
UBRR1H=(fosc/16/(baud-1))/256; //baud low bit
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);// //8位数据位,1位停止位(1<<USBS1)|
}
/*====================================================
【函数原形】: void UART_TXD(uint8_t UARTdata)
【参数说明】:
【功能说明】:M48UART 发送数据
【修改时间】: 2006.06.01
====================================================*/
void UART_TXD(uint8_t UARTdata)
{
while(!(UCSR0A&(1<<UDRE0))); //
UDR0=UARTdata;
}
void UART_TXD1(uint8_t UARTdata1)
{
while(!(UCSR1A&(1<<UDRE1))); //
UDR1=UARTdata1;
}
/*====================================================
【函数原形】: void UART_RXD(uint8_t UARTdata)
【参数说明】:
【功能说明】:M48UART 接收数据
【修改时间】: 2006.06.01
====================================================*/
uint8_t UART_RXD(void)
{
while(!(UCSR0A&(1<<RXC0)));
return (UDR0);
}/**/
uint8_t UART_RXD1(void)
{
while(!(UCSR1A&(1<<RXC1)));
return (UDR1);
}
/*******************************************
main
mcu:m128
fosc: 8M
*******************************************/
#include "avr/io.h"
#include "stdio.h"
#include "UART.h"
#define uchar unsigned char
#define uint unsigned int
//----------------------
#define IO_PF
#define IO_DATA 0
#define IO_SCK 1
#include"temp_humi.h"
int main(void)
{
float tp=0,hi=0;
//int tp=0,hi=0;
init_UART();
fdevopen(UART_TXD,0,0); //printf 指向UART_TXD();
while(1)
{
temp_humi_test(&tp,&hi);
printf("Temp=%5.1f'C Humi=%5.1f%%
",tp,hi); //用串口在PC机上监视
printf("
");
//delay(3000);
}
}
-----此内容被Dong_mcu于2007-01-18,17:17:26编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|