找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6830|回复: 5
打印 上一主题 下一主题
收起左侧

自己做的51单片机控制AD7746芯片读取电容值

[复制链接]
跳转到指定楼层
楼主
花了一个人月的时间用51单片机来读取AD7746芯片的电容采集程序
本人已作出调试成功,欢迎下载


完整程序代码下载:
AD7746数码管.zip (73 KB, 下载次数: 139)


部分源码预览:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define MAIN_Fosc                11059200UL        //宏定义主时钟HZ
  4. /*位声明*/
  5. sbit SCL=P1^0;
  6. sbit SDA=P1^1;
  7. //sbit RDY=P3^3;
  8. sbit DU=P2^1;   //数码管段选
  9. sbit WE=P2^3;   //数码管位选

  10. #define CAPDAC 0

  11. unsigned long int H,M,L;//
  12. unsigned char MRD[3]={0,0,0};
  13. /*自定义类型名*/
  14. typedef unsigned char INT8U;
  15. typedef unsigned char uchar;

  16. typedef unsigned int INT16U;
  17. typedef unsigned int uint;

  18. float cfvalue; //得到的温度值
  19. /*************************数码管程序**************************/
  20. /*数码管毫秒级延时函数*/
  21. void Delay_Ms(INT16U ms)
  22. {
  23.      INT16U i;
  24.          do{
  25.               i = MAIN_Fosc / 96000;
  26.                   while(--i);   //96T per loop
  27.      }while(--ms);
  28. }
  29. /*共阴极数码管段选码*/
  30. uchar code table[]={
  31. //0                1         2     3     4     5     6     7     8
  32. 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
  33. //9     A     B           C         D           E         F                -         .          关显示
  34. 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
  35.                    };
  36. /*共阴极数码管显示函数*/
  37. void Display(uchar cfvalue)
  38. {
  39. //------------------------------
  40.         DU = 1;
  41.         P0 = table[cfvalue/100]|0x80;        //管显示百位
  42.         DU = 0;

  43.         P0 = 0xff;                                  //清除断码

  44.         WE = 1;
  45.         P0 = 0xfe;                          //第一位数码管
  46.         WE = 0;
  47.         Delay_Ms(5);
  48. //-------------------------------
  49.         DU = 1;
  50.         P0 = table[cfvalue%100/10]; //显示十位
  51.         DU = 0;

  52.         P0 = 0xff;                                  //清除断码

  53.         WE = 1;
  54.         P0 = 0xfd;                          //第二位数码管
  55.         WE = 0;
  56.         Delay_Ms(5);
  57. //-------------------------------
  58.         DU = 1;
  59.         P0 = table[cfvalue%10];                //显示个位
  60.         DU = 0;
  61.                                                                
  62.         P0 = 0xff;                                        //清除断码

  63.         WE = 1;
  64.         P0 = 0xfb;                                //第三位数码管
  65.         WE = 0;
  66.         Delay_Ms(5);
  67. }

  68. /*************************IIC程序**************************/
  69. /*IIC延时函数*/
  70. void delay( )//微秒延时
  71. {;;}
  72. //开始信号
  73. void start()
  74. {
  75.           SDA=1;
  76.           delay();
  77.           SCL=1;
  78.           delay();
  79.           SDA=0;
  80.           delay();
  81. }
  82. //停止
  83. void stop()
  84. {
  85.           SDA=0;
  86.           delay();
  87.           SCL=1;
  88.           delay();
  89.           SDA=1;
  90.           delay();
  91. }
  92. //应答
  93. void respons()
  94. {
  95.         uchar i;
  96.         SCL=1;
  97.         delay();
  98.         while((SDA==1)&&(i<250));
  99.         SCL=0;
  100.         delay();
  101. }
  102. //初始化
  103. void init()
  104. {
  105.         SDA=1;
  106.         delay();
  107.         SCL=1;
  108.         delay();
  109. }
  110. //IIC写入一个字节
  111. void write_byte(uchar date)//II2给AD7746 写一个字节 例如电容
  112. {
  113.         uchar i,temp;
  114.         temp=date;
  115.         for(i=0;i<8;i++)
  116.         {
  117.                 temp=temp<<1;
  118.                 SCL=0;
  119.                 delay();
  120.                 SDA=CY;
  121.                 delay();
  122.                 SCL=1;
  123.                 delay();
  124.          }
  125.          SCL=0;
  126.          delay();
  127.          SDA=1;
  128.          delay();
  129. }
  130. //IIC读取一个字节
  131. uchar read_byte()//读一个字节 把AD7746中的数据读送给II2总线
  132. {
  133.         uchar i,k;
  134.         SCL=0;
  135.         delay();
  136.         SDA=1;
  137.         delay();
  138.         for(i=0;i<8;i++)
  139.         {
  140.                  SCL=1;
  141.             delay();
  142.                 k=(k<<1)|SDA;
  143.                 SCL=0;
  144.                 delay();
  145.          }
  146.          return k;
  147. }
  148. /*************************AD7746程序**************************/
  149. //重置AD7746
  150. void AD7746_reset()
  151. {
  152.         start();
  153.         write_byte(0xBF); //AD7746重置
  154.         stop();
  155. }
  156. //AD7756指定地址写
  157. void write_add(uchar addr,uchar date)
  158. {
  159.         start();
  160.         write_byte(0x90);
  161.         respons();
  162.         write_byte(addr);
  163.         respons();
  164.         write_byte(date);
  165.         respons();
  166.         stop();
  167. }
  168. //读取AD7746的值
  169. void read_add(uchar *p,uchar n)
  170. {
  171.         uchar i;
  172.         start();
  173.         write_byte(0x90);
  174.         respons();
  175.         write_byte(0x01);
  176.         respons();
  177.         start();
  178.         write_byte(0x91);
  179.         respons();
  180.         for(i=0;i<n;i++)
  181.         {
  182.                 *p=read_byte();
  183.                 p++;
  184.         }
  185.         stop();
  186. }
  187. //总初始化
  188. void initt()
  189. {
  190.         init();         //初始化
  191.         AD7746_reset();        //重置
  192.         write_add(0x07,0x80);//地址0x07,设置成0x80使能电容通道,单端输入
  193.         write_add(0x09,0x2B);//EXC设置
  194.         write_add(0x0A,0xA1);//配置寄存器 地址指针0x0A,设置成0xA1(连续转换模式)
  195.         write_add(0x0B,0x80);//电容DAC A
  196.         write_add(0x0C,0x80);//电容DAC B
  197. }
  198. void main()
  199. {
  200.         initt();
  201.         while(1)
  202.         {
  203.                 read_add(MRD,3);//读取的值共有3个字节24位
  204.                 H=MRD[0];//读取高8位数据
  205.                 H<<=16;
  206.                 L=MRD[1];//读取中8位数据
  207.                 L<<=8;
  208.                 M=MRD[2];//读取低8位数据
  209.                 H=H+L+M;//将读取到的3个字节合并

  210.              cfvalue=(float)((H-0x800000)*4.096/0x800000+CAPDAC)*100;//将十六进制转化为10进制表
  211.              Delay_Ms(5);
  212. …………余下内容下载附件……
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:207676 发表于 2017-6-6 09:43 | 只看该作者
楼主用的什么型号的单片机啊,我现在正急需用AD7746来测微小电容
回复

使用道具 举报

板凳
ID:210471 发表于 2017-6-28 21:52 | 只看该作者
电路可以给我参考一下吗
回复

使用道具 举报

地板
ID:265379 发表于 2018-5-25 15:18 | 只看该作者
楼主  为什么资料下载不下来了呢  能发一份给我嘛
回复

使用道具 举报

5#
ID:346396 发表于 2018-6-6 21:06 | 只看该作者
楼主用的什么单片机?电路图可以看看嘛?
回复

使用道具 举报

6#
ID:732432 发表于 2020-4-18 23:51 | 只看该作者
请问用的是AT89C52吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表