便宜环境IAR for 51,单片机 TI CC2530,传感器CC2530!!!
单片机源程序如下:
- #include <ioCC2530.h>
- #include <stdio.h>
- #include "hal_mcu.h"
- #define uint16 unsigned int
- #define uint8 unsigned char
- #define STATUS_REG_W 0x06
- #define STATUS_REG_R 0x07
- #define MEASURE_TEMP 0x03
- #define MEASURE_HUMI 0x05
- #define RESET 0x1E
- #define noACK 0
- #define ACK 1
- #define SHT10_SCL_PIN P1_7 //SHT10时钟
- #define SHT10_SDA_PIN P1_6 //SHT10数据线
- #define SHT10_DATA_R() P1DIR &= 0x7F
- #define SHT10_DAT_W() P1DIR |= 0x80
- #define SHT10_SCL_HIGH() (SHT10_SCL_PIN = 1)
- #define SHT10_SCL_LOW() (SHT10_SCL_PIN = 0)
- #define SHT10_SDA_HIGH() (SHT10_SDA_PIN = 1)
- #define SHT10_SDA_LOW() (SHT10_SDA_PIN = 0)
- unsigned char d1,d2,d3;
- /**************************************************************************************************
- * 函数名称:initIO
- *
- * 功能描述:SHT10串行通信IO初始化
- *
- * 参 数:无
- *
- * 返 回 值:无
- **************************************************************************************************/
- void initIO(void)
- {
- P1DIR|= 0xc0;
- P1INP &= 0xbf;
- SHT10_SDA_HIGH();
- SHT10_SCL_LOW();
- }
- /**************************************************************************************************
- * 函数名称:s_write_byte_to_sht10
- *
- * 功能描述:向SHT10写一个字节
- *
- * 参 数:value -- 需写入的字节值
- *
- * 返 回 值:error -- 操作是否成功
- **************************************************************************************************/
- char write_byte_to_sht10(unsigned char value)
- {
- uint8 i;
- uint8 error=1;
-
- SHT10_DAT_W();
- for (i=0x80;i>0;i/=2) //将一个字节的8位逐一输出
- {
- if (i & value)
- {
- SHT10_SDA_HIGH();
- }
- else
- {
- SHT10_SDA_LOW();
- }
- SHT10_SCL_HIGH();
- halMcuWaitUs(5);
- SHT10_SCL_LOW();
- halMcuWaitUs(1);
- }
- SHT10_SDA_HIGH();
- SHT10_DATA_R();
- SHT10_SCL_HIGH();
- halMcuWaitUs(1);
- error = SHT10_SDA_PIN;
- halMcuWaitUs(3);
- SHT10_DAT_W();
- SHT10_SDA_HIGH();
- SHT10_SCL_LOW();
-
- return error;
- }
- /**************************************************************************************************
- * 函数名称:s_receive_byte_from_sht10
- *
- * 功能描述:从SHT10读取一个字节
- *
- * 参 数:ack -- 读取数据后,向SHT10发送ACK
- *
- * 返 回 值:val -- 读取的字节值
- **************************************************************************************************/
- char receive_byte_from_sht10(unsigned char ack)
- {
- uint8 i;
- uint8 val = 0;
- SHT10_DAT_W();
- SHT10_SDA_PIN= 1;
- SHT10_DATA_R();
-
- for (i=0x80;i>0;i/=2)
- {
- SHT10_SCL_HIGH();
- if (SHT10_SDA_PIN)
- val = (val | i);
- else
- val = (val | 0x00);
- SHT10_SCL_LOW();
- halMcuWaitUs(5);
- }
- SHT10_DAT_W();
- SHT10_SDA_PIN = !ack;
- SHT10_SCL_HIGH();
- halMcuWaitUs(5);
- SHT10_SCL_LOW();
- SHT10_SDA_HIGH();
-
- return val; //返回读取的值
- }
- /**************************************************************************************************
- * 函数名称:transstart
- *
- * 功能描述:启动SHT10,开始与SHT10通信
- *
- * 参 数:无
- *
- * 返 回 值:无
- **************************************************************************************************/
- void transstart(void)
- {
- SHT10_DAT_W();
- SHT10_SDA_HIGH();
- SHT10_SCL_LOW();
- halMcuWaitUs(1);;
- SHT10_SCL_HIGH();
- halMcuWaitUs(2);
- SHT10_SDA_LOW();
- halMcuWaitUs(2);
- SHT10_SCL_LOW();
- halMcuWaitUs(5);
- SHT10_SCL_HIGH();
- halMcuWaitUs(2);
- SHT10_SDA_HIGH();
- halMcuWaitUs(2);
- SHT10_SCL_LOW();
- halMcuWaitUs(2);
- }
- /**************************************************************************************************
- * 函数名称:s_connectionreset
- *
- * 功能描述:与SHT10通信复位
- *
- * 参 数:无
- *
- * 返 回 值:无
- **************************************************************************************************/
- void connectionreset(void)
- {
- SHT10_DAT_W();
- unsigned char i;
- SHT10_SDA_HIGH();
- SHT10_SCL_LOW();
- for(i=0;i<9;i++)
- {
- SHT10_SCL_HIGH();
- halMcuWaitUs(2);
- SHT10_SCL_LOW();
- halMcuWaitUs(2);
- }
- transstart();
- }
- /**************************************************************************************************
- * 函数名称:measure
- *
- * 功能描述:发送命令、读取SHT10温度或湿度数据
- *
- * 参 数:*p_checksum -- 校验和
- * mode -- 读取数据类型(3为温度,5为湿度)
- *
- * 返 回 值:er -- 操作结果
- **************************************************************************************************/
- char measure( unsigned char *p_checksum, unsigned char mode)
- {
- unsigned er=0;
- unsigned int i,j;
- transstart();
- switch(mode)
- {
- case 3 :er+=write_byte_to_sht10(MEASURE_TEMP);break;
- case 5 :er+=write_byte_to_sht10(MEASURE_HUMI);break;
- default :break;
- }
- SHT10_DATA_R();
- for(i=0;i<65535;i++)
- {
- for(j=0;j<65535;j++)
- {
- if(SHT10_SDA_PIN == 0)
- {
- break;
- }
- }
- if(SHT10_SDA_PIN == 0)
- {
- break;
- }
- }
-
- if(SHT10_SDA_PIN)
- {
- er += 1;
- }
- d1 = receive_byte_from_sht10(ACK);
- d2 = receive_byte_from_sht10(ACK);
- d3 = receive_byte_from_sht10(noACK);
- return er;
- }
- /**************************************************************************************************
- * 函数名称:tempera_humi_read
- *
- * 功能描述:调用相应函数,读取温度和湿度数据并校验和计算
- *
- * 参 数:*t -- 温度值
- * *h -- 湿度值
- *
- * 返 回 值:无
- **************************************************************************************************/
- void tempera_humi_read(float *t,float *h )
- {
- unsigned char error,checksum;
- float humi,temp;
- initIO();
-
- connectionreset(); //启动传输
- error = 0;
- error += measure(&checksum,MEASURE_HUMI); //读取湿度数据并校验
- humi = d1*256+d2;
-
- error += measure(&checksum,MEASURE_TEMP); //读取温度数据并校验
- temp = d1*256+d2;
- if(error != 0)
- {
- connectionreset(); //读取失败,通信复位
- }
- else //读取成功,计算数据
- {
- temp = temp*0.01 - 39.6 ;
- 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;
- }
- }
-
- *t=temp;
-
- *h=humi*10;
-
- }
- /****************************************************************
- 串口初始化函数
- ****************************************************************/
- 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++)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
SHT10温湿度传感器程序调试.rar
(557.71 KB, 下载次数: 96)
|