标题:
自己做的51单片机控制AD7746芯片读取电容值
[打印本页]
作者:
王祖全123
时间:
2017-2-24 10:31
标题:
自己做的51单片机控制AD7746芯片读取电容值
花了一个人月的时间用51单片机来读取AD7746芯片的电容采集程序
本人已作出调试成功,欢迎下载
0.png
(59.75 KB, 下载次数: 127)
下载附件
2017-2-25 01:34 上传
完整程序代码下载:
AD7746数码管.zip
(73 KB, 下载次数: 140)
2017-2-24 10:31 上传
点击文件名下载附件
采集到的电容值通过数码管显示
下载积分: 黑币 -5
部分源码预览:
#include <reg52.h>
#include <intrins.h>
#define MAIN_Fosc 11059200UL //宏定义主时钟HZ
/*位声明*/
sbit SCL=P1^0;
sbit SDA=P1^1;
//sbit RDY=P3^3;
sbit DU=P2^1; //数码管段选
sbit WE=P2^3; //数码管位选
#define CAPDAC 0
unsigned long int H,M,L;//
unsigned char MRD[3]={0,0,0};
/*自定义类型名*/
typedef unsigned char INT8U;
typedef unsigned char uchar;
typedef unsigned int INT16U;
typedef unsigned int uint;
float cfvalue; //得到的温度值
/*************************数码管程序**************************/
/*数码管毫秒级延时函数*/
void Delay_Ms(INT16U ms)
{
INT16U i;
do{
i = MAIN_Fosc / 96000;
while(--i); //96T per loop
}while(--ms);
}
/*共阴极数码管段选码*/
uchar code table[]={
//0 1 2 3 4 5 6 7 8
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
//9 A B C D E F - . 关显示
0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
};
/*共阴极数码管显示函数*/
void Display(uchar cfvalue)
{
//------------------------------
DU = 1;
P0 = table[cfvalue/100]|0x80; //管显示百位
DU = 0;
P0 = 0xff; //清除断码
WE = 1;
P0 = 0xfe; //第一位数码管
WE = 0;
Delay_Ms(5);
//-------------------------------
DU = 1;
P0 = table[cfvalue%100/10]; //显示十位
DU = 0;
P0 = 0xff; //清除断码
WE = 1;
P0 = 0xfd; //第二位数码管
WE = 0;
Delay_Ms(5);
//-------------------------------
DU = 1;
P0 = table[cfvalue%10]; //显示个位
DU = 0;
P0 = 0xff; //清除断码
WE = 1;
P0 = 0xfb; //第三位数码管
WE = 0;
Delay_Ms(5);
}
/*************************IIC程序**************************/
/*IIC延时函数*/
void delay( )//微秒延时
{;;}
//开始信号
void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
//停止
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//应答
void respons()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250));
SCL=0;
delay();
}
//初始化
void init()
{
SDA=1;
delay();
SCL=1;
delay();
}
//IIC写入一个字节
void write_byte(uchar date)//II2给AD7746 写一个字节 例如电容
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
//IIC读取一个字节
uchar read_byte()//读一个字节 把AD7746中的数据读送给II2总线
{
uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
return k;
}
/*************************AD7746程序**************************/
//重置AD7746
void AD7746_reset()
{
start();
write_byte(0xBF); //AD7746重置
stop();
}
//AD7756指定地址写
void write_add(uchar addr,uchar date)
{
start();
write_byte(0x90);
respons();
write_byte(addr);
respons();
write_byte(date);
respons();
stop();
}
//读取AD7746的值
void read_add(uchar *p,uchar n)
{
uchar i;
start();
write_byte(0x90);
respons();
write_byte(0x01);
respons();
start();
write_byte(0x91);
respons();
for(i=0;i<n;i++)
{
*p=read_byte();
p++;
}
stop();
}
//总初始化
void initt()
{
init(); //初始化
AD7746_reset(); //重置
write_add(0x07,0x80);//地址0x07,设置成0x80使能电容通道,单端输入
write_add(0x09,0x2B);//EXC设置
write_add(0x0A,0xA1);//配置寄存器 地址指针0x0A,设置成0xA1(连续转换模式)
write_add(0x0B,0x80);//电容DAC A
write_add(0x0C,0x80);//电容DAC B
}
void main()
{
initt();
while(1)
{
read_add(MRD,3);//读取的值共有3个字节24位
H=MRD[0];//读取高8位数据
H<<=16;
L=MRD[1];//读取中8位数据
L<<=8;
M=MRD[2];//读取低8位数据
H=H+L+M;//将读取到的3个字节合并
cfvalue=(float)((H-0x800000)*4.096/0x800000+CAPDAC)*100;//将十六进制转化为10进制表
Delay_Ms(5);
…………余下内容下载附件……
复制代码
作者:
呵呵呵呵哒
时间:
2017-6-6 09:43
楼主用的什么型号的单片机啊,我现在正急需用AD7746来测微小电容
作者:
q6563008
时间:
2017-6-28 21:52
电路可以给我参考一下吗
作者:
小小菜菜鸟
时间:
2018-5-25 15:18
楼主 为什么资料下载不下来了呢 能发一份给我嘛
作者:
fanmengyao123
时间:
2018-6-6 21:06
楼主用的什么单片机?电路图可以看看嘛?
作者:
j@e
时间:
2020-4-18 23:51
请问用的是AT89C52吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1