写SHT1X程序主要注意延时,希望能帮助有需要的人;
#include <ioCC2530.h>
#include <string.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define INT16 short int
//定义控制灯的端口
#define RLED P1_0
#define GLED P1_1
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03
#define MEASURE_HUMI 0x05
#define RESET 0x1e
#define SCL P1_7 //SHT10时钟
#define SDA P1_6 //SHT10数据线
#define DAT_R() P1DIR&=~(1<<6)
#define DAT_W() P1DIR|=(1<<6)
unsigned char d1,d2,d3,d4,d5,d6,d7;
void Wait(unsigned int ms);
void QWait(void) ;
char s_write_byte(unsigned char value);
char s_read_byte(unsigned char ack);
void s_transstart(void);
void s_connectionreset(void);
char s_measure( unsigned char *p_checksum, unsigned char mode);
void initIO(void);
//函数声明
void Delay(uint);
void initUARTSEND(void);
void UartTX_Send_String(char *Data,int len);
char Txdata[25]="QIUJIE TECH.INC.";
/**************************************************************************************************
* 函数名称:Wait
*
* 功能描述:延时函数(不精确延时)
*
* 参 数:ms -- 延时时间
*
* 返 回 值:无
**************************************************************************************************/
void Wait(unsigned int ms)
{
unsigned char g,k;
while(ms)
{
for(g=0;g<=167;g++)
{
for(k=0;k<=48;k++);
}
ms--;
}
}
/**************************************************************************************************
* 函数名称:QWait
*
* 功能描述:延时函数(大约1us的延时)
*
* 参 数:无
*
* 返 回 值:无
**************************************************************************************************/
void QWait()
{
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");asm("NOP");
asm("NOP");
}
/**************************************************************************************************
* 函数名称:initIO
*
* 功能描述:SHT10串行通信IO初始化
*
* 参 数:无
*
* 返 回 值:无
**************************************************************************************************/
void initIO(void)
{
P1DIR|= 0xc0; //P1控制LED
// IO_DIR_PORT_PIN(1, 0, IO_OUT);
// IO_DIR_PORT_PIN(1, 1, IO_OUT);
P1INP |= 0x40;
SDA = 1; SCL = 0;
}
/**************************************************************************************************
* 函数名称:s_write_byte
*
* 功能描述:从SHT10写一个字节
*
* 参 数:value -- 需写入的字节值
*
* 返 回 值:error -- 操作是否成功
**************************************************************************************************/
char s_write_byte(unsigned char value)
{
unsigned char i,error
=1;
DAT_W();
// P1DIR|= 0xc0;
// IO_DIR_PORT_PIN(1, 0, IO_OUT); //时钟和数据IO设置为输出
// IO_DIR_PORT_PIN(1, 1, IO_OUT);
for (i=0x80;i>0;i/=2) //将一个字节的8位逐一输出
{
if (i & value)
SDA=1;
else
SDA=0;
SCL = 1;
QWait();QWait();QWait();QWait();QWait();
SCL = 0;
asm("NOP"); asm("NOP");
}
SDA = 1;
DAT_R();
/
/ IO_DIR_PORT_PIN(1, 1, IO_IN); //将数据线设置为输入,以准备接收SHT10的ACK
SCL = 1; asm("NOP");
error = SDA;
QWait();QWait();QWait();
DAT_W();
//IO_DIR_PORT_PIN(1, 1, IO_OUT); //将数据线恢复为输出状态
SDA = 1;
SCL = 0;
return error;
}
/**************************************************************************************************
* 函数名称:s_read_byte
*
* 功能描述:从SHT10读取一个字节
*
* 参 数:ack -- 读取数据后,向SHT10发送ACK
*
* 返 回 值:val -- 读取的字节值
**************************************************************************************************/
char s_read_byte(unsigned char ack)
{
write的返回值DAT_W();
/
/IO_DIR_PORT_PIN(1, 0, IO_OUT); //时钟和数据IO设置为输出
// IO_DIR_PORT_PIN(1, 1, IO_OUT);
unsigned char i,val=0;
SDA= 1;
DAT_R();
//IO_DIR_PORT_PIN(1, 1, IO_IN); //将数据线设置为输入,以准备接收SHT10的数据
for (i=0x80;i>0;i/=2)
{
SCL = 1;
if (SDA)
val = (val | i);
else
val = (val | 0x00);
SCL = 0;
QWait();QWait();QWait();QWait();QWait();
}
DAT_W();
//IO_DIR_PORT_PIN(1, 1, IO_OUT); //将数据线恢复为输出状态
SDA = !ack;
SCL = 1;
QWait();QWait();QWait();QWait();QWait();
SCL = 0;
SDA = 1;
return val; //返回读取的值
}
/**************************************************************************************************
* 函数名称:s_transstart
*
* 功能描述:启动SHT10,开始与SHT10通信
*
* 参 数:无
*
* 返 回 值:无
**************************************************************************************************/
void s_transstart(void)
{
DAT_W();
// IO_DIR_PORT_PIN(1, 0, IO_OUT);
//IO_DIR_PORT_PIN(1, 1, IO_OUT);
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();
}
/**************************************************************************************************
* 函数名称:s_connectionreset
*
* 功能描述:与SHT10通信复位
*
* 参 数:无
*
* 返 回 值:无
**************************************************************************************************/
void s_connectionreset(void)
{
// IO_DIR_PORT_PIN(1, 0, IO_OUT);
// IO_DIR_PORT_PIN(1, 1, IO_OUT);
DAT_W();
unsigned char i;
SDA = 1; SCL= 0;
for(i=0;i
<9;i++)
{
SCL = 1;QWait();QWait();
SCL = 0;QWait();QWait();
}
s_transstart();
}
/**************************************************************************************************
* 函数名称:s_measure
*
* 功能描述:发送命令、读取SHT10温度或湿度数据
*
* 参 数:*p_checksum -- 校验和
* mode -- 读取数据类型(3为温度,5为湿度)
*
* 返 回 值:er -- 操作结果
**************************************************************************************************/
char s_measure( 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;
}
DAT_R();
// IO_DIR_PORT_PIN(1, 1, IO_IN); //将数据线设置为输入,以准备接收SHT10的ACK
for(i=0;i<65535;i++)
{
for(j=0;j<65535;j++)
{if(SDA == 0)
{break;}}
if(SDA == 0)
{break;}
}
if(SDA) //SDA没有拉低,错误信息加1
{er += 1;}
d1 = s_read_byte(ACK); //数据读取
d2 = s_read_byte(ACK);
d3 = s_read_byte(noACK);
return er;
}
/
**************************************************************************************************
* 函数名称:th_read
*
* 功能描述:调用相应函数,读取温度和数据数据并校验和计算
*
* 参 数:*t -- 温度值
* *h -- 湿度值
*
* 返 回 值:无
**************************************************************************************************/
void th_read(int *t,int *h )
{
unsigned char error,checksum;
float humi,temp;
int tmp;
initIO();
s_connectionreset(); //启动传输
error=0;
error+=s_measure(&checksum,5); //读取湿度数据并校验
humi = d1*256+d2;
error+=s_measure(&checksum,3); //读取温度数据并校验
temp = d1*256+d2;
if(error!=0) s_connectionreset(); //读取失败,通信复位
else //读取成功,计算数据
{
temp = temp*0.01 - 44.0 ;
humi = (temp - 25) * (0.01 + 0.00008 * humi) -0.0000028 * humi * humi + 0.0405 * humi-4;
if(humi>100)
{humi = 100;}
if(humi<0.1)
{humi = 0.1;}
}
tmp=(int)(temp*10)%10;
if(tmp>4)
{
temp=temp+1;
}
else
{
temp=temp;
}
*t=(int)temp;
tmp=(int)(humi*10)%10;
if(humi>4)
{
humi=humi+1;
}
else
{
humi=humi;
}
*h=(int)humi;
}
/****************************************************************
延时函数
****************************************************************/
void Delay(uint n)
{
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}
/****************************************************************
串口初始化函数
************
****************************************************/
void initUARTSEND(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //UART方式
U0GCR |= 9;
U0BAUD |= 59; //波特率设为19200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{ int tempera;
int humidity;
char s[8];
s[0]=48;
s[1]=49;
//uchar i;
initUARTSEND();
while(1)
{
th_read(&tempera,&humidity); //读取温度和湿度
QWait();
s[0]=48+tempera/10;
s[1]=48+tempera%10;
UartTX_Send_String(s,8); //串口发送数据
s[0]=48+humidity/10;
s[1]=48+humidity%10;
UartTX_Send_String(s,8); //串口发送数据
Delay(50000); //延时
//标志发送状态
Delay(50000);
Delay(50000);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论