花了一个人月的时间用51单片机来读取AD7746芯片的电容采集程序
本人已作出调试成功,欢迎下载
完整程序代码下载:
AD7746数码管.zip
(73 KB, 下载次数: 139)
部分源码预览:
- #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);
- …………余下内容下载附件……
复制代码
|