|
2楼
楼主 |
发表于 2011-5-31 22:01:04
|
只看该作者
#include "include.h"
#define system_clock 16
#define SDA_1 P2OUT |= BIT4//SDA = 1
#define SDA_0 P2OUT &= ~BIT4//SDA = 0
#define SCL_1 P2OUT |= BIT3//SCL = 1
#define SCL_0 P2OUT &= ~BIT3 //SCL = 0
#define DIR_IN P2DIR &= ~BIT4 //I/O 口为输入
#define DIR_OUT P2DIR |= BIT4//SDA 输出数据
#define SDA_IN (P2IN & 0x10)//SDA 输出数据
#define TIME 5 //I2C 时序延时时间
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
unsigned int a[50];
unsigned char datalow,datahigh;
unsigned int ADCResult;
unsigned int uiSendDataBuffer[8];
unsigned int uiReceiveDataBuffer[8];
unsigned char ack;
char paTable[8] = {0x17,0x1c,0x26,0x57,0x60,0x85,0xc8,0xc0};//cc1100对应功率值-20,-15,-10,-5,0,5,7,10
char paTableLen = 7;
char txBuffer[64]={0};
char rxBuffer[63]={0};
unsigned int i;
void Delayx3u(unsigned int x);
void Delay(unsigned int x);
unsigned char ID=1; //节点号位5号;
unsigned char flag=1,data_pointer=1;
void blinkRed(void); //红灯闪函数声明;
void blinkGreen(void); //红灯闪函数声明;
void RF_send_int(unsigned char x);
void Start(void)
{
DIR_OUT;
SDA_1;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SDA_0;
Delayx3u(4);
SCL_0;
Delayx3u(2);
}
void Stop(void)
{
DIR_OUT;
SDA_0;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SDA_1;
Delayx3u(2);
}
/*=================================================================
//字节数据传送函数
//函数原型: void send_byte(uchar c);
//Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态
// 位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0
// 表示被控器无应答或损坏。
==================================================================*/
void send_byte(unsigned char c)
{
DIR_OUT;
unsigned char bit_count;
for (bit_count=0;bit_count<8;bit_count++)
{
SCL_0;
if (((c<<bit_count)&BIT7)==1) SDA_1;
else SDA_0;
Delayx3u(4);
SCL_1;
Delayx3u(4);
}
Delayx3u(2);
SCL_0;
Delayx3u(2);
DIR_IN;
//SDA_1;
Delayx3u(2);
SCL_1;
Delayx3u(4);
if(SDA_1)
blinkRed();
else
blinkGreen();
SCL_0;
Delayx3u(2);
}
/*==================================================================
字节数据接收函数
函数原型:uchar receive_byte();
FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
===================================================================*/
unsigned char receive_byte()
{
unsigned char retc,bit_count;
retc=0;
DIR_IN;
for (bit_count=0;bit_count<8;bit_count++)
{
SCL_1;
Delayx3u(20);
retc =(retc<<1);
if(SDA_1)
{
retc = retc+1;
SDA_0;
}
else retc += 0;
SCL_0;
SDA_0;
Delayx3u(20);
}
return (retc);
}
//写tsl2561 byte
void WriteByte(unsigned char Command1,unsigned char Data)
{
Start();
send_byte(0x52); ////SlaveAddress=0x39<<1+1
Delayx3u(50);
send_byte(Command1);
Delayx3u(50);
send_byte(Data);
Delayx3u(50);
Stop();
}
///读tsl2561 byte
unsigned char ReadByte(unsigned char Command3)
{
unsigned char receivedata;
Start();
send_byte(0x52); ////SlaveAddress=0x39<<1+1写命令
Delayx3u(50);
send_byte(Command3);
Delayx3u(50);
Start();
send_byte(0x53); ////SlaveAddress=0x39<<1+0读命令
Delayx3u(50);
receivedata=receive_byte();
DIR_OUT;
/*SCL_0;
SDA_0;
Delayx3u(2);
SCL_1;
Delayx3u(2);
SCL_0;*/
Stop();
Delayx3u(20);
return(receivedata);
}
/////////////////////////////////////////////////////////////////////
void Config(void) //配置tsl2561
{
WriteByte(0x81,0x01);//gain(1x),integration time of 402ms
WriteByte(0x86,0x01);//interrpt is level style, every ADC cycle generate one interrupt.
}
void start_tsl2561(void) ///开始转换
{
WriteByte(0x80,0x03);
}
void stop_tsl2561(void) //停止转换
{
WriteByte(0x80,0x00);
}
unsigned int ReadADCResult(void) //ADC结果是channel 0.
{
datalow =ReadByte(0x8C);
datahigh = ReadByte(0x8D);
ADCResult=(datahigh<<8)+datalow;
return(ADCResult);
} |
|