📄 main.c
字号:
light_waitack();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_stop();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
return 1;
}
}
char readdiagram(unsigned char regadr)
{ unsigned char a;
light_start();
light_writebyte(0x88);
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_waitack();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_writebyte(regadr);//所写的寄存器地址
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_waitack();
light_stop();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_start();
light_writebyte(0x89);
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_waitack2();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
a=readbyte();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
notack();
light_stop();
return a;
}
void sync_I2C(void)
{
light_start();
light_writebyte(0x88);
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_waitack();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_writebyte(0x80);
light_waitack();
light_stop();
}
char measurelight(void)
{
int y;
//unsigned char lsb,msb;
y=writediagram(0x01,0x0c);//侧量范围128000
if(y==0)
{
data[7]=0xFF;
data[6]=0xFF;
return 0;
}
else
{
writediagram(0x00,0x00);//复位ADC
writediagram(0x00,0x80);//启动ADC,且为16位
DELAY(20000);
//readdiagram(0x01);
writediagram(0x00,0x08);//将ADC数据放出
//readdiagram(0x00);
// writediagram(0x00,0x88);//16位计数器
// writediagram(0x00,0x08);
data[7]=readdiagram(0x04);
data[6]=readdiagram(0x05);
}
}
/****************************************************
3、空气温湿度函数
****************************************************/
/*void DELAY(uint n)
{
uint tt;
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
}*/
//******************************************************************************
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
//P0DIR=0x08;
P0DIR=0x0c;
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value)
DATA=1; //masking value with i , write to SENSI-BUS
else
DATA=0;
asm("NOP");asm("NOP");asm("NOP");
SCK=1; //clk for SENSI-BUS
asm("NOP");asm("NOP");asm("NOP"); //pulswith approx. 5 us
SCK=0;
}
//DATA=1;
//release DATA-line
asm("NOP");asm("NOP");asm("NOP");
P0DIR=0x08;
asm("NOP");asm("NOP");asm("NOP");
SCK=1; //clk #9 for ack
error=DATA;
asm("NOP");asm("NOP");asm("NOP");//此处error为0,check ack (DATA will be pulled down by SHT11)
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
P0DIR=0x0c;
DATA=1;
return error; //error=1 in case of no acknowledge
}
//----------------------------------------------------------------------------------
unsigned 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;
//P0DIR=0x08;
P0DIR=0x08;
//DATA=1; //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK=1; //clk for SENSI-BUS
if (DATA) val=(val | i); //read bit
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
}
P0DIR=0x0c;
DATA=!ack; //in case of "ack==1" pull down DATA-Line
asm("NOP");asm("NOP");asm("NOP");
SCK=1; //clk #9 for ack
asm("NOP");asm("NOP");asm("NOP"); //pulswith approx. 5 us
SCK=0;
//DATA=1; //release DATA-line
DELAY(5000);
return val;
}
//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
//P0DIR=0x08;
P0DIR=0x0c; //设置I/O口方向
DATA=1;
SCK=0; //Initial state
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
DATA=0;
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
DATA=1;
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
}
//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
//P0DIR=0x08;
P0DIR=0x0c;
DATA=1;
SCK=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{ SCK=1;
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
}
//s_transstart(); //transmission start
}
//----------------------------------------------------------------------------------
char s_softreset(void)
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //reset communication
error+=s_write_byte(RESET); //send RESET-command to sensor
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
//----------------------------------------------------------------------------------
char s_measuretemp(void)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error;
unsigned int i;
s_transstart(); //transmission start
//send command to sensor
s_write_byte(MEASURE_TEMP);
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
DELAY(50000);
P0DIR=0x08;
for (i=0;i<65535;i++)
{
if(DATA==0) break; //wait until sensor has finished the measurement
}
if(DATA)
{
data[2]=0xFF;
data[3]= 0xFF ;
return 0;
}
// or timeout (~2 sec.) is reached
data[2]=s_read_byte(ACK); //read the first byte (MSB)
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
DELAY(10000);
data[3]=s_read_byte(noACK); //read the second byte (LSB)
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
//data[25]=s_read_byte();
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
}
char s_measurehumi(void)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error;
unsigned int i;
s_transstart(); //transmission start
//send command to sensor
s_write_byte(MEASURE_HUMI);
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
DELAY(50000);
P0DIR=0x08;
for (i=0;i<65535;i++)
{
if(DATA==0) break; //wait until sensor has finished the measurement
}
if(DATA)
{
data[4]=0xFF;
data[5]= 0xFF ;
return 0;
}
// or timeout (~2 sec.) is reached
data[4] =s_read_byte(ACK); //read the first byte (MSB)
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
data[5]=s_read_byte(noACK); //read the second byte (LSB)
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
//data[26]=s_read_byte();
asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
}
//----------------------------------------------------------------------------------
void measuretemphumi()
//----------------------------------------------------------------------------------
// sample program that shows how to use SHT11 functions
// 1. connection reset
// 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
// 3. calculate humidity [%RH] and temperature [癈]
// 4. calculate dew point [癈]
// 5. print temperature, humidity, dew point
{ //DELAY(10000);
s_connectionreset();
//DELAY(50000);
s_measuretemp();
s_connectionreset();
//DELAY(50000);
s_measurehumi();
//DELAY(50000);
//s_connectionreset();
}
/****************************************************
4、 土壤水分函数
****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -