找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DIY小型电压表

  [复制链接]
跳转到指定楼层
楼主
这款电路简单制作容易的STC12C2052AD单片机0-9.9V电压表,电路简单,元件少,容易制作,PCB板为单面板,下面是制作好的实物。文后附有原理图、源程序等资料。


单片机源程序如下:
  1. #include <STC12C2052AD.H>         //单片机头文件
  2. #include <intrins.h>                 //51基本运算(包括_nop_空函数)
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit temp=P1^7;
  6. sbit LED3=P3^0;  //C
  7. sbit LED0=P1^4;  //        小数点后一位
  8. sbit LED1=P1^3;  //个位
  9. sbit LED2=P1^0;  //        十位
  10. sbit A=P1^1;
  11. sbit B_B=P1^5;
  12. sbit C=P3^2;
  13. sbit D=P3^4;
  14. sbit E=P3^5;
  15. sbit F=P1^2;
  16. sbit G=P3^1;
  17. sbit H=P3^3;  //小数点

  18. char d[5];
  19. uint R,M,N,h;//若定义成uchar型就只能显示2.5V以下的数值

  20. void dm(mz);

  21. void delayus(uint x)         //(x+1)*6微
  22. {

  23.         while(x--);
  24. }


  25. /*****************************************************************
  26. 函数名:毫秒级CPU延时函数
  27. 调  用:delay (?);
  28. 参  数:1-65535(参数不可为0)
  29. 返回值:无
  30. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  31. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  32. /******************************************************************/
  33. void delay(uint t)
  34. {
  35. uint i;                               //定义变量
  36. for(;t>0;t--)                     //如果t大于0,t减1(外层循环)
  37.   for(i=600;i>0;i--);       //i等于124,如果i大于0,i减1
  38. }
  39. /*******************************************************************
  40. 函数名:ADC初始化及8位A/D转换函数
  41. 返回值:8位的ADC数据
  42. 结  果:读出指定ADC接口的A/D转换值,并返回数值
  43. 备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
  44. *******************************************************************/
  45. uchar Read (uchar CHA)
  46. {
  47.         uchar AD_FIN=0;                 //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示
  48.         /******以下为ADC初始化程序****************************/
  49.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  50.     ADC_CONTR = 0x60;                  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  51.     _nop_();
  52.     ADC_CONTR |= CHA;       //选择A/D当前通道
  53.     _nop_();
  54.     ADC_CONTR |= 0x80;             //启动A/D电源
  55.     delay(1);                    //使输入电压达到稳定(1ms即可?
  56.         /******以下为ADC执行程序****************************/
  57.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  58.     _nop_();
  59.     _nop_();
  60.     _nop_();
  61.     _nop_();
  62.     while (AD_FIN ==0)           //等待A/D转换结束
  63.         {     
  64.             AD_FIN = (ADC_CONTR & 0x10);         //0001 0000测试A/D转换结束否
  65.     }
  66.     ADC_CONTR &= 0xE7;                              //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  67.         return (ADC_DATA);                          //返回A/D转换结果(8位)
  68. }
  69. /******************************************************************
  70. 显示函数转换函数:
  71. M=模拟量采样值,N=基准电压源采样值(本例为2.5V),R=模拟量输入值(待显示值)
  72. N=256*2.5/Vcc;变形后得Vcc=256*2.5/N; 代入M=256*R/Vcc;得到M=R*N/2.5;变形后得R=M*2.5/N
  73. 1.105为输入端分压比。
  74. ******************************************************************/
  75. void transfer(void)
  76. {
  77.         M=Read(6);                                //P1.6口模拟量转换
  78.         N=Read(7);                                //P1.7口2.5V基准电压源采样(转换)
  79.         R=((M*2.5)/N)*198;                //输入模拟量换算并放大500倍;
  80.         /***以下为3位显示转换***/
  81.         h=R;
  82.         d[3]=R/1000;
  83.         R=R%1000;
  84.         d[2]=R/100;
  85.         R=R%100;
  86.         d[1]=R/10;
  87.         d[0]=R%10;

  88. }
  89. /**********显示函数(未优化)************************************************/
  90. void xian_shi (void)
  91. {
  92.         if(h>999)
  93.         {
  94.                 d[3]=10;
  95.                 d[2]=10;
  96.                 d[1]=10;
  97.                 d[0]=10;
  98.         }
  99.         if(d[3]==0)       
  100.         d[3]=11;
  101.         dm(d[3]);
  102.         LED3=1;
  103.         delayus(5);
  104.         LED3=0;
  105.         delayus(30);
  106.         dm(d[2]);
  107.         LED2=1;
  108.         delayus(5);
  109.         LED2=0;
  110.         delayus(30);
  111.         dm(12);
  112.         LED2=1;
  113.         delayus(1);
  114.         LED2=0;
  115.         delayus(400);
  116.         dm(d[1]);
  117.         LED1=1;
  118.         delayus(5);
  119.         LED1=0;
  120.         delayus(30);
  121.         dm(d[0]);
  122.         LED0=1;
  123.         delayus(5);
  124.         LED0=0;
  125.         delayus(30);
  126. }


  127. void dm(mz)
  128. {
  129.         switch(mz)
  130.         {
  131.                 case 0:A=0;B_B=0;C=0;D=0;E=0;F=0;G=1;H=1;break;
  132.                 case 1:A=1;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break;
  133.                 case 2:A=0;B_B=0;C=1;D=0;E=0;F=1;G=0;H=1;break;
  134.                 case 3:A=0;B_B=0;C=0;D=0;E=1;F=1;G=0;H=1;break;
  135.                 case 4:A=1;B_B=0;C=0;D=1;E=1;F=0;G=0;H=1;break;
  136.                 case 5:A=0;B_B=1;C=0;D=0;E=1;F=0;G=0;H=1;break;
  137.                 case 6:A=0;B_B=1;C=0;D=0;E=0;F=0;G=0;H=1;break;
  138.                 case 7:A=0;B_B=0;C=0;D=1;E=1;F=1;G=1;H=1;break;
  139.                 case 8:A=0;B_B=0;C=0;D=0;E=0;F=0;G=0;H=1;break;
  140.                 case 9:A=0;B_B=0;C=0;D=0;E=1;F=0;G=0;H=1;break;
  141.                 case 10:A=0;B_B=1;C=1;D=0;E=0;F=0;G=1;H=1;break; //C
  142.                 case 11:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=1;break; //不显示
  143.                 case 12:A=1;B_B=1;C=1;D=1;E=1;F=1;G=1;H=0;break; //小数点
  144.         }
  145. }


  146. /******************************************************************
  147. 函数名:主函数
  148. 调  用:无
  149. 参  数:无
  150. 返回值:无
  151. 结  果:程序开始处,无限循环
  152. 备  注:
  153. ******************************************************************/
  154. void main (void)
  155. {
  156.     P1M0 = 0xC0;               
  157.     P1M1 = 0x19;   
  158.     P3M0=0x00;
  159.     P3M1=0x01;
  160.         LED0=0;
  161.         LED1=0;
  162.         LED2=0;  
  163.         LED3=0;  

  164.         while(1)
  165.         {
  166.                 uint i;
  167.                 i++;
  168.                 if (i==500)
  169.                 {
  170.                         transfer();
  171.                         i=0;
  172.                 }
  173.                 xian_shi();
  174.         }
  175. }
