0x04
0x08
0x40
// SDA on P3.2
// SCL on P3.3
// rde on P3.5
//0x29<<1
//写
//读
//宏定义信息 FLASH 存储器 B 段地址
#include
#include
//****************************************************************************//
#define FLASH_ADDRESS 0x01000
//=====================================================================
=======//
#define SDA
#define SCL
#define RDE
//=====================================================================
====== //
#define TSL2561_ADDR 0x52
#define TSL2561_WR
0x00
0x01
#define TSL2561_RD
//=====================================================================
====== //
unsigned char Ack_Flag;
unsigned int R_word;
unsigned int out_word;
//=====================================================================
============
unsigned char Data[4];
unsigned char BuffRS;
unsigned char RXDNUM;
unsigned char RXDNOW;
unsigned char NEWRXD;
unsigned char RXDatatemp[3];
unsigned char DATABYTEL;
unsigned char DATABYTEH;
unsigned int Channel0Value;
unsigned int Channel1Value;
float CH1CH0;
float LUXCH0;
float LUX;
unsigned int LUXValue;
//=====================================================================
============
//=====================================================================
====== //
void Delay(unsigned int m);
void Start(void);//IIC 开始
void Stop(void);//IIC 结束
void Send_Byte(unsigned char Byte);//发送8位数据或命令
void Receive_Byte(void);//读8位
//串口数据个数
//串口数据标志
//串口数据标志
//串口数据缓存
//查询位,被查询设备通过拉低 SDA 来表示收到地址,第九个脉冲
void Ack(void);
void NOAck(void); //不查询
//void I2C_Write(unsigned char addr,unsigned char data);
//void I2C_Read(unsigned char addr);
void Powertsl2561(unsigned char state);// state=0x03开,state=0x00 关
void ReadWORDtsl2561(unsigned char channel);//channel=2选1通道,channel=0 选0通道
void LUXCalculation(void);
void Send_485(void);
//=====================================================================
====== //
void main(void)
{
// Stop watchdog timer
// Set P1.0 to output direction
// P2.0 output
// P2.0 ACLK output
// 8-bit character
// UCLK = ACLK
// 32k/2400 - 13.65
// Modulation
// Enabled USART0 TXD/RXD
// Enabled USART0 RX interrupt
// P3.4,5 = USART0 TXD/RXD
// P3.4 output direction.3.6是控制
// Enable interrupts
// Toggle P1.0 using exclusive-OR
// Toggle P1.0 using exclusive-OR
// Toggle P1.0 using exclusive-OR
//unsigned char g=0;
//WDTCTL = WDTPW + WDTHOLD;
WDTCTL = WDT_ARST_1000;
P2DIR |= 0x20;
P2DIR |= 0x01;
P2SEL |= 0x01;
UCTL0 = CHAR;
UTCTL0 = SSEL0;
UBR00 = 0x0d;
UBR10 = 0x00;
UMCTL0 = 0x6b;
ME2 |= UTXE0 + URXE0;
IE2 |= URXIE0;
P3SEL |= 0x30;
P3DIR |= 0x50;
P3OUT &= ~RDE;
Data[0]=100;
_EINT();
//P3OUT &= ~RDE;
Powertsl2561(0x03);
P2OUT ^= 0x20;
for (;;)
{
//P2OUT ^= 0x20;
//Delay(10000);
//P2OUT ^= 0x20;
WDTCTL = WDT_ARST_1000;
Powertsl2561(0x03);
ReadWORDtsl2561(0);
DATABYTEL=R_word;
ReadWORDtsl2561(1);
DATABYTEH=R_word;
Channel0Value=DATABYTEL+256*DATABYTEH;
ReadWORDtsl2561(2);
DATABYTEL=R_word;
ReadWORDtsl2561(3);
DATABYTEH=R_word;
Channel1Value=DATABYTEL+256*DATABYTEH;
LUXCalculation();
if(NEWRXD==1)
{
if(RXDatatemp[0]==0x00&&RXDatatemp[1]==Data[0])
{
switch(RXDatatemp[2])
{
case 4:
{
Data[3]=LUXValue;
Data[2]=LUXValue>>8;
Data[1]=4;
Send_485();
} break;
default:
{
}; break;
}
}
NEWRXD=0;
}
}
}
/***************************************************************************
// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
//_BIC_SR_IRQ(LPM3_bits);
//P2OUT ^= 0x20;
BuffRS=RXBUF0;
if(BuffRS==0xa5)
{
RXDNOW=0;
NEWRXD=1;
// Clear LPM3 bits from 0(SR)
// Toggle P1.0 using exclusive-OR
//收到结束符号
//关接收状态
//收到新的数据包
}
if(RXDNOW==1)
{
//数据包结收中
RXDatatemp[RXDNUM]=BuffRS;
RXDNUM++;
//接收到缓冲区
//接受数加1
}
if(BuffRS==0xaa)
{
RXDNUM=0;
RXDNOW=1;
}
}
void Send_485(void)
{
unsigned char g=0;
P3OUT |= RDE;
Delay(600);
TXBUF0 =0xAA;
for (g=0;g<4;g++)
{
//数据包开始符
//接收数清零
//在接受数据包状态
// RXBUF0 to TXBUF0
Delay(10);
while ((IFG2 & UTXIFG0) != UTXIFG0);
if(Data[g]==0xAA||Data[g]==0xA5||Data[g]==0xAC)
{
// USART0 TX buffer ready?
TXBUF0 =0xAC;
Delay(10);
while ((IFG2 & UTXIFG0) != UTXIFG0);
TXBUF0 =Data[g]+1;
// USART0 TX buffer ready?
}
else
{
TXBUF0 =Data[g];
// RXBUF0 to TXBUF0
}
}
Delay(10);
while ((IFG2 & UTXIFG0) != UTXIFG0);
TXBUF0 =0xA5;
Delay(10);
while ((IFG2 & UTXIFG0) != UTXIFG0);
TXBUF0 =0x00;
Delay(600);
P3OUT &= ~RDE;
// USART0 TX buffer ready?
// USART0 TX buffer ready?
}
//----------------------------------------------------------------------------------
//*****************************************************************************/
/
//延时
void Delay(unsigned int m)
{
while(m-- > 0);
}
//=====================================================================
=====
void Start(void)//IIC 开始
{
P3OUT &= ~0x0c;//设定 P3.2和 P3.3为低
P3DIR &= ~SCL; //通过选择方向来实现高低电平输出(上拉),选通则输出低,不选通则为
高
Delay(10);
P3DIR &= ~SDA; //SET HIGH LEVEL
Delay(10);
P3DIR |= SDA;
Delay(10);
P3DIR |= SCL;
Delay(10);
//拉低 SCL
//先拉低 SDA。(在 SCL 为高的时候,拉低 SDA)
}
//=====================================================================
=====
void Stop(void)//IIC 结束
{
P3DIR |= SDA;//拉低 SDA
Delay(10);
P3DIR &= ~SCL;//拉高 SCL
Delay(10);
P3DIR &= ~SDA;//在 SCL 为高的时候,拉低 SDA,表示结束
Delay(10);
//P3DIR |= SCL;
}
//=====================================================================
======
void Send_Byte(unsigned char Byte)//发送8位数据或命令
{
int i;
for (i=0;i<8;i++)
{
if(Byte & 0x80)
{
P3DIR &= ~SDA;
}
else
{
P3DIR |= SDA;
}
Delay(10);
P3DIR &= ~SCL;
Delay(10);
P3DIR |= SCL;//下降沿发出数据
Delay(10);
Byte = Byte < 1;
}
}
//=====================================================================
=======
void Ack(void)
{
//查询位,被查询设备通过拉低 SDA 来表示收到地址,第九个脉冲
P3DIR &= ~SDA; //拉高 SDA,设为输入
Delay(10);
P3DIR &= ~SCL; //拉高 SCL
Delay(10);
Ack_Flag = 0;
Delay(10);
if ((P3IN & 0x04))//如果 SDA 没被拉低
{
//标致位
Ack_Flag = 1;
//
}
P3DIR |= SCL;
Delay(10);
}
//=====================================================================
========
void NOAck(void) //不查询
{
P3DIR &= ~SDA;
Delay(10);
P3DIR &= ~SCL;
Delay(10);
P3DIR |= SCL;
Delay(10);
P3DIR |= SDA;
Delay(10);
}
//=====================================================================
============
void Receive_Byte(void)//读8位
{
unsigned char j;
R_word = 0;
P3DIR &= ~SDA;
for(j=0;j<8;j++)
{
P3DIR &= ~SCL;
if(P3IN & 0x04)
{
R_word |= 0x01;
}
else
{
R_word &= 0xFE;
}
Delay(10);
P3DIR |= SCL;
Delay(10);
R_word = R_word < 1;
}
R_word = R_word >>1;
}
//=====================================================================
============
/*void I2C_Write(unsigned char addr,unsigned char data)
{
while (1)
{
Start();
Delay(10);
Send_Byte(0x90);//write a byte :slave device//ad7746写为0x90
Ack();
if (Ack_Flag)
continue;
Delay(10);
Send_Byte(addr);// write a byte :sub address
Ack();
if (Ack_Flag)
continue;
Delay(10);
Send_Byte(data);// write a byte :sub address
Ack();
if(!(Ack_Flag))
break;
}
Stop();
}
//=====================================================================
============
void I2C_Read(unsigned char addr)
{
while(1)
{
Start();
Send_Byte(0x90);//write a byte :slave device//ad7746写为0x90
Ack();
if(Ack_Flag)//若不应答(Ack_Flag=1)继续发(跳回上面)。不执行下面的语句
continue;
Send_Byte(addr);//写要查询的地址
Ack();
if(Ack_Flag)//若不应答(Ack_Flag=1)继续发(跳回上面)。不执行下面的语句
continue;
Start();
Send_Byte(0x91);//write a byte :slave device//ad7746读为0x91
Ack();
if(Ack_Flag)//若不应答(Ack_Flag=1)继续发(跳回上面)。不执行下面的语句
continue;
Receive_Byte();//读取
NOAck();
Stop();
break;
}
}*/
//=====================================================================
============
void Powertsl2561(unsigned char state)// state=0x03开,state=0x00 关
{
while(1)
{
Start();