📄 main.c
字号:
/****************************************************************************
* 文件名:
* 功能:
* 说明:
iic2接SHT10的数据口
12M晶震
****************************************************************************/
#include "config.h"
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define CLK_SHTH (FIO0SET |= (1 << 11))
#define CLK_SHTL (FIO0CLR |= (1 << 11))
#define DAT_SHTH (FIO0SET |= (1 << 14))
#define DAT_SHTL (FIO0CLR |= (1 << 14))
float wendu,shidu;
void delay_nms(int x)
{
long i,temp;
temp=(Fcclk/6000)*x;
for(i=0;i<temp;i++)
__asm{NOP};
}
void delay(uchar x)
{
uchar i;
for(i=0;i<x*2;i++)
__asm{NOP};
}
void s_transstart(void)
{
CLK_SHTL;
DAT_SHTH;
delay(20);
CLK_SHTH;
delay(10);
DAT_SHTL;
delay(10);
CLK_SHTL;
delay(20);
CLK_SHTH;
delay(10);
DAT_SHTH;
delay(10);
CLK_SHTL;
delay(20);
}
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// 连接复位;
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DAT_SHTH;
CLK_SHTL;
delay(10); //准备
for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
CLK_SHTH;
delay(20);
CLK_SHTL;
delay(20);
}
s_transstart(); //启动传输
}
long s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// 写字节函数
{
unsigned char i;
long error=0;
for (i=0x80;i>0;i/=2) //高位为1,循环右移
{
if (i & value) DAT_SHTH; //和要发送的数相与,结果为发送的位
else DAT_SHTL;
CLK_SHTH;
delay(20);
CLK_SHTL;
delay(20);
}
DAT_SHTH; //release DATA-line
CLK_SHTH; //clk #9 for ack
FIO0DIR&=~( 1 << 14);
delay(20);
error=(FIO0PIN & 0X4000); //check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。
delay(10);
CLK_SHTL;
delay(10);
FIO0DIR|=( 1 << 14);
DAT_SHTH; //release DATA-line
return error; //error=1 in case of no acknowledge //返回:0成功,1失败
}
char s_read_byte(unsigned char ack)
{
unsigned char i,val=0;
DAT_SHTH;
FIO0DIR&=~( 1 << 14); //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{
CLK_SHTH; //clk for SENSI-BUS
if (FIO0PIN & 0X4000) val=(val | i); //read bit
delay(20); //pulswith approx. 3 us
CLK_SHTL;
delay(20);
}
FIO0DIR|=( 1 << 14);
if(ack==1)DAT_SHTL; //in case of "ack==1" pull down DATA-Line
else DAT_SHTH; //如果是校验(ack==0),读取完后结束通讯
delay(20); //pulswith approx. 3 us
CLK_SHTH; //clk #9 for ack
delay(20); //pulswith approx. 3 us
CLK_SHTL;
delay(20); //pulswith approx. 3 us
DAT_SHTH; //release DATA-line
return val;
}
char s_measure()
{
unsigned error=0;
uchar datal,datah;
float dcr16;
long i;
s_transstart(); //transmission start
error+=s_write_byte(0x03);//温度测量
FIO0DIR&=~( 1 << 14);
for (i=0;i<0xffffffff;i++)
if((FIO0PIN & 0X4000)==0)
break; //wait until sensor has finished the measurement
if(FIO0PIN & 0X4000) error+=1; // or timeout (~2 sec.) is reached
FIO0DIR|=( 1 << 14);
datah=s_read_byte(1); //read the first byte (MSB)
datal=s_read_byte(1); //read the second byte (LSB)
dcr16=s_read_byte(0); //read checksum
wendu=(datah*256 + datal)*0.01-40;
s_transstart(); //transmission start
error+=s_write_byte(0x05);//湿度测量
FIO0DIR&=~( 1 << 14);
for (i=0;i<0xffffffff;i++)
if((FIO0PIN & 0X4000)==0)
break; //wait until sensor has finished the measurement
if(FIO0PIN & 0X4000) error+=1; // or timeout (~2 sec.) is reached
FIO0DIR|=( 1 << 14);
datah=s_read_byte(1); //read the first byte (MSB)
datal=s_read_byte(1); //read the second byte (LSB)
dcr16=s_read_byte(0); //read checksum
shidu=datah*256 + datal;
shidu = (wendu-25)*(0.01+0.00008*shidu)+(shidu*shidu*(-0.0000028)+0.0405*shidu-4);
return error;
}
void McuInit(void)
{
SCS = 0X03;
FIO0MASK = 0X0;
PINSEL0 = 0;//引脚功能选择寄存器
PINSEL1 = 0;
//设置为输入的端口
FIO0DIR = 0XFFFFFFFF & (~(1 << 15)) & (~(1 << 16)) & (~(1 << 10))
& (~(1 << 17)) & (~(1 << 18)) & (~(1 << 19))
& (~(1 << 20)) & (~(1 << 21)) & (~(1 << 22));
FIO1MASK = 0X0;
FIO1DIR = 0XFFFFFFFF & (~(1 << 22));
}
int main (void)
{
uchar error;
McuInit();
delay_nms(200);
s_connectionreset();
delay_nms(200);
while(1)
{
error=0;
error+=s_measure(); //measure humidity
if(error!=0) s_connectionreset(); //in case of an error: connection reset
delay_nms(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -