找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3698|回复: 6
收起左侧

基于单片机的电容测量仪设计,原理图仿真,代码压缩包

[复制链接]
ID:444900 发表于 2020-5-18 00:05 | 显示全部楼层 |阅读模式
前段时间智能仪器结课做的,
电容测量仪,
里面有proteus仿真文件,单片机代码
9(FME${Q83067%D0SWNJ(%Q.png 4VV]BZ4}%)EYWITKYJLB_1X.png

单片机源程序如下:
  1. #include <reg52.h>
  2.         #include<intrins.h> //库函数
  3.        
  4.         #define DATA P0
  5.         sbit RW=P2^6;       //1602写数据
  6.         sbit RS=P2^5;       //1602写地址
  7.         sbit EN=P2^7;       //1602工作使能
  8.         sbit b_test=P3^7;   //开始测量电容的按键输入
  9.         sbit _reset=P3^6;   //555时基芯片工作控制信号
  10.         unsigned int T_flag,N,C,i,Dis1,Dis0;
  11.         unsigned int b[6]={0X13,0X0D,0X00,0X00,0X25,0X16};   //显示C=00UF
  12.        
  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);//开显示,不开光标
  75.        
  76.         }
  77.        
  78.         /***********显示函数**************/
  79.         void Display(void) //显示函数
  80.         {
  81.         unsigned char i,j;
  82.          unsigned char a[16]={'c','e','s','h','i','z','h','o','n','g','.','.','.','.'};//显示ceshizhong....
  83.          LCDINIT();
  84.          for(i=0;i<15;i++)//写显示第一行
  85.           { wcomd(0x80+i);
  86.             Delay1ms(1);
  87.             wdata(a[i]);
  88.             Delay1ms(1);
  89.            }
  90.          for(j=0;j<6;j++)//写显示第二行
  91.          {
  92.           wcomd(0xc0+j);
  93.           Delay1ms(1);
  94.           wdata(0x30+b[j]);
  95.           Delay1ms(1);
  96.           }
  97.         Delay1ms(150);
  98.         }
  99.         void main()
  100.         {
  101.           IE=0x81;                          //打开全部的中断控制,并开启外部中断允许
  102.           TMOD=0x09;                        //T0为16位计数工作方式1
  103.           IT0=1;                            //设置外部中断的触发的方式为脉冲触发
  104.           TH0=0x00;
  105.           TL0=0x00;
  106.           T_flag=0;
  107.           _reset=0;
  108.           while(1)
  109.           {
  110.             while(!b_test)                   //如果有测量按键输入就往下执行
  111.             {
  112.              i=0;
  113.              _reset=1;                      //启动555时基芯片
  114.              EX0=1;          //开启中断0
  115.              while(_reset)   //超出等待时间,中断还没有过来,就退出
  116.               {
  117.                i++;
  118.                if(i>5000)   //设置最长等待时间
  119.                 {
  120.                  _reset=0;  //最长等待时间到还没有中断,停止555
  121.                 }
  122.               }
  123.              if(N<800)         //如果计数值小于100,显示SM,表示应换用小一点的量程
  124.               {
  125.                b[3]=0X1D;
  126.                b[2]=0X23;
  127.               }
  128.              if(N>5000)        //如果计数值大于5000,显示LA,表示应换用大一点的量程
  129.               {
  130.                b[3]=0X11;
  131.                b[2]=0X1C;
  132.               }
  133.              if(N>=800 && N<=5000)
  134.               {
  135.                C=N/100;         //计算电容的大小
  136.                //if(C>=10)
  137.                                  //{
  138.                                  b[2]=C/10; //计算电容值的十位
  139.                                  b[3]=C-b[2]*10; //计算电容值的个位
  140.                                  //}
  141.                                         /*else
  142.                                         {
  143.                                         b[2]=0;      
  144.                                         b[3]='.';
  145.                 b[4]=C;                                       
  146.                        
  147.                                         }*/
  148.                                          
  149.                                 }
  150.              }
  151.             Display(); //显示电容的大小
  152.            }
  153.         }
  154.         void int0(void) interrupt 0   //第一次中断开始计数,第二个中断停止计数
  155.         {
  156.           T_flag=!T_flag;
  157.           if(T_flag==1)
  158.           {
  159.            TR0=1;         //开始计时
  160.           }
  161.           if(T_flag==0)
  162.           {
  163.            TR0=0;         //停止计时
  164.            EX0=0;         //关闭中断
  165.            _reset=0;      //停止发出方波
  166.            N=TH0*256+TL0; //计算计数器的值
  167.            N=N*4.93/3;
  168.            TH0=0x00;      //恢复初值
  169.            TL0=0x00;
  170.           }
  171.          }
复制代码

所有资料51hei提供下载:
电容测量仪.zip (54.41 KB, 下载次数: 187)

评分

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

查看全部评分

回复

使用道具 举报

ID:284488 发表于 2020-5-18 08:45 | 显示全部楼层
刚好需要,感谢楼主分享。
回复

使用道具 举报

ID:710285 发表于 2020-5-26 22:51 | 显示全部楼层
误差是多少啊
回复

使用道具 举报

ID:760449 发表于 2020-10-9 11:54 | 显示全部楼层
感谢楼主分享,正好在做一个项目能用上
回复

使用道具 举报

ID:647434 发表于 2020-10-11 17:40 | 显示全部楼层
要protue8.6以上才能运行
回复

使用道具 举报

ID:864317 发表于 2020-12-20 23:54 | 显示全部楼层
测量范围多少啊
回复

使用道具 举报

ID:3802 发表于 2022-12-20 11:18 | 显示全部楼层

刚好需要,感谢楼主分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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