找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8665|回复: 16
收起左侧

基于单片机开发的电阻电容测量仪仿真+源程序

  [复制链接]
ID:271636 发表于 2018-4-25 02:48 | 显示全部楼层 |阅读模式
设计中采用利用振荡频率来完成对电阻电容的测量。需要注意的是,对电阻电容的测量需要自己通过按键功能来选择。电容测量的范围0-10000pf,电阻这边是小于1兆欧的可以测量。下面是程序。

电阻电容测量仪仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
0.jpg

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"stdio.h"
  3. #include"math.h"
  4. #include"absacc.h"
  5. #include"intrins.h"

  6. typedef unsigned char uchar;
  7. typedef unsigned int  uint;

  8. unsigned char inte=0;                                
  9. float  uu=0;                                
  10. unsigned long int ff=0;       
  11. unsigned long int DL,DH;

  12. sbit sc=P1^6;
  13. sbit sr=P1^7;
  14. sbit fw=P3^5;       
  15. sbit srg=P1^2;
  16. sbit srd=P1^3;       
  17. sbit scg=P1^4;
  18. sbit scd=P1^5;  
  19. sbit fr=P1^0;
  20. sbit fc=P1^1;
  21. sbit LED=P3^7;

  22. sbit rs=P2^2;            
  23. sbit rw=P2^1;           
  24. sbit en=P2^0;

  25. sbit CS   = P3^4;
  26. sbit Clk = P3^3;
  27. sbit DATI = P3^2;
  28. sbit DATO = P3^2;


  29. /*******************************定义全局变量********************************/
  30. unsigned char dat = 0x00;                      //AD值
  31. unsigned char CH;  

  32. unsigned char code table[]={"0123456789"};

  33. #define count_M1 50000
  34. #define H_0 (65536-count_M1)/256
  35. #define L_0 (65536-count_M1)%256
  36. char times=0;

  37. bit status_F=1;
  38. char scan=1;
  39. unsigned int freq=0;
  40. sfr16 DPTR=0x82;

  41. void delay1ms(int);
  42. void display(uint x);
  43. void display1(uint dat);

  44. //入口参数:CH  出口参数:dat
  45. unsigned char adc0832(unsigned char CH)
  46. {
  47.         unsigned char i,test,adval;
  48.     adval = 0x00;
  49.     test = 0x00;

  50.     Clk = 0;       //初始化
  51.     DATI = 1;
  52.         _nop_();
  53.     CS = 0;
  54.     _nop_();
  55.     Clk = 1;
  56.            _nop_();

  57.         if ( CH == 0x00 )      //通道选择
  58.            {
  59.              Clk = 0;
  60.                DATI = 1;      //通道0的第一位
  61.                _nop_();
  62.               Clk = 1;
  63.         _nop_();
  64.         Clk = 0;
  65.               DATI = 0;      //通道0的第二位
  66.               _nop_();
  67.               Clk = 1;
  68.               _nop_();
  69.     }
  70.     else
  71.     {
  72.                 Clk = 0;
  73.               DATI = 1;      //通道1的第一位
  74.                _nop_();
  75.                Clk = 1;
  76.                _nop_();
  77.               Clk = 0;
  78.               DATI = 1;      //通道1的第二位
  79.             _nop_();
  80.              Clk = 1;
  81.              _nop_();
  82.     }

  83.     Clk = 0;
  84.     DATI = 1;

  85.     for( i = 0;i < 8;i++ )      //读取前8位的值
  86.     {
  87.                 _nop_();
  88.                adval <<= 1;
  89.                Clk = 1;
  90.                _nop_();
  91.                Clk = 0;
  92.                if (DATO)
  93.                 adval |= 0x01;
  94.               else
  95.                   adval |= 0x00;
  96.     }

  97.         for (i = 0; i < 8; i++)      //读取后8位的值
  98.     {
  99.                 test >>= 1;
  100.         if (DATO)
  101.                 test |= 0x80;
  102.         else
  103.         test |= 0x00;
  104.         _nop_();
  105.         Clk = 1;
  106.         _nop_();
  107.         Clk = 0;
  108.     }
  109.         if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  110.             dat = test;
  111.               _nop_();
  112.                CS = 1;        //释放ADC0832
  113.                DATO = 1;
  114.                Clk = 1;
  115.               return dat;
  116. }

  117. void delay(uint n)                          
  118. {
  119.     uint x,y;
  120.     for(x=n;x>0;x--)
  121.     for(y=110;y>0;y--);
  122. }


  123. void lcd_wcom(uchar com)           
  124. {
  125.     rs=0;               
  126.     rw=0;               
  127.     P0=com;           
  128.     delay(5);      
  129.     en=1;           
  130.     en=0;
  131. }


  132. void lcd_wdat(uchar dat)      
  133. {
  134.     rs=1;            
  135.     rw=0;            
  136.     P0=dat;        
  137.     delay(5);      
  138.     en=1;        
  139.     en=0;
  140.   }


  141. void lcd_init(void)            
  142. {
  143.     lcd_wcom(0x38);           
  144.     lcd_wcom(0x0c);      
  145.     lcd_wcom(0x06);   
  146.     lcd_wcom(0x01);   
  147. }


  148. void lcd_xianshi1(void)            
  149. {
  150.         lcd_wcom(0x80+0x40);
  151.     lcd_wdat('D');
  152.     lcd_wdat('i');
  153.     lcd_wdat('a');
  154.     lcd_wdat('n');
  155.     lcd_wdat('Z');
  156.     lcd_wdat('u');

  157.         lcd_wdat(':');
  158.         lcd_wcom(0x80+0x4e);
  159.     lcd_wdat(' ');
  160.     lcd_wdat('K');
  161. }


  162. void lcd_xianshi2()            
  163. {
  164.     lcd_wcom(0x80+0x40);
  165.     lcd_wdat('D');
  166.     lcd_wdat('i');
  167.     lcd_wdat('a');
  168.     lcd_wdat('n');
  169.     lcd_wdat('R');
  170.     lcd_wdat('o');
  171.     lcd_wdat('n');
  172.     lcd_wdat('g');

  173.     lcd_wdat(':');
  174.     lcd_wcom(0x80+0x4e);
  175.     lcd_wdat('p');
  176.     lcd_wdat('F');
  177. }



  178. void xuanze()
  179. {
  180.         lcd_wcom(0x80+0x00);  //Please choose
  181.    
  182.     lcd_wdat(' ');
  183.     lcd_wdat('P');
  184.     lcd_wdat('l');
  185.     lcd_wdat('e');
  186.     lcd_wdat('a');
  187.     lcd_wdat('s');
  188.     lcd_wdat('e');
  189.     lcd_wdat(' ');

  190.         lcd_wdat('c');
  191.         lcd_wdat('h');
  192.         lcd_wdat('o');
  193.         lcd_wdat('o');
  194.         lcd_wdat('s');
  195.         lcd_wdat('e');
  196.         lcd_wdat(':');

  197.         lcd_wcom(0x80+0x40);   //Cap or Res
  198.                
  199.         lcd_wdat(' ');
  200.         lcd_wdat(' ');
  201.         lcd_wdat(' ');

  202.         lcd_wdat('C');
  203.         lcd_wdat('a');
  204.         lcd_wdat('p');
  205.         lcd_wdat(' ');

  206.         lcd_wdat('o');
  207.         lcd_wdat('r');
  208.         lcd_wdat(' ');

  209.         lcd_wdat('R');
  210.         lcd_wdat('e');
  211.         lcd_wdat('s');
  212. }


  213. void huanying()
  214. {
  215.         lcd_wcom(0x80+0x00);  //Welcome to use
  216.     lcd_wdat(' ');
  217.     lcd_wdat('W');
  218.     lcd_wdat('e');
  219.     lcd_wdat('l');
  220.     lcd_wdat('c');
  221.     lcd_wdat('o');
  222.     lcd_wdat('m');
  223.     lcd_wdat('e');
  224.     lcd_wdat(' ');

  225.         lcd_wdat('t');
  226.         lcd_wdat('o');
  227.         lcd_wdat(' ');

  228.         lcd_wdat('u');
  229.         lcd_wdat('s');
  230.         lcd_wdat('e');
  231. }

  232. void measure(void)
  233. {       
  234.         IE=0x8a;  
  235.         EA=1;
  236.         ET1=1;
  237.         ET0=1;
  238.         TMOD=0x51;
  239.         TH0=H_0;
  240.         TL0=L_0;
  241.         TH1=0;
  242.         TL1=0;

  243.         TR0=1;
  244. //        while(fw==1);                                          //测得引脚P3^5为高电平
  245.     TR1=1;                                                          //timer1 开始计数
  246. //  while(fw==0);                                        //测得引脚P3^5为低电平
  247. //  TR1=0;
  248.                                                                 //timer1 停止计数
  249. //  DL=TL1;                                                        //读当前计数值
  250. //  DH=TH1;
  251. ///        freq=DPTR;
  252. //        TH1=100;
  253. //        TL1=100;
  254. //  uu=DH*256+DPL+inte*65536;                        //计算总计数值  
  255. //  inte=0;                                                        //清累计溢出计数
  256. //  tt=uu/(12*1000000.0/12.0);                //求振荡周期
  257. //  ff=(unsigned long int)(1.0/tt);         //频率值       求震荡频率
  258. }

  259. void yunsuan (void)
  260. {
  261.         float tt=0;  
  262. //        DPH=11;
  263. //        DPL=12;
  264.         uu=DH*256+DL+inte*65536;                        //计算总计数值  
  265.         inte=0;                                                        //清累计溢出计数
  266.         tt=uu/(12*1000000.0/12.0);                //求振荡周期
  267.         ff=(unsigned long int)(1.0/tt);         //频率值       求震荡频率                       
  268. }
  269. void judgekey1()
  270. {   
  271.     long int R=0;


  272. //  R=(dat*1000)/(255-dat);
  273.         R=10*dat-130;
  274.         display(R);
  275.         LED=~LED;
  276. }

  277. void judgekey2()
  278. {   
  279.     long int C=0;
  280.         if(scd==0)
  281.         {                  
  282. //      C=3193333.0/freq;
  283.                 C=((9.4*ff)-200)*0.8;
  284.                 display1(C);
  285.                 LED=~LED;            
  286.         }
  287.         else if (scg==0)
  288.         {  
  289. //                C=3193333.0/ff;
  290.                 C=(9.4*ff)-200;
  291.                 display1(C);
  292.                 LED=~LED;
  293.         }                
  294. }
  295.                
  296.                  

  297. void display(uint x)
  298. {
  299.     uchar qian,bai1,shi1,ge1;
  300.     qian=x/1000;
  301.     bai1=(x%1000/100);
  302.     shi1=(x%100/10);
  303.     ge1=x%10;
  304. //  lcd_wcom(0x80+0x0b);
  305.         lcd_wcom(0x80+0x49);
  306.         if(qian==0)
  307.         {lcd_wdat(' ');}
  308.         else if(qian!=0)
  309.         {lcd_wdat(table[qian]);}
  310.     lcd_wdat(table[bai1]);
  311.     lcd_wdat(table[shi1]);
  312.     lcd_wdat(table[ge1]);
  313. }
  314. void display1(uint y)
  315. {
  316.         uchar qian0,bai0,shi0,ge0;
  317.         qian0=y/1000;
  318.     bai0=(y%1000/100);
  319.     shi0=(y%100/10);
  320.     ge0=y%10;
  321.         lcd_wcom(0x80+0x49);
  322.         if(qian0==0)
  323.         {lcd_wdat(' ');}
  324.         else if(qian0!=0)
  325.         {lcd_wdat(table[qian0]);}
  326.     lcd_wdat(table[bai0]);
  327.     lcd_wdat(table[shi0]);
  328.     lcd_wdat(table[ge0]);
  329. }

  330. void main(void)
  331. {       
  332. //  fw=1;
  333.         LED=0;
  334.     CH = 0x00;       //在这里选择通道 0x00或0x01
  335.         lcd_init();
  336.         measure();
  337.         sr=sc=1;   
  338.         while(1)
  339.     {
  340.         if(sr==0)
  341.         {
  342.         lcd_init();
  343.         while(sr==0)
  344.        {  
  345.                  huanying();
  346. //             fr=1;
  347. //       fc=0;
  348. //                 TR0=1;
  349. //       TR1=1;
  350. //                  measure();
  351. //                 status_F=0;
  352. //                 measure();
  353. //                 while(status_F==0);
  354.                  lcd_xianshi1();
  355. //                 TR1=1;                            
  356. //                 yunsuan();
  357.                  dat=adc0832(CH);
  358. //            dat=123;
  359. //                 display(dat);
  360.                  judgekey1();
  361. //           display();
  362.         }
  363.         }


  364.         else if(sc==0)
  365.         {
  366.         lcd_init();
  367.     while(sc==0)
  368. ……………………

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

所有资料51hei提供下载:
基于单片机的电阻电容测量 程序 仿真.rar (119 KB, 下载次数: 283)

评分

参与人数 2黑币 +51 收起 理由
z207965750 + 1 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:340538 发表于 2018-5-29 13:40 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:162514 发表于 2018-5-29 14:38 | 显示全部楼层
试一试,看看行不行!
回复

使用道具 举报

ID:368485 发表于 2018-7-10 10:27 | 显示全部楼层
aing123 发表于 2018-5-29 14:38
试一试,看看行不行!

可以用吗
回复

使用道具 举报

ID:482193 发表于 2019-4-8 16:37 | 显示全部楼层
51做的产品符合工业级吗?
回复

使用道具 举报

ID:500108 发表于 2019-4-8 16:50 | 显示全部楼层
学习,谢谢分享。。。。。。。。。。。。。。。。。
回复

使用道具 举报

ID:469694 发表于 2019-5-7 19:49 | 显示全部楼层

不可以
回复

使用道具 举报

ID:531496 发表于 2019-5-9 17:57 | 显示全部楼层
给力。。。。。
回复

使用道具 举报

ID:532147 发表于 2019-5-10 04:08 来自手机 | 显示全部楼层
新手 上路 回去试试
回复

使用道具 举报

ID:597549 发表于 2019-8-8 16:55 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:611931 发表于 2019-9-17 10:59 | 显示全部楼层
有基于51单片机的电容测量仪的整个资料吗?我觉得你这个还是很好的 但是我只想要电容的 而且要详细的 感谢
回复

使用道具 举报

ID:138119 发表于 2019-9-17 13:40 | 显示全部楼层
挺好的,加油!
回复

使用道具 举报

ID:624946 发表于 2019-10-16 11:38 | 显示全部楼层
学习一下  
回复

使用道具 举报

ID:498463 发表于 2019-11-17 16:41 | 显示全部楼层
下载下来了,却不知道怎么用,程序跟图对不上
回复

使用道具 举报

ID:695764 发表于 2020-5-10 12:17 | 显示全部楼层
程序里面有条解释是:启用ADC0832,但仿真里面为什么没有这个软件
回复

使用道具 举报

ID:729886 发表于 2020-5-10 16:13 | 显示全部楼层
想装一台不知道测量阻值精度如何
回复

使用道具 举报

ID:639106 发表于 2020-5-10 16:59 | 显示全部楼层
真牛。顶一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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