找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AT89C51单片机和555芯片构成的多谐振荡电路电容测量

  [复制链接]
跳转到指定楼层
楼主
ID:63924 发表于 2015-3-14 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. /*********************************************************************************************************</这种电容测量方法主要是通过一块555芯片来测量电容,让555芯片工作在直接反馈无稳态的状态下,555芯片输出一定频率的方波,其频率的大小跟被测量的电容之间的关系是:f=0.772/(R*Cx),我们固定R的大小,其公式就可以写为:f=k/Cx,只要我们能够测量出555芯片输出的频率,就可以计算出测量的电容。计算频率的方法可以利用单片机的计数器T0和中断INT0配合使用来测量,这种研究方法相当的简单。
  2. *********************************************************************************************************/
  3. #include "reg51.h"
  4. #include"intrins.h
  5. #define DATA P0
  6. sbit RW=P2^1;//1602写数据
  7. sbit RS=P2^0;//1602写地址
  8. sbit EN=P2^2; //1602工作使能
  9. sbit b_test=P3^7;   //控制小灯的亮灭
  10. sbit _reset=P3^5;   //555时基芯片工作控制信号
  11. unsigned int T_flag,N,C,i,Dis1,Dis0;
  12. unsigned int b[6]={0X13,0X0D,0X00,0X00,0X40,0X16};   //显示C=00pF</FONT></P>
  13. /***********延时1MS******************/
  14. void Delay1ms(unsigned int mm)
  15. {unsigned int i;
  16. for(mm;mm>0;mm--)
  17.    for(i=100;i>0;i--);
  18. }
  19. /***************检查忙否*****************/
  20. void Checkstates()
  21. {
  22. unsigned char dat;
  23. RS=0;
  24. RW=1;
  25. do{EN=1;//下降沿
  26.    _nop_();//保持一定间隔
  27. _nop_();
  28.     dat=DATA;
  29.     _nop_();
  30. _nop_();
  31.     EN=0;
  32. }while((dat&0x80)==1);
  33. }
  34. /**************LCD写命令函数*********/
  35. void wcomd(unsigned char cmd)
  36. {
  37. Checkstates();
  38. RS=0;
  39. RW=0;
  40. DATA=cmd;
  41. EN=1;
  42. _nop_();
  43. _nop_();
  44. _nop_();
  45. _nop_();
  46. EN=0;
  47. }
  48. /**********LCD写数据函数**************/
  49. void wdata(unsigned char dat)
  50. {
  51. Checkstates();
  52. RS=1;
  53. RW=0;
  54. DATA=dat;
  55. EN=1;
  56. _nop_();
  57. _nop_();
  58. _nop_();
  59. _nop_();
  60. EN=0;
  61. }
  62. /*****************初始化********************/
  63. void LCDINIT()
  64. {
  65. Delay1ms(15);
  66. wcomd(0x38);//功能设置
  67. Delay1ms(5);
  68. wcomd(0x38);//功能设置
  69. Delay1ms(5);
  70. wcomd(0x01);//清屏
  71. Delay1ms(5);
  72. wcomd(0x08);//关显示
  73. Delay1ms(5);
  74. wcomd(0x0c);//开显示,不开光标</FONT></P>
  75. <P><FONT color=black>}</FONT></P>
  76. <P><FONT color=black>/***********显示函数**************/
  77. void Display(void) //显示函数
  78. {
  79. unsigned char i,j;
  80. unsigned char a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
  81. LCDINIT();
  82. for(i=0;i<12;i++)//写显示第一行
  83. { wcomd(0x80+i);
  84.     Delay1ms(1);
  85.     wdata(a[i]);
  86.     Delay1ms(1);
  87.    }

  88. for(j=0;j<6;j++)//写显示第二行
  89. {
  90. wcomd(0xc0+j);
  91.   Delay1ms(1);
  92.   wdata(0x30+b[j]);
  93.   Delay1ms(1);
  94. }
  95. Delay1ms(150);</FONT></P>
  96. <P><FONT color=black>}
  97. void main()
  98. {
  99.   IE=0x81;                          //打开全部的中断控制,并开启外部中断允许
  100. TMOD=0x09;                        //T0为16位计数工作方式1
  101.   IT0=1;                            //设置外部中断的触发的方式为脉冲触发
  102.   TH0=0x00;
  103.   TL0=0x00;
  104.   T_flag=0;
  105.   _reset=0;
  106.   b_test=1;
  107.   while(1)
  108. {
  109.     //while(!b_test)                   //如果有测量按键输入就往下执行
  110.     //{
  111.      i=0;
  112.      _reset=1;                      //启动555时基芯片
  113.      EX0=1;          //开启中断0
  114.      while(_reset)   //超出等待时间,中断还没有过来,就退出
  115.       {
  116.        i++;
  117.        if(i>50000)   //设置最长等待时间
  118.         {
  119.          _reset=0;  //最长等待时间到还没有中断,停止555
  120.         }
  121.      }
  122.      if(N<100)         //如果计数值小于100,显示SM,表示应换用小一点的量程
  123.      {
  124.        b[3]=0X1D;
  125.        b[2]=0X23;
  126.       }
  127.     if(N>50000)        //如果计数值大于5000,显示LA,表示应换用大一点的量程
  128.       {
  129.        b[3]=0X11;
  130.        b[2]=0X1C;
  131.       }
  132.      if(N>=100 && N<=50000)
  133.       {
  134.        C=N/100;         //计算电容的大小
  135.        b[2]=C/10;       //计算电容值的十位
  136.        b[3]=C-b[2]*10;  //计算电容值的各位
  137.       }
  138.      //}
  139.     Display(); //显示电容的大小
  140. if(C>40)
  141.    b_test=0;
  142.    else
  143.     b_test=1;
  144.    }
  145. }
  146. void int0(void) interrupt 0   //第一次中断开始计数,第二个中断停止计数
  147. {
  148.   T_flag=!T_flag;
  149.   if(T_flag==1)
  150.   {
  151.    TR0=1;         //开始计时
  152.   }
  153.   if(T_flag==0)
  154.   {
  155.    TR0=0;         //停止计时
  156.    EX0=0;         //关闭中断
  157.    _reset=0;      //停止发出方波
  158.    N=TH0*256+TL0; //计算计数器的值
  159.    N=N*5/3;
  160.    TH0=0x00;      //恢复初值
  161.    TL0=0x00;
  162.   }
  163. }[audio]http://play.baidu.com/?__m=mboxCtrl.playSong&__a=233111&__o=song/233111||playBtn&fr=altg3||www.baidu.com#[/audio]
