📄 1110.c
字号:
#include "reg52.h"
#include "intrins.h"
//----------------ADS1110地址、配置字-----------------//
#define ADS1110_WR_ADDRESS 0x92 //1001 001 0 写
#define ADS1110_RD_ADDRESS 0x93 //1001 001 1 读
#define ADS1110_CONFIG_REG 0x8d //连续转换模式,16bit精度,PGA=1
#define uchar unsigned char
#define uint unsigned int
sbit ADS1110_SDA = P1^3; //模拟I2C数据传输位
sbit ADS1110_CLK = P1^2; //模拟I2C时钟控制位
sfr P1M0=0X91;
sfr P1M1=0X92;
bit send_flag;
uchar b;
/*******************************************************************************
*******************
名称: ads1110Start(void)
功能: ADS1110 I2C Start
********************************************************************************
******************/
void ads1110Start(void)
{
ADS1110_SDA=1;
ADS1110_CLK=1;
_nop_();
_nop_();
ADS1110_SDA=0;
_nop_();
_nop_();
ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称: ads1110Stop(void)
功能: ADS1110 I2C Stop
********************************************************************************
******************/
void ads1110Stop(void)
{
ADS1110_SDA=0;
_nop_();
_nop_();
ADS1110_CLK=0; // -----------结束I2C总线,即发送I2C结束条件.
_nop_();
_nop_();
ADS1110_CLK=1;
ADS1110_SDA=1;
}
/*******************************************************************************
*******************
名称: waitAck(void)
功能: ADS1110 I2C 等待ack
********************************************************************************
******************/
uchar waitAck(void)
{
uchar data errtime;
errtime=40;
ADS1110_SDA=1;
while(ADS1110_SDA) //-----------等待ADS1100应答
{
errtime--;
if(!errtime)
{
ads1110Stop();
return 0x00;
}
}
ADS1110_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
ADS1110_CLK=0;
return 0xff;
}
/*******************************************************************************
*******************
名称: void sendAck(void)
功能: 向ADS1110 I2C 发送 ack
********************************************************************************
******************/
void sendAck(void)
{
ADS1110_SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
ADS1110_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称: void sendNotAck(void)
功能: 向ADS1110 I2C 不发送 ack
********************************************************************************
******************/
void sendNotAck(void)
{
ADS1110_SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
ADS1110_CLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称: void ads1110SendByte(BYTE sendData)
功能: 向ADS1110 I2C 发送1个字节
********************************************************************************
******************/
void ads1110SendByte(uchar sendData)
{
uchar data i;
ADS1110_CLK=0;
for( i=0; i<8;i++ )
{
if(sendData & 0x80) ADS1110_SDA=1;
else ADS1110_SDA=0;
_nop_();
_nop_();
sendData<<=1;
ADS1110_CLK=1; //置时钟线为高,通知被控器开始接收数据位
_nop_();
_nop_();
ADS1110_CLK=0;
}
}
/*******************************************************************************
*******************
名称: uchar ads1110ReceiveByte(void)
功能: ADS1110 I2C 接收1个字节
********************************************************************************
******************/
uchar ads1110ReceiveByte(void)
{
uchar data i,receiveData;
receiveData=0;
ADS1110_CLK=0;
for(i=0;i<8;i++ )
{
ADS1110_CLK=1; //置时钟线为高使数据线上数据有效
_nop_();
_nop_();
receiveData<<=1;
ADS1110_SDA=1;
if(ADS1110_SDA==1)
receiveData|=1; //读数据位,接收的数据位放入ucRet中
ADS1110_CLK=0;
_nop_();
_nop_();
}
return(receiveData);
}
/*******************************************************************************
*******************
名称: void ads1110Config(void)
功能: 对ADS1110进行配置
********************************************************************************
******************/
void ads1110Config(void)
{
ads1110Start();
ads1110SendByte(ADS1110_WR_ADDRESS);
waitAck();
ads1110SendByte(ADS1110_CONFIG_REG);
waitAck();
ads1110Stop();
}
/*******************************************************************************
*******************
名称: 读取ADS1100数据子程序
功能:
********************************************************************************
******************/
uint RD_ADS()
{
uchar data temp00;
uint W_B1byte_low,W_B1byte_high,W_B1_word;
ads1110Start(); //-----------启动I2C总线,即发送I2C起始条件.
ads1110SendByte(ADS1110_RD_ADDRESS); //-----------寻址ADS1110(ED0)
temp00=waitAck(); //-----------等待ADS1100应答
if(temp00) //如果应答正确
{
W_B1byte_high=ads1110ReceiveByte(); //-----------读数据 高字节
sendAck(); //主机应答
W_B1byte_low=ads1110ReceiveByte(); //-----------读数据 低字节
sendAck(); //主机应答
temp00=ads1110ReceiveByte(); //读配置字
sendAck();
// sendNotAck(); //主机不应答
ads1110Stop();
W_B1_word= (W_B1byte_high<<8)+ W_B1byte_low;
if(W_B1_word>0x7fff) //>7fffH表示为负数
W_B1_word=0;
return W_B1_word;
}
else return 0x0000;
}
/*******************************************************************************
*******************
名称: 串口发送子程序
功能:
********************************************************************************
******************/
/*void T0_initial(void)
{
TMOD=0x01;
TR0=0;
TH0=0x15;
TL0=0xa0;
TR0=1;//启动定时器/计数器0
ET0=1;//允许定时器中断
EA=1;//开中断
}
//************定时器T0中断程序******************
void clock_T0()interrupt 1 using 2
{
TR0=0;
TH0=0x15;
TL0=0xa0;
b++;
if(b>200)
{
send_flag=1;
if(b>205)
{b=0;}
}
TR0=1;
} */
void delay(void)
{
unsigned char m,n;
for(m=5000;m>0;m--)
for(n=1000;n>0;n--);
}
void sendbyte(uint one_byte)
{
TI=0;
SBUF=one_byte;
while (TI==0);
TI=0;
}
void init_uart(void)
{
ES=0;
TMOD=0x21; //定时器1,内部RC
SCON=0x50; //串口方式1,波特率4800
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
}
main()
{
uint result;
unsigned char res[5];
P1M0=0;
P1M1=0;
ads1110Config();
init_uart();
//T0_initial();
while(1)
{
result=RD_ADS();
res[0]=result/10000+0x30;
res[1]=(result%10000)/1000+0x30;
res[2]=(result%1000)/100+0x30;
res[3]=(result%100)/10+0x30;
res[4]=result%10+0x30;
sendbyte(res[0]);
delay();
delay();
delay();
sendbyte(res[1]);
delay();
delay();
delay();
sendbyte(res[2]);
delay();
delay();
delay();
sendbyte(res[3]);
delay();
delay();
delay();
sendbyte(res[4]);
delay();
delay();
sendbyte(0xaa);
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -