找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机自动换挡测电容最终版原理图与程序源码

  [复制链接]
跳转到指定楼层
楼主
ID:313175 发表于 2018-4-21 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自动测量电容,通过555构成多谐振荡器测量频率,因为频率与555定时器2和6脚的RC有关,固定R大小,来测量电容大小,
所谓换挡是因为51单片机晶振有限不能测太高的频率,则需换固定R为另一个R将频率降低,以便能测出。

电路原理图如下:




单片机源程序如下:
  1. #include<reg52.h>
  2. #include "lcd1602.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit Key1M=P1^0;
  6. sbit Key1K=P1^1;
  7. sbit  Key1=P1^2;
  8. sbit  Key2=P1^3;
  9. sbit  Key3=P1^4;

  10. uchar plv[]={"        Hz"};
  11. uchar cap1[]={"0000000000 uF"};
  12. uchar cap2[]={"0000000 nF"};
  13. uchar cap3[]={"000 pF"};
  14. uchar    n[]={"             "};

  15. unsigned long Frequency;
  16. unsigned long C1,C2;
  17. uchar num;
  18. uchar T1count;
  19. uchar D1M,D1K,ZD;
  20. bit flag;

  21. void dangwei();
  22. void display();
  23. void main()
  24. {
  25.    init_lcd1602();
  26.         Key1M=1;
  27.         Key1K=0;
  28.     TMOD=0x51;

  29.         TH0=(65536-50000)/256;
  30.         TL0=(65536-50000)%256;

  31.     TH1=0;
  32.         TL1=0;

  33.         EA=1;
  34.         TR0=1;                                                                                  
  35.         ET0=1;
  36.         TR1=1;
  37.         ET1=1;
  38.         while(1)
  39.         {
  40.           dangwei();
  41.           if(flag==1)
  42.            {
  43.                     flag=0;
  44.                     Frequency=T1count*65536+TH1*256+TL1;

  45.                     plv[0]=Frequency/1000000+48;
  46.                         plv[1]=Frequency/100000%10+48;
  47.                         plv[2]=Frequency/10000%10+48;
  48.                         plv[3]=Frequency/1000%10+48;
  49.                         plv[4]=Frequency/100%10+48;
  50.                         plv[5]=Frequency/10%10+48;
  51.                         plv[6]=Frequency%10+48;
  52.                         display_lcd1602_text(1,0,plv);

  53.                         if(D1K==1)
  54.                            {
  55.                              Key1M=0;
  56.                                  Key1K=1;
  57.                                  C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
  58.                                  display();  
  59.                            }
  60.                         if(D1M==1)
  61.                            {
  62.                              Key1M=1;
  63.                                  Key1K=0;
  64.                                  C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
  65.                                  display();
  66.                            }
  67.                
  68.                          if(ZD==1)
  69.                            {
  70.                               if(Frequency>50 && Key1M==1)         //一旦频率大于50HZ,且为1M档   
  71.                                           {
  72.                                                 C1=1.4398*1000000/(1000+2*1000000)/Frequency*1000000;
  73.                                         display();                 //将频率用1M阻值换算               
  74.                                           }
  75.                                                                        
  76.                                   if(Frequency<50000 && Key1K==1)         //一旦频率小于50000HZ,且为1k档         
  77.                                          {
  78.                                                 C1=1.4398*1000000/(1000+2*1000)/Frequency*1000000;
  79.                                         display();                 //将频率用1k阻值换算       
  80.                                          }
  81.                                
  82.                                   if(Frequency<50 && Key1M==1)         //一旦频率小于50HZ,且为1M档       因为6800pf  真实频率比100HZ小,但比50HZ大
  83.                                          {                                                                                                                   //从而避免一直切换
  84.                                                 Key1M=0;
  85.                                         Key1K=1;                          //切换为1M档,让频率重新更新换算
  86.                                          }
  87.                                
  88.                                   if(Frequency>50000 && Key1K==1)         //一旦频率大于50000HZ,且为1k档           因为10000pf  真实频率比48000HZ大,但比50000小
  89.                                                                                                                                                                                    //从而避免一直切换
  90.                                          {
  91.                                                 Key1M=1;                          //切换为1M档,让频率重新更新换算
  92.                                         Key1K=0;                                         
  93.                                          }            
  94.                  }
  95.                                 num=0;           
  96.                                 T1count=0;                                            
  97.                                 TH1=0;              
  98.                                 TL1=0;            
  99.                                 TR1=1;
  100.               }
  101.      }
  102. }

  103. void display()
  104. {
  105.     if(C1<1000)
  106.           {
  107.                 C2=C1;
  108.                 C2=C2-26;               
  109.                 cap3[0]=C2/100+48;
  110.                 cap3[1]=C2/10%10+48;
  111.                 cap3[2]=C2%10+48;
  112.                 display_lcd1602_text(0,0,n);
  113.             display_lcd1602_text(0,0,cap3);       
  114.            }
  115.          if(C1>=1000&&C1<1000000)
  116.            {
  117.                  C2=C1;
  118.                  C2=C2-26;
  119.                  cap2[0]=C2/100000+48;
  120.                  cap2[1]=C2/10000%10+48;
  121.                  cap2[2]=C2/1000%10+48;
  122.                  cap2[3]='.';
  123.                  cap2[4]=C2/100%10+48;
  124.                  cap2[5]=C2/10%10+48;
  125.                  cap2[6]=C2%10+48;
  126.                  display_lcd1602_text(0,0,n);
  127.                  display_lcd1602_text(0,0,cap2);
  128.            }
  129.          if(C1>=1000000&&C1<=600000000)
  130.                 {
  131.                   C2=C1;
  132.                   C2=C2-26;
  133.                   cap1[0]=C2/100000000+48;
  134.                   cap1[1]=C2/10000000%10+48;
  135.                   cap1[2]=C2/1000000%10+48;
  136.                   cap1[3]='.';
  137.                   cap1[4]=C2/100000%10+48;
  138.                   cap1[5]=C2/10000%10+48;
  139.                   cap1[6]=C2/1000%10+48;
  140.                   cap1[7]=C2/100%10+48;
  141.                   cap1[8]=C2/10%10+48;
  142.                   cap1[9]=C2%10+48;
  143.                   display_lcd1602_text(0,0,n);
  144.                   display_lcd1602_text(0,0,cap1);
  145.                 }
  146. }

  147. void dangwei()
  148. {
  149. //         D1K=0;
  150. //         D1M=0;
  151. //         ZD=1;
  152.     if(Key1==0)        //1K档位
  153.            {
  154.                  delay(20);
  155.                  if(Key1==0)
  156.                    {
  157.                      D1K=1;
  158.                          D1M=0;
  159.                          ZD=0;
  160.                    }
  161.            }
  162.         if(Key2==0)        // 1M档位
  163.            {
  164.                  delay(20);
  165.                  if(Key2==0)
  166.                    {
  167.                      D1K=0;
  168.                          D1M=1;
  169.                          ZD=0;
  170.                    }
  171.            }
  172.         if(Key3==0)         //        自动换档位
  173.            {
  174.                  delay(20);
  175.                  if(Key3==0)
  176.                    {
  177.                      D1K=0;
  178.                          D1M=0;
  179.                          ZD=1;
  180.                    }
  181.            }
  182. }

  183. void jishu() interrupt 3 using 0   //定时器1 计数
  184. {
  185.      T1count++;
  186. }

  187. void timer0() interrupt 1  using 0 //定时0 定时1s
  188. {
  189.       num++;
  190. ……………………

  191. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
自动换挡测电容最终版.zip (50 KB, 下载次数: 160)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:258743 发表于 2018-4-21 19:18 | 只看该作者
附件不能下载啊
回复

使用道具 举报

板凳
ID:313428 发表于 2018-4-21 22:57 | 只看该作者
楼主厉害啊!
回复

使用道具 举报

地板
ID:443448 发表于 2018-12-10 17:11 | 只看该作者
楼主,有pcb吗
回复

使用道具 举报

5#
ID:597781 发表于 2019-8-8 15:42 | 只看该作者
楼主厉害啊,希望自己也可以做出来,不过想问一下这个测电容的可以精确到那个单位啊
回复

使用道具 举报

6#
ID:597781 发表于 2019-8-8 16:17 | 只看该作者
楼主,我想知道一下这个单片机stc89c52为什么在proteus里面找不到呢,这个单片机是您自己设计的还是只是我没找到你喜欢,求解答
回复

使用道具 举报

7#
ID:807126 发表于 2020-7-23 15:57 | 只看该作者
能发下这个的仿真吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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