📄 ads1110.c
字号:
// ************************************
// ADS1110 驱动
// 输出码 = -1 * 最小码 * PGA * (Vin+ - Vin-)/2048
// 配置寄存器: BIT 7 6 5 4 3 2 1 0
// NAME ST/DRDY 0 0 SC DR1 DR0 PGA1 PGA0
// ST/DRDY: 写1开始单周期转换 读数据时为0有新数据,为1是旧数据
// SC:为1时是单周期转换方式,为0时是连续转换方式
// 数据速率控制:DR1、DR0 00:240 01:60 10:30 11:15 (缺省设置)
// PGA:增益设置 PGA1、PGA0 00:1 01:2 10:4 11:8
// ************************************
// 名称:-0.3 ~2.48v电压表
// 作者:黄煜龙
// 完成日期:2008-08-12
#include<at89x52.h>
sbit SDA = P1^1;
sbit SCL = P1^2;
sfr PortCode = 0x80; // P0
sfr PortBit = 0xa0; // P2
unsigned char TMR1H;
unsigned char TMR1L;
unsigned char TMR2;
unsigned char code displaybit[9] = {
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff}; //数码管位分布(自左至右)
unsigned char code displaycode[] = {
0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //数码管字段0,1,2,3,4,5,6,7,8,9
void delay_dis(unsigned int Ms)
{
unsigned char i;
for( ; Ms != 0; Ms-- )
{
for(i = 1; i != 0; i-- );
}
}
void Display(unsigned int dat,unsigned char DotPosition,unsigned char ClearZeroFlag)
{
unsigned char i;
for(i = 0; i != 8; i++)
{
PortBit = 0xFF; //消除重影
if(i == DotPosition) // 小数点处理
{
PortCode = (displaycode[(dat%10)]|0x01);
}
else PortCode = displaycode[dat%10];
PortBit = displaybit[i];
if(ClearZeroFlag&&(!dat)&&(i>DotPosition)) return;
dat /= 10;
delay_dis(255);
}
}
void delay_1(void) //延时
{
unsigned int j;
for(j=5535;--j;) continue;
}
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
}
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
SDA = 1;
}
unsigned char IIC_Ask(bit i) // i 为1时是检查应答
{
bit ask;
if (i)
SDA = 1;
else
SDA = 0;
SCL = 1;
ask = SDA;
SCL = 0;
return ask;
}
void SendByte(unsigned char dat)
{
unsigned char i;
for (i = 8; i != 0; i--)
{
SDA = (dat & 0x80);
SCL = 1;
dat <<= 1;
SCL = 0;
}
}
unsigned char ReadByte(void)
{
unsigned char i,dat;
dat = 0;
SDA = 1;
for (i = 8; i != 0; i --)
{
SCL = 1;
SCL = 1;
dat <<= 1;
if (SDA)
{
dat++;
}
SCL = 0;
}
return dat;
}
void ADS110_Write(unsigned char outdat)
{
IIC_Start();
SendByte(0x94); // ED0 0x90 ED2 0x94
while(IIC_Ask(1)); //等待应答
SendByte(outdat);
while(IIC_Ask(1)); //等待应答
IIC_Stop();
}
void ADS110_Read(void)
{
IIC_Start();
SendByte(0x95);
while(IIC_Ask(0)); //等待应答
TMR1H=ReadByte(); // 读高8位
IIC_Ask(0); //连续读
TMR1L=ReadByte(); //读低8位
IIC_Ask(0); //连续读
TMR2=ReadByte(); //读配置字
IIC_Ask(1);
IIC_Stop();
}
void main(void)
{
unsigned int Volt,Rcnt;
ADS110_Write(0x8C);
delay_1();
ADS110_Read();
while(1)
{
if(Rcnt == 25)
{
ADS110_Read();
Rcnt = 0;
}
Rcnt++;
Volt=TMR1H*256;
Volt|=TMR1L;
if(Volt > 0xf000) Volt = 0;
else if(2500>Volt) Volt+=30;
else {Volt += 10;Volt*=1.005;}
Display(Volt/16,3,1);// 转换成电压值
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -