logo资料库

2561标准驱动程序代码.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
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();
分享到:
收藏