复制代码

所有资料51hei提供下载:
电压表.zip (133.86 KB, 下载次数: 146)

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

使用道具 举报

沙发
ID:23606 发表于 2020-1-2 09:03 | 只看该作者
谢谢分享!!!!
回复

使用道具 举报

板凳
ID:16255 发表于 2020-3-4 23:23 | 只看该作者
不错。
谢谢分享!!
回复

使用道具 举报

地板
ID:60026 发表于 2020-3-5 19:09 | 只看该作者
谢谢分享!!!!
回复

使用道具 举报

5#
ID:703120 发表于 2020-3-5 20:09 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

6#
ID:163501 发表于 2020-3-5 21:47 | 只看该作者
已下载,学习中。
回复

使用道具 举报

7#
ID:153818 发表于 2020-3-6 22:07 | 只看该作者
有没有电路图?参考下。
回复

使用道具 举报

8#
ID:261884 发表于 2020-3-7 11:17 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

9#
ID:445996 发表于 2020-3-26 12:53 | 只看该作者
1.105为输入端分压比能问一下 这个怎么得到吗 谢谢
回复

使用道具 举报

10#
ID:777500 发表于 2020-6-12 17:33 | 只看该作者
感谢楼主分享 下载学习一下正需要做一款摩托车电瓶的电压显示表
回复

使用道具 举报

11#
ID:873423 发表于 2021-7-26 21:43 | 只看该作者
R=((M*2.5)/N)*198; 198是啥意思?请解答一下,非常感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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