📄 main.c
字号:
//#include "18b20.h"
//#include "LCD128_64.h"
/****************************************************
1、 光照宏
****************************************************/
char data[];
#include "ioCC2430.h"
//float num;
#define uint unsigned int
#define DATA P0_2
#define SCK P0_3
#define LIGHTADRR 0x89
#define LIGHTADRW 0x88
////////////////////////////////////////////////////////////////////////////////////////////
/****************************************************
2、 空气温度湿度宏
****************************************************/
enum {TEMP,HUMI};
#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
//#include "hal.h"
/****************************************************
3、 土壤温度宏
****************************************************/
#define CL_DQ P1_2=0
#define SET_DQ P1_2=1
#define SET_OUT P1DIR|=0x04
#define SET_IN P1DIR&=~0x04
#define IN_DQ P1_2
#define uint16 unsigned int
#define BYTE unsigned char
/****************************************************
4、 土壤水分宏
****************************************************/
/****************************************************
1、 土壤温度函数
****************************************************/
//void Delay_1us(void);
void Delay_nus(uint16 n) ;
void write_1820(unsigned char x) ;
unsigned char read_1820(void);
unsigned char init_1820(void) ;
char read_data(void);
unsigned char id[8];
unsigned char sensor_data_value[2];
unsigned char flag;
void Delay_nus(uint16 s) {
while (s--)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
BYTE init_1820(void)
{
unsigned int pp;
//cli();
SET_OUT;
SET_DQ;//输出1
CL_DQ;
Delay_nus(550);//拉低一段时间
SET_DQ;//释放
SET_IN;//输入
Delay_nus(40); //释放总线后等待15-60us
pp=IN_DQ;
//while(IN_DQ) {;}//等待回复
if(pp)
{
data[12]=0xFF;
data[13]=0xFF;
return 0;
}
Delay_nus(240);//回复的低电平在60到240us
SET_OUT;
SET_DQ;//回到初始DQ=1;
return 1;
}
void write_1820(unsigned char x)
{ unsigned char m;
SET_OUT;
for(m=0;m<8;m++)
{
CL_DQ;
if(x&(1<<m)) //写数据,从低位开始
SET_DQ;
else
CL_DQ;
Delay_nus(40); //15~60us
SET_DQ;
}
//SET_OUT;
SET_DQ;
}
unsigned char read_1820()
{ unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CL_DQ;
SET_DQ;
SET_IN;
k=IN_DQ; //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
Delay_nus(70); //60~120us
SET_OUT;
}
return (temp);
}
//搜索ID
char read_data(void)
{
unsigned int j,k;
unsigned char temh,teml;
unsigned char a,b,c;
k=init_1820(); //复位18b20
if(k)
{
write_1820(0xcc); // 发出转换命令 搜索器件
write_1820(0x44); //启动
for(j=20;j>1;j--)
Delay_nus(50000);
init_1820();
write_1820(0xcc);
//match_rom(serial); //匹配
write_1820(0xbe);
data[13]=read_1820(); //读数据
data[12]=read_1820();
return 1;
}
else
return 0;
}
/****************************************************************/
/****************************************************
2、 光照函数
****************************************************/
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++);
}
void light_start(void)
{
//P1DIR=0x02;//将P0_0和P1_1设置为输出
//P0DIR=0x01;
P0DIR=0x0c;
DATA=1;
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
DATA=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
}
void light_stop(void)
{
//P1DIR=0x02;//将P0_0和P1_1设置为输出
//P0DIR=0x01;
P0DIR=0x0c;
DATA=0;
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
DATA=1;
}
void light_writebyte(unsigned char ch)
{
unsigned char i=8;
//P1DIR=0x02;//将P0_0和P1_1设置为输出
//P0DIR=0x01;
P0DIR=0x0c;
while(i--)
{
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
if(ch&0x80)
DATA=1;
else
DATA=0;
ch<<=1;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
}
SCK=0;//在地八个时钟后,
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
}
int light_waitack(void)
{
unsigned char errtime=255;
unsigned int i;
//P1DIR=0x02;
//P0DIR=0x00;
P0DIR=0x08;
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
for (i=0;i<65535;i++)
{
if(DATA==0)
break;
}
if(DATA)
return 0;
P0DIR=0x0c;//在第九个时钟信号后,lightsensor会释放对SDA的控制,如果不在此时将控制权交给cpu,在第九个时钟信号的高电平后,电源会给P0_0口一个高电压
SCK=0;
return 1;
}
int light_waitack2(void)
{
unsigned char errtime=255;
unsigned int i;
//P1DIR=0x02;
//P0DIR=0x00;
P0DIR=0x08;
SCK=0;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
for (i=0;i<65535;i++) if(DATA==0) break;
//P0DIR=0x01;//在第九个时钟信号后,lightsensor会释放对SDA的控制,如果不在此时将控制权交给cpu,在第九个时钟信号的高电平后,电源会给P0_0口一个高电压
SCK=0;
return 1;
}
void notack(void)
{
//P1DIR=0x02;
P0DIR=0x08;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=1;
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
SCK=0;
//P0DIR=0x01;
P0DIR=0x0c;
DATA=0;
}
unsigned char readbyte(void)
{
//P1DIR=0x02;
//P0DIR=0x00;
P0DIR=0x08;
unsigned char i,val=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK=1; //clk for SENSI-BUS
if (DATA) val=(val | i); //read bit
SCK=0;
}
return val;
}
unsigned char writediagram(unsigned char regadr,unsigned char data)
{
int x;
light_start();
light_writebyte(0x88);//设备地址
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
x=light_waitack();
if(x==0)
return 0;
else
{
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();
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
light_writebyte(data);//写的数值
asm("NOP");asm("NOP");asm("NOP");
asm("NOP");asm("NOP");asm("NOP");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -