//**********************************
// AD7746电容检测
// IIC接口
//
//***********************************//
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit RDY=P3^3;
#define CapDacvalue 4.97
void IIC_START(void);
void IIC_STOP(void);
void IICSendbyte(unsigned char ch);
void IICSendbyte2(unsigned char ch);
unsigned char IICRECVbyte(void);
unsigned char IICWatask(void);
unsigned char IICWatask2(void);
void IICSendask(void);
void IICSendNask(void);
unsigned char SETUP_7745(unsigned char addr,unsigned char value);
void GET7745value(unsigned char *p,unsigned char n);
void delay(unsigned int x );
unsigned char IICreadstatus(unsigned char addr);
void AD7745_RESET();
unsigned char MRD[3]={0,0,0};
unsigned char fl,flage,flag3,flag4;
unsigned char stdata;
unsigned long int cfregvalueH,cfregvalueM,cfregvalueL;
void main()
{
unsigned char capdacreg;
SCON=0x57; //波特率发生器 串行方式1 9600
TMOD=0x21;
TH1=0xFD;
TL1=0xFD;
EA=1;
TR1=1;
IT1=1;
EX1=1;
fl=1;
flage=1;
flag3=1;
flag4=1;
stdata=0x01;
//printf("%d,%d,%d,%d\n",fl,flage,flag3,flag4);
AD7745_RESET();
capdacreg=(int)((CapDacvalue*0x7F)/17);
capdacreg=0x80|capdacreg;
fl=SETUP_7745(0x07,0x80); //设置CAP SETUP寄存器值
flage=SETUP_7745(0x09,0x2B); //EXCSETUP 寄存器设置
flag3=SETUP_7745(0x0A,0xA1);
flag4=SETUP_7745(0x0B,capdacreg);
while(1);
}
void AD7745_RESET(void)
{ IIC_START();
IICSendbyte(0xBF);
IIC_STOP();
}
void IIC_START(void)
{
//SCL=0;
SDA=1;
delay(2);
SCL=1;
delay(6);
SDA=0;
delay(6);
SCL=0;
delay(2);
}
void IIC_STOP(void)
{
// SCL=0;
SDA=0;
delay(2);
SCL=1;
delay(6);
SDA=1;
delay(6);
SCL=0;
delay(4);
}
void IICSendbyte(unsigned char ch)
{
unsigned char i;
SCL=0;
for (i=0;i<8;i++)
{
SDA=(bit)(ch&0x80);
delay(6);
ch<<=1;
SCL=1;
delay(6);
SCL=0;
delay(6);
}
delay(6);
}
void IICSendbyte2(unsigned char ch)
{
unsigned char i;
SCL=0;
for (i=0;i<8;i++)
{
SDA=(bit)(ch&0x80);
delay(6);
ch<<=1;
SCL=1;
delay(6);
SCL=0;
delay(6);
}
delay(6);
}
unsigned char IICRECVbyte(void)
{
unsigned char i;
unsigned char temp=0;
SCL=0;
SDA=1;
for (i=0;i<8;i++)
{
SCL=1;
delay(5);
temp=temp<<1;
if(SDA==1)
temp=temp|0x01;
else
temp=temp&0xfe;
SCL=0;
}
return(temp);
}
unsigned char IICWatask(void) //等待AD7745向单片机发送应答信号函数
{
unsigned char i=0;
unsigned char flag=0x01;
SCL=0;
delay(2);
SDA=1;
SCL=1;
delay(6);
while((SDA==1)&&(i<250))
i++;
flag=SDA;
SCL=0;
return(flag);
}
unsigned char IICWatask2(void) //等待AD7745向单片机发送应答信号函数(为避免编译报警,功能同上)
{
unsigned char i=0;
unsigned char flag=0x01;
SCL=0;
delay(2);
SDA=1;
SCL=1;
delay(6);
while((SDA==1)&&(i<250))
i++;
flag=SDA;
SCL=0;
return(flag);
}
void IICSendask(void) //单片机向AD7745发送应答信号
{
SDA=0;
delay(3);
SCL=1;
delay(6);
delay(2);
SCL=0;
SDA=1;
delay(3);
}
void IICSendNask(void) //发送非应答位
{ SDA=1;
delay(2);
SCL=1;
delay(5);
SCL=0;
delay(2);
SDA=0;
}
unsigned char SETUP_7745(unsigned char addr,unsigned char value)
{
unsigned char flag;
flag=0x01;
IIC_START();
IICSendbyte2(0x90);
if(IICWatask2()!=0)
flag=1;
else
flag=0;
IICSendbyte2(addr);
if(IICWatask2()!=0)
flag=1;
else
flag=0;
IICSendbyte2(value);
if(IICWatask2()!=0)
flag=1;
else
flag=0;
IIC_STOP();
return(flag);
}
void GET7745value(unsigned char *p,unsigned char n) //读取AD7745采取先写后读的方式 即先写入地址,再读相应的寄存器内容
{ unsigned char i;
unsigned char flagw;
IIC_START();
IICSendbyte(0x90); //I2C写命令字指令
flagw=IICWatask();
IICSendbyte(0x01); //I2C写地址
flagw=IICWatask();
IIC_START();
IICSendbyte(0x91); //I2C读命令字指令
flagw=IICWatask();
for(i=0;i<n;i++)
{ *p=IICRECVbyte();
if(i!=n-1)
IICSendask();
else
IICSendNask();
p++;
}
IIC_STOP();
}
/*unsigned char IICreadstatus(unsigned char addr)
{
unsigned char temp;
unsigned char flagst;
IICSendbyte(0x90); //I2C写命令字指令
flagst=IICWatask();
IICSendbyte(addr); //I2C写地址
flagst=IICWatask();
IIC_START();
IICSendbyte(0x91); //I2C读命令字指令
flagst=IICWatask();
temp=IICRECVbyte();
IICSendNask();
IIC_STOP();
return(temp);
}*/
void intr1() interrupt 2
{
float cfvalue;
//stdata=IICreadstatus(0x00);
delay(10);
GET7745value(MRD,3);
cfregvalueH=MRD[0];
cfregvalueH<<=16;
cfregvalueM=MRD[1];
cfregvalueM<<=8;
cfregvalueL=MRD[2];
cfregvalueH=cfregvalueH+cfregvalueM+cfregvalueL;
if(cfregvalueH>=0x800000)
{ cfvalue=(float)((cfregvalueH-0x800000)*4.096/0x7FFFFF);
cfvalue=CapDacvalue+cfvalue;}
else
{ cfvalue=(float)((0x800000-cfregvalueH)*4.096/0x7FFFFF);
cfvalue=CapDacvalue-cfvalue;
}
printf("%f\n",cfvalue);
}
void delay(unsigned int x )
{
unsigned int i;
i=x;
while(i--);
}
没有合适的资源?快使用搜索试试~ 我知道了~
ad7745 AD7746电容检测芯片I2C接口 C51单片机驱动程序源代码.zip
共13个文件
c:2个
r43:1个
d43:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 20 浏览量
2024-04-28
06:55:46
上传
评论
收藏 31KB ZIP 举报
温馨提示
ad7745 AD7746电容检测芯片I2C接口 C51单片机驱动程序源代码 main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; unsigned char flag_cset, flag_exc,flag_config,flag_capdac,ch0; //P2DIR|=BIT0|BIT1|BIT2; starti2c(); flag_cset=0x00; flag_exc=0x00; flag_cset=SETUP_7746(0X07,0X80); flag_exc=SETUP_7746(0X09,0X0B); flag_config=SETUP_7746(0x0a,0xa2); flag_capdac=SETUP_7746(0x0b,0x7f); key_init(); __enable_interrupt(); //开启总中
资源推荐
资源详情
资源评论
收起资源包目录
ad7745 AD7746电容检测芯片I2C接口 C51单片机驱动程序源代码.zip (13个子文件)
AD7745dianrong.c 5KB
ad7746ceshi.dep 2KB
ad7746ceshi.ewp 44KB
ad7746ceshi.eww 165B
ad7746ceshi.ewd 17KB
main.c 5KB
Debug
List
Obj
main.r43 27KB
ad7746ceshi.pbd 108B
Exe
ad7746ceshi.d43 23KB
settings
ad7746ceshi.dni 1KB
ad7746ceshi.cspy.bat 3KB
ad7746ceshi.wsdt 7KB
ad7746ceshi.dbgdt 8KB
共 13 条
- 1
资源评论
- 2301_768882592024-07-30资源很实用,内容详细,值得借鉴的内容很多,感谢分享。
GJZGRB
- 粉丝: 2931
- 资源: 7737
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功