复制代码

单片机电容测量.rar

70.94 KB, 下载次数: 246, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:162517 发表于 2017-1-22 09:47 | 只看该作者
谢谢楼主的分享,现在正在研究这个,刚好能用到
回复

使用道具 举报

板凳
ID:185575 发表于 2017-4-2 15:02 | 只看该作者
最近我也在做这个东西 好东西 值得收藏
回复

使用道具 举报

地板
ID:137653 发表于 2017-7-2 21:34 | 只看该作者
问一下为什么要N=N*5/3呢?
回复

使用道具 举报

5#
ID:502429 发表于 2019-4-1 22:05 | 只看该作者
R1和R2应该多大?
回复

使用道具 举报

6#
ID:726332 发表于 2020-4-13 23:01 | 只看该作者
有仿真电路吗
回复

使用道具 举报

7#
ID:813187 发表于 2020-10-3 09:35 | 只看该作者
可以,横清楚
回复

使用道具 举报

8#
ID:760449 发表于 2020-10-9 11:49 | 只看该作者
为什么LCD没有显示
回复

使用道具 举报

9#
ID:948914 发表于 2021-10-7 20:18 | 只看该作者
楼主,你这个测试方法得到的电容值误差咋样,我也是用这个方法测的,但是误差有时候大有时候小
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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