找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机制作的电容测量仪Proteus仿真程序(可测uf和nf级别)

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>

  2. sbit nF_check = P1^0;         //测量电容(nF)                                 
  3. sbit uF_check = P1^1;         //测量电容(uF)
  4. sbit stop = P1^2;                 //停止测量按钮
  5. sbit P20 = P2^0;                 //百位控制
  6. sbit P21 = P2^1;                 //十位控制
  7. sbit P22 = P2^2;                 //个位及小数点控制
  8. sbit P23 = P2^3;                 //十分位控制
  9. sbit P24 = P2^4;                 //“n”或“u”显示控制
  10. sbit P25 = P2^5;                 //“F”显示控制
  11. sbit P26 = P2^6;                 //
  12. sbit P27 = P2^7;                 //
  13. sbit P30 = P3^0;                 //电阻电容测量继电器
  14. sbit P31 = P3^1;                 //
  15. sbit P32 = P3^2;                 //计时停止请求(中断0)
  16. sbit P33 = P3^3;                 //计时开始请求(中断1)及测量开始开关
  17. sbit P34 = P3^4;
  18. sbit P35 = P3^5;
  19. sbit P36 = P3^6;
  20. sbit P37 = P3^7;

  21. char code word[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  22.                     0x7F,0x6F,0x37,0x3E,0x71,0x80};     
  23.                                         //'0'~'9'和n、u、F及小数点.等字形码
  24. long int N=0;                //计数变量

  25. /********************************************************************
  26. 函数功能:延时函数
  27. 入口参数: us
  28. 出口参数:
  29. ********************************************************************/
  30. void delay(us)
  31. {
  32.    while(us--);
  33. }

  34. /********************************************************************
  35. 函数功能:中断初始化
  36. 入口参数:
  37. 出口参数:
  38. ********************************************************************/
  39. void INT0_init()
  40. {
  41.    IE = 0x87;  //打开总中断及外部中断0、1,定时器中断0
  42.    IT0 = 1;    //下降沿触发
  43.    IT1 = 1;
  44. }

  45. /********************************************************************
  46. 函数功能:外部中断0处理
  47. 入口参数:
  48. 出口参数:
  49. ********************************************************************/
  50. void INT0_pro(void) interrupt 0    //外部中断0
  51. {
  52.   TR0 = 0;                               //T0停止计时
  53. }

  54. /********************************************************************
  55. 函数功能:外部中断1处理
  56. 入口参数:
  57. 出口参数:
  58. ********************************************************************/
  59. void INT1_pro(void) interrupt 2    //外部中断1
  60. {
  61.     TR0 = 1;                           //T0开始计时
  62. }
  63. /********************************************************************
  64. 函数功能:定时器0初始化
  65. 入口参数:
  66. 出口参数:
  67. ********************************************************************/
  68. void Timer_init() {
  69.         
  70.         TMOD = 0x02;            //定时器0工作于方式2(8位自动重装定时器)
  71.         TH0  = 256-100;            //定时器0设定时间为100us(假设晶振为12MHz,
  72.         TL0  = 256-100;     //则时钟周期为1/12us,机器周期为1us),频率为10kHz。  
  73. }

  74. /********************************************************************
  75. 函数功能:定时器0中断处理(时基)
  76. 入口参数:
  77. 出口参数:
  78. ********************************************************************/
  79. void _Timer_clock(void) interrupt 1   //定时器0(溢出)中断,中断1
  80. {
  81.     N++;
  82. }

  83. /********************************************************************
  84. 函数功能:数据显示函数
  85. 入口参数:  CV
  86. 出口参数:
  87. ********************************************************************/
  88. void CV_disp(long int CV)
  89. {

  90. //数码管位选方式--灌电流//
  91.         P2=0xff;         
  92.                 P0=word[CV/1000];         P20=0; delay(60);          //千位
  93.                 P2=0xff;         
  94.                 P0=word[(CV/100)%10];     P21=0; delay(60);          //百位
  95.         P2=0xff;     
  96.                 P0=word[(CV/10)%10];      P22=0; delay(60);          //十位
  97.         P2=0xff;        
  98.                 P0=word[CV%10];           P23=0; delay(60);          //个位
  99.                            
  100. }

  101. /********************************************************************
  102. 函数功能:主函数
  103. 入口参数:
  104. 出口参数:
  105. ********************************************************************/
  106. void main()
  107. {
  108.    long int C=0;
  109.    INT0_init();
  110.    Timer_init();
  111.    while(1){
  112.          
  113. //数码管位选方式--灌电流//
  114.      while(!nF_check) {                                 //测量电容(nF)
  115.                  P30=1;
  116.                  if(TR0 && !P33) C=N*610/1000;//取R=10M,C为nF级,则时间常数t=RC=(10*10^6)*(C*10^-9)=C*10^-2;
  117.                                               //若在t期间对已知脉冲进行计数,且选脉冲频率f=10k=10^4,
  118.                  else N=0;                                          //则计数值N=f*t=100C(nF),所以C=N/100。
  119.                                               //C=N*610/1000是算法修正
  120.                  P2=0xff;
  121.                  P0=word[10];        P24=0;  delay(60);             //第5位显示n
  122.                  P2=0xff;
  123.                  P0=word[12];                 P25=0;         delay(60);             //第6位显示F
  124.                  P2=0xff;
  125.                  P0=word[13];                 P22=0;         delay(60);             //第3位显示小数点
  126.                  CV_disp(C);                                                                 //显示测量值
  127.                  if(!stop) TR0=0;
  128.           }        
  129.         
  130.           while(!uF_check) {                        //测量电容(uF)        
  131.                  P30=0;                                                
  132.          if(TR0 && !P33) C=N*160/10000;//取R=100k,C为uF级,则时间常数t=RC=(100*10^3)*(C*10^-6)=C*10^-1;
  133.                                                //若在t期间对已知脉冲进行计数,且选脉冲频率f=10k=10^4,
  134.                  else N=0;                                       //则计数值N=f*t=1000C(uF),于是应有C=N/1000。
  135.                                                //C=N*160/10000是为消除误差所进行的补偿运算
  136.          P2=0xff;
  137.                  P0=word[11];        P24=0;  delay(60);             //第5位显示u
  138.                  P2=0xff;
  139.                  P0=word[12];                 P25=0;         delay(60);             //第6位显示F
  140.                  P2=0xff;
  141.                  P0=word[13];                 P22=0;         delay(60);             //第3位显示小数点
  142.                  CV_disp(C);                                                                 //显示测量值
  143.                  if(!stop) TR0=0;
  144.           }        
  145.         }   
  146. }
复制代码

所有资料51hei附件下载:
电容测量.7z (113.41 KB, 下载次数: 89)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:986271 发表于 2021-11-30 10:29 | 只看该作者
你这个仿真的设计思路和方案能简单的说下吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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