📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
unsigned char receive_data=0;
/*void interrupt IIC_receive()
{
IICS_IICIF=1;
receive_data=IICD;
} */
/*void Init_ICS()
{
ICSTRM=NV_ICSTRM;
ICSC1=0X04;
ICSC2=0X40;
ICSSC=0X00;
} */
/***************发送数据*****************************/
void IIC_send_data(unsigned char send_data)
{
IICD=send_data;
}
/*****************************************************/
/***************IIC接收使能*****************************/
void IIC_receive_enable()
{
IICC_TX=0; //接收模式
IICC_TXAK=1; //没有送出应答信号
}
/*******************************************************/
/***************写从寄存器数据***************************/
void IIC_REG_Write(uchar Write_address,uchar Write_value) //S313写地址为B0H(包括一个读写位)
{
IICC_TX=1;
IICD=0B0H; //主发送从地址+读写位W
while(IICS_BUSY)
{
while(!IICS_IICIF);
IICS_IICIF=1;
while(IICS_RXAK);
IIC_send_data(Write_address); //发送写到从寄存器地址
while(!IICS_IICIF);
IICS_IICIF=1;
while(IICS_RXAK);
IIC_send_data(Write_value); //发送写到从寄存器上的数据
while(!IICS_IICIF);
IICS_IICIF=1;
while(IICS_RXAK);
IICC_MST=0;
}
}
/********************************************************/
/***************读从寄存器数据*****************************/
void IIC_REG_Read(uchar Read_address) //S313读地址为B1H (包括一个读写位)
{
IICC_TX=1; //发送模式
IICD=0B0H; //主发送从地址+读写位W
while(IICS_BUSY) //总线忙,STOP信号时清除
{
while(!IICS_IICIF);
IICS_IICIF=1;
while(IICS_RXAK);
IIC_send_data(Read_address);
while(!IICS_IICIF);
IICS_IICIF=1;
while(IICS_RXAK);
IICC_RSTA=1; //产生REPEATED START信号
IIC_receive_enable(); //IIC接收使能
IICD=0B1H; //主发送从地址+读写位R
while(!IICS_IICIF); //等待字节传输结束
IICS_IICIF=1; //清IIC中断标志
while(IICS_RXAK); //检查RXAK接收应答位
receive_data=IICD; //空读IICD
while(!IICS_IICIF);
IICS_IICIF=1;
IICC_MST=0; //产生STOP信号
receive_data=IICD; //读从寄存器数据
return receive_data; //返回从寄存器数据值
}
}
/********************************************************/
/****************IIC初始化*******************************/
void IIC_Init()
{
IICC_IICEN=1; //iic使能
IICC_IICIE=1; //iic中断请求使能
IICC_MST=1; //主模式
IICF=0x4b; //MULT 01---> mul=02,ICR=0x0b(001011),SDA=1.125us,baud rate=bus clock/(mul*SCL分频数)=100kbps
}
/********************************************************/
/*******************延时子程序***************************/
void WAIT()
{
uint i;
for(i=0;i<1000;i++);
}
/********************************************************/
/****************获取传感器值****************************/
void SENSOR_VALUE_ACQUIRE() {
//获取ADC值
IIC_REG_Write(ACQ,0X02H); //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
while(IIC_REG_Read(ACQ)); //ACQ为0时读ADCR,ADCG,ADCB
data_temp1=IIC_REG_Read(ADCR_); //读ADCR,ADCG,ADCB寄存器值
data_temp2=IIC_REG_Read(ADCG); //地址分别为44H,43H,42H
data_temp3=IIC_REG_Read(ADCB);
//计算相对值
SENSR=data_temp1-OFFSET_R;
SENSG=data_temp1-OFFSET_G;
SENSB=data_temp1-OFFSET_B; */
}
/********************************************************/
/***************传感器增益优化***************************/
void SENSOR_GAIN_OPTIMIZATION()
{
XRST=0; //S313硬件复位
WAIT(); //等待复位完成
IIC_REG_Write(SETUP0,0X01H); //设置开始寄存器SETUP0-4
IIC_REG_Write(SETUP1,0X01H); //寄存器地址分别为03H,04H,0CH,0DH,0EH
IIC_REG_Write(SETUP2,0X01H);
IIC_REG_Write(SETUP3,0X01H);
IIC_REG_Write(SETUP4,0X01H);
/*******以下部分复位后有默认值,故可不设置**********/
/*IIC_REG_Write(PDASR,0X07H); //写增益寄存器选择光电二极管大小,这里选择3/4 SIZE
IIC_REG_Write(PDASG,0X07H); //寄存器地址分别为0BH,0AH,09
IIC_REG_Write(PDASB,0X07H);
IIC_REG_Write(TINTR,0X07H); //写增益寄存器选择integration时间,这里选择默认值07H即integration时间为8
IIC_REG_Write(TINTG,0X07H); //寄存器地址分别为11H,10H,0FH
IIC_REG_Write(TINTB,0X07H); */
IIC_REG_Write(ACQ,0X02H); //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
while(IIC_REG_Read(ACQ)); //ACQ为0时读ADCR,ADCG,ADCB
data_temp1=IIC_REG_Read(ADCR_); //读ADCR,ADCG,ADCB寄存器值
data_temp2=IIC_REG_Read(ADCG); //地址分别为44H,43H,42H
data_temp3=IIC_REG_Read(ADCB);
//判断ADC值是否小于191,大于191就必须继续做调整
if(data_temp1<191&&data_temp2<191&&data_temp3<191)
return;
//else //error=1,出现出错提示
}
/********************************************************/
/*****************传感器操作*****************************/
void SENSOR_OPERATION()
{
XRST=0; //S313硬件复位
WAIT(); //等待复位完成
IIC_REG_Write(SETUP0,0X01H); //设置开始寄存器SETUP0-4
IIC_REG_Write(SETUP1,0X01H); //寄存器地址分别为03H,04H,0CH,0DH,0EH
IIC_REG_Write(SETUP2,0X01H);
IIC_REG_Write(SETUP3,0X01H);
IIC_REG_Write(SETUP4,0X01H);
//以下部分复位后有默认值,故可不设置
/*IIC_REG_Write(PDASR,0X07H); //写增益寄存器选择光电二极管大小,这里选择3/4 SIZE
IIC_REG_Write(PDASG,0X07H); //寄存器地址分别为0BH,0AH,09
IIC_REG_Write(PDASB,0X07H);
IIC_REG_Write(TINTR,0X07H); //写增益寄存器选择integration时间,这里选择默认值07H即integration时间为8
IIC_REG_Write(TINTG,0X07H); //寄存器地址分别为11H,10H,0FH
IIC_REG_Write(TINTB,0X07H); */
//提示:为获取OFFSET,请关闭光源操作,
IIC_REG_Write(ACQ,0X02H); //通过写ACQ=02H获取ADC值,ACQ寄存器地址为02H
while(IIC_REG_Read(ACQ)); //ACQ为0时读ADCR,ADCG,ADCB
OFFSET_R=IIC_REG_Read(ADCR_); //读ADCR,ADCG,ADCB寄存器值
OFFSET_G=IIC_REG_Read(ADCG); //地址分别为44H,43H,42H
OFFSET_B=IIC_REG_Read(ADCB);
//获取传感器值
SENSOR_VALUE_ACQUIRE();
}
/********************************************************/
void main(void)
{
// Init_ICS();
EnableInterrupts; /* enable interrupts */
/* include your code here */
for(;;)
{
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -