单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电容表的proteus仿真与源程序

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

测量电容需要三步  1、按下"量程选择按键" 2、按下"开始测量按键" 3、按下"最终显示按键"



单片机源程序如下:
  1. #include<reg52.h>
  2. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  3. sbit LATCH1=P3^0;//定义锁存使能端口 段锁存
  4. sbit CAP=P1^2;//运放输出连接端,当输出高电平时停止计时
  5. sbit nf=P3^1;//测量控制总按键,低电平有效
  6. sbit lm1=P1^3;
  7. sbit lm2=P1^4;
  8. sbit lm3=P1^5;
  9. sbit lm4=P1^6;
  10. sbit  key1=P3^2;
  11. sbit  key2=P3^3;
  12. sbit  key3=P3^4;
  13. sbit  key4=P3^5;

  14. unsigned int num;
  15. unsigned char code
  16. dofly_DuanMa1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F,不显示小数点。
  17. unsigned char code
  18. dofly_DuanMa2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};// 显示段码值0~F,显示小数点。

  19. dofly_WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码
  20. unsigned char TempData[8]; //存储显示值的全局变量

  21. void Delay(unsigned int t); //延时函数声明
  22. void delayms(unsigned char t);
  23. void Display(unsigned char FirstBit,unsigned char Num);
  24. void  ke1(void) ;
  25. void  ke2(void) ;
  26. void  ke3(void) ;
  27. void  ke4(void) ;

  28. void  ke1(void)
  29. {
  30.    TempData[0]=dofly_DuanMa1[num%1000/100];
  31.    TempData[1]=dofly_DuanMa1[num%1000%100/10];
  32.    TempData[2]=dofly_DuanMa2[num/1000];          
  33.    TempData[3]=dofly_DuanMa1[num%1000%100%10];
  34.    TempData[4]=0x73;
  35.    TempData[5]=0x71;          
  36. }

  37. void ke2(void)
  38. {
  39.         TempData[0]= dofly_DuanMa1[num%1000/100];
  40.     TempData[1]=dofly_DuanMa2[num/1000];
  41.     TempData[2]=dofly_DuanMa1[num%1000%100/10];
  42.     TempData[3]=dofly_DuanMa1[num%1000%100%10];
  43.         TempData[4]=0x73;                                                                                                               
  44.     TempData[5]=0x71;
  45. }

  46. void ke3(void)
  47. {
  48.    TempData[0]=dofly_DuanMa1[num%1000/100];
  49.    TempData[1]=dofly_DuanMa1[num%1000%100/10];
  50.    TempData[2]=dofly_DuanMa2[num/1000];          
  51.    TempData[3]=dofly_DuanMa1[num%1000%100%10];
  52.         TempData[4]=0x3e;
  53.     TempData[5]=0x71;
  54. }

  55. void  ke4(void)
  56. {
  57.    TempData[0]=dofly_DuanMa1[num%1000%100/10];                                         
  58.    TempData[1]=dofly_DuanMa2[num%1000%100%10];                                       
  59.    TempData[2]=dofly_DuanMa1[num/1000];
  60.    TempData[3]=dofly_DuanMa1[num%1000/100];
  61.    TempData[4]=0x3e;
  62.    TempData[5]=0x71;
  63.         }

  64. bit key(void)
  65. {
  66.     if(nf==0)
  67.         {
  68.           delayms(10);
  69.           if(nf==0)
  70.          return 0;
  71.           }
  72.           else
  73.           return 1;
  74. }
  75.        
  76. void Delay(unsigned int t)
  77. {
  78. while(--t);
  79. }
  80. void delayms(unsigned char t)      //约延时1ms
  81.   {
  82.   while(--t)
  83.   {
  84.   Delay(245);
  85.   Delay(245);
  86.        }
  87.          }

  88. void Display(unsigned char FirstBit,unsigned char Num)
  89. {
  90.       unsigned char i;
  91.           
  92.           for(i=0;i<Num;i++)
  93.            {
  94.            DataPort=0;   //清空数据,防止有交替重影
  95.        LATCH1=1;     //段锁存
  96.        LATCH1=0;
  97.    P2=dofly_WeiMa[i+FirstBit]; //取位码
  98.    DataPort=TempData[i]; //取显示数据,段码
  99.        LATCH1=1;     //段锁存
  100.        LATCH1=0;
  101.        Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影
  102. }
  103. }

  104. void main()
  105. {
  106.      P2=0x00;
  107.          TMOD=TMOD|0x01;//选择计数方式,定时计数器1
  108.      EA=1;
  109.      ET0=1;
  110.      TH0=0x00;
  111.      TL0=0x00;// 装入计数初值,即为0
  112.           while(1)
  113.      {
  114.             if (key1==0)
  115.                 {
  116.                    Delay(10);
  117.                    if (key1==0)
  118.                    lm1=0;
  119.                    while(key()==1);
  120.                    lm1=1;
  121.                    TR0=1;
  122.                    Delay(10);
  123.                    while(CAP==0);
  124.            TR0=0;
  125.            num=TH0*256+TL0+10;
  126.                   
  127.            if(num>2100)  //超出测量范围是显示1
  128.           {
  129.            TempData[0]=0x06;
  130.            TempData[1]=TempData[2]=TempData[3]=0x00;
  131.                    TempData[4]=TempData[5]=0x00;
  132.            }
  133.           else
  134.                    {
  135.                    ke1();
  136.                    }
  137.                     while(1)
  138.            {
  139.                 Display(0,6);
  140.                }                  
  141.                   }
  142.             else if (key2==0)
  143.                 {
  144.                    Delay(10);
  145.                    if (key2==0)
  146.                    lm2=0;
  147.                    while(key()==1);
  148.                    lm2=1;
  149.                    TR0=1;
  150.                    Delay(10);
  151.                    while(CAP==0);
  152.            TR0=0;
  153.            num=TH0*256+TL0+200;
  154.                     if(num>2100)  //超出测量范围是显示1
  155.           {
  156.            TempData[0]=0x06;
  157.            TempData[1]=TempData[2]=TempData[3]=0x00;
  158.                       TempData[4]=TempData[5]=0x00;
  159.            }
  160.           else
  161.                    {
  162.                    ke2();
  163.                    }
  164.                     while(1)
  165.            {
  166.                 Display(0,6);
  167.                 }                  
  168.                   }
  169.             else if (key3==0)
  170.                 {
  171.                    lm3=0;
  172.                    while(key()==1);
  173.                    lm3=1;
  174.                    TR0=1;
  175.                    Delay(10);
  176.                    while(CAP==0);
  177.            TR0=0;
  178.            num=TH0*256+TL0+40;
  179.                     if(num>2100)  //超出测量范围是显示1
  180.           {
  181.            TempData[0]=0x06;
  182.            TempData[1]=TempData[2]=TempData[3]=0x00;
  183.                       TempData[4]=TempData[5]=0x00;
  184.            }
  185.           else
  186.                    {
  187.                    ke3();
  188.                    }
  189.                     while(1)
  190.            {
  191.                  Display(0,6);
  192.                 }                  
  193.                   }
  194.             else if (key4==0)
  195.                 {
  196.                
  197.                    Delay(10);
  198.                    if (key4==0)
  199. ……………………

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

所有资料51hei提供下载:
电容表仿真.zip (105.29 KB, 下载次数: 18)





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

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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