⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_16bit.c

📁 基于430单片机的串口程序
💻 C
字号:

#include "I2C_16BIT.H"



void init(void)
{
      Init_WDT();
	_DINT();
	Init_Uart();
        Init_Timer();
	KillDog;	// clear WDT 
        Init_AD();
	_EINT();
        FOCUS_IDLE;              //控制调焦电机
}
void Init_WDT(void)
{
    StartDog;                    // WDT 1000ms, ACLK
}
void Init_Timer(void)
{
	CCR0 = 10485;
	CCTL0 &= (~CCIE);
}
void Init_Uart(void)
{
	P3SEL |= (BIT4 + BIT5);		//P3.4,5 UART option select
        BCSCTL1 |= DIVA_3;              // ACLK= LFXT1CLK/8
	ME2 |= (UTXE0 + URXE0);		//enable txd and rxd
	UCTL0 |= CHAR;			//8-bit characters
	UTCTL0 |= SSEL1;		//UCLK = SMCLK
	UBR00 = 0x36;                   // 19200 from 1Mhz
	UBR10 = 0x00;                   //
	UMCTL0 = 0XB5;//0x6B;                  // Modulation
	UCTL0 &= (~SWRST);		//Initialize USART state machine
	IE2 |= URXIE0;			//enable rxd interrupt
	CCTL2 = CM_1 + CCIS_1 + CAP + CCIE;       // CAP, ACLK, interrupt
	TACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clear
}

void Init_AD(void)
{
  ADC10CTL1 = INCH_1+ADC10DIV_3;                     // Temp Sensor ADC10CLK/4
  ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON ; //REF1_5V 
  ADC10AE |= 0x02;                          // P2.1 ADC10 option select
}
float GetSysVoltage(void)
{
    int long temp=0,i=0;
    float tempt=0.0;
    for(i=0;i<32;i++)
    {
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
    while (ADC10CTL1 & ADC10BUSY); 
    temp += ADC10MEM;
    }
    temp/=32;
    tempt=(temp*18)/1024.0; 
  return(tempt);
}

void Delay(unsigned long cont)
{
 	unsigned long i;
	for (i = 0; i < cont; i++)
        {
          ;
        }
 
}
//===================================================================================================//
//延时子程序
void I2C_Delay()
{
	unsigned char i;
	for (i = 0; i < I2C_TIME; i++){;}

}
//===================================================================================================//
//I2C总线停止信号
void I2C_Stop(void)
{
	//负周期
	SCLK_LOW;
	I2C_Delay();
	SDOUT_LOW;
	
	I2C_Delay();
	
	//正周期
	SCLK_HIGH;
	I2C_Delay();
	
	//在正周期内产生一个上升沿
	SDOUT_HIGH;
	I2C_Delay();
	SDOUT_LOW;
	I2C_Delay();
	SDOUT_HIGH;
	I2C_Delay();
}


//===================================================================================================//
//I2C总线发送一个字
unsigned int I2C_transmit_word(unsigned int data)
{
	unsigned int receive_data = 0;
	unsigned int transmit_data = data;
	unsigned char j;
	for(j = 0; j < 5; j++)
	{
		//发送十六位数据
		for(int i = 0; i < 16; i ++)
		{
			receive_data = receive_data >> 1;
			receive_data = receive_data + I2C_transmit_bit(transmit_data);
			transmit_data = transmit_data >> 1;
		}
		
		//判断是否传输正确
		if(receive_data == data)
		{
			I2C_transmit_bit(BIT0);
			j = 5;//传输正确,跳出循环
		}
		else
		{
			I2C_transmit_bit(0x00);
		}
		I2C_Stop();
		
	}
	return receive_data;
}

//===================================================================================================//
//I2C总线发送一个BIT
unsigned int I2C_transmit_bit(unsigned int data)
{
	unsigned int receive_data;
	
	SCLK_LOW;
	I2C_Delay();
	if((data & BIT0) == BIT0)
	{
		SDOUT_HIGH;
	}
	else
	{
		SDOUT_LOW;
	}
	I2C_Delay();
	
	
	SCLK_HIGH;
	I2C_Delay();
	
	SCLK_LOW;
	I2C_Delay();
	if(SDIN == BIT0)
	{
		receive_data = BITF;
	}
	else
	{
		receive_data = 0;
	}
	I2C_Delay();
	
	return receive_data;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -