ads1115程序详细解说
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//说明:iic.h采用的是模拟iic,和驱动24c02相似,故不再重复,lcd12864.h是串行通信方式,也不再啰嗦,这是主程序。
#include "iic.h"
#include "lcd12864.h"
uchar a[10]="0123456789";
uchar b[16]="The V olt: . V";
uchar table[4],ReadBuffer[16],buffer[16];
uchar table1[16]=" 欢迎光临";
uchar table3[16]="当前电压是如下:";
uchar table2[16]="创新实验室sj618";
uchar table0[16]= " V";
unsigned long sum = 0;
uint real;
//配置ads1115
void Confige1115 ()
{
unsigned char i;
table[0] = 0x90;//CMD_Write;
table[1] = 0x01;//指向配置寄存器
table[2] = 0xC2;//设置配置寄存器的高八位1100 0101,即AINp=AIN0,AINn=GND;满量程FS=+-4.096;连续转换模式
table[3] = 0xe3;//设置配置寄存器的低八位1100 0101,即
start();//发送起始信号
for(i=0;i<4;i++)
{
shout(table[i]);//将table里面的数写入ads1115
_NOP();
}
stop();//发送停止信号
}
//指向ADS1115指针寄存器用于准备读取数据
void PointRegister (void)
{
unsigned char i;
table[0] = 0x90;//写
table[1] = 0x00;//指针指向转换寄存器
start();//发送起始信号
for(i=0;i<2;i++)
{
shout(table[i]);//将table里面的数写入ads1115
delay(5);
}
stop();//发送停止信号
}
//读转换寄存器里面的值
uint read()
{
uint result,resulth,resultl;
start();
shout(0x91);
resulth = shin(); //高八位
resultl = shin(); //底八位
stop();
result=(resulth<<8)|resultl;
if(result>0x7fff)
result=~result+1;//用于测量负电压,负电压从8000~ffff,负电压与正关于0有类似对称关系,按位取反后+1相同
return result;
}
//获取最终模数转换之后的结果
uint getad()
{
uint value;
Confige1115();
_NOP();
PointRegister();
_NOP();
value=read();
return value;
}
void main()
{
// Stop watchdog timer to prevent time out reset
uchar j,i,ptr[4];
WDTCTL = WDTPW + WDTHOLD;
//使用外部高频晶体振荡器
BCSCTL1&=~XT2OFF;
do{
IFG1&=~OFIFG;
for(j=0XFF;j>0;j--);
}while((IFG1&OFIFG));
BCSCTL2|=SELM_2;
init_lcd();//初始化液晶屏
delay(10);
while(1)
{
for(i=0;i<16;i++)
sum+= getad();//将ad转换的值赋给sum,取16次转换的平均值
sum>>=4;//左移相当于除以16
real=(3.3*sum/32768)*1208-90;//4.096*(2/3)=2.731,因为参考电压3.3/2.731=1.2084,再扩大1000倍便于显示
//对于AINn不是GND的情况,+FS最高为7fff,最低-FS为1000,只显示0~+FS只除以32768,
//90用于误差矫正
ptr[0] = real / 1000; //最高位
ptr[1] = (real - ptr[0]*1000)/100;//次高位
ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;//次低位
ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10); //最低位
b[10]=a[ptr[0]];
for(i=1;i<4;i++)
b[i+11]=a[ptr[i]];//b[11]显示“V”符号
display_12864(1,0,table1);
display_12864(2,0,table2);
display_12864(3,0,table3);
display_12864(4,0,b);
}
}