找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简单易制作的0-30VSTC单片机数字电压表

  [复制链接]
跳转到指定楼层
楼主
ID:76686 发表于 2015-4-11 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    这块简单易制作的0-30VSTC单片机数字电压表,被测电压经限流电阻接到AD检测端并由分流电阻分流,读出8位(256)的AD数据,由AD值计算出AD端电压,即分流点电压,由此电压计算出分流电流,再由此电流计算出输入电压。使用STC12C5204AD单片机,P0.0-P0.3 共阴数码管位、P2 为共阴数码管段a-g dp,P0、P2 设置为推挽输出,段输出加限流电阻,AD为8位,计算方法:5/256=0.0195312V,分流电阻为实测阻值。AD值*0.0195312v/对地分流电阻,算出分流电流,然后用分流电流*分流电阻与限流电阻之和即为要显示的输入电压值,业余使用,精度已经够用了。STC12C5204AD头文件 网上多的是,大家搜一下就会找到的,其中涉及到端口设置的地方大家对照芯片手册更正。

简单易制作的0-30VSTC单片机数字电压表源程序:
  1. #include <STC12C52.H>  //STC12C5204AD头文件

  2. #include <intrins.h>   //_nop_();

  3. #define uchar unsigned char

  4. #define uint  unsigned int


  5. //sfr ADC_CONTR=0XBC;//adc使能位.ADC电源控制位

  6. sfr ADC_RES=0XBD;// adc数据高八位,即ADC值

  7. sfr P1ASF=0X9D;//P1各端口ADC使能端

  8. uchar led_bcd[]={0x3F,/*0*/  //共阴数码管

  9.           0x06,/*1*/

  10.           0x5B,/*2*/

  11.           0x4F,/*3*/

  12.           0x66,/*4*/

  13.           0x6D,/*5*/

  14.           0x7D,/*6*/

  15.           0x07,/*7*/

  16.           0x7F,/*8*/

  17.           0x6F,/*9*/

  18.     0x00,/* */

  19.     0x7c /*b*/

  20.     }

  21.     ,ad_data

  22.     ;

  23. uint data dis[5]={0x00,0x00,0x00,0x00,0x00},ZZ; //定义四个显示数据单元和一个数据存储单元

  24. //dis[4,3,2,1,5]  显示:12.34   5为存储单元


  25. /*******************************************************************/

  26. /*  延时子程序                                                                                                                                 */

  27. /*                                                                                                                  */

  28. /*                                                                                                                                  */

  29. /*******************************************************************/

  30. void delay(uint z)    //延时子函数

  31. {  

  32.    uchar de1,de2;

  33.   for(de1=z;de1>0;de1--)

  34.   for(de2=100;de2>0;de2--);  

  35. }

  36. /*******************************************************/

  37. //显示子函数 display(h1,h2,h3,h4)

  38. //h1,h2,h3,h4 为四位LED数码管显示变量

  39. //

  40. //

  41. //

  42. /*******************************************************/

  43. void display(uchar h1,uchar h2,uchar s1,uchar s2)   ////LED显示函数(参数:LED1,LED2,LED3,LED4)

  44. {


  45. // 第一个数码管显示数据

  46. if(h1==0x3f) h1=0x00;   //0消隐语句

  47. P2=h1;

  48.   //delay(2);

  49. P00=0;

  50.   delay(2);   //参数2-10   数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.

  51. P2=0X00;

  52. P00=1;

  53. /*******************************************************/

  54. // 第二个数码管显示数据

  55. P2=h2|0x80;

  56.   //delay(2);

  57. P01=0;

  58.   delay(2);  //参数2-10   数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.

  59. P2=0X00;

  60. P01=1;

  61. //delay(5);

  62. /*******************************************************/

  63. // 第三个数码管显示数据


  64. P2=s1;

  65.   //delay(2);

  66. P02=0;

  67.   delay(2); //参数2-10   数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.

  68.   P2=0X00;

  69.     P02=1;

  70. // delay(5);

  71. /*******************************************************/

  72. // 第四个数码管显示数据

  73. P2=s2;

  74.   //delay(2);

  75. P03=0;

  76.   delay(2); //参数2-10   数值大LED亮度高但闪烁感强,数值小LED亮度低,但闪烁感小.

  77.   P2=0X00;

  78. P03=1;


  79. //delay(5);


  80. }

  81. void init()//系统初始化函数

  82. {

  83. P2M1=0Xff; //强推挽   推动a-g dp

  84. P2M0=0X00; //强推挽   推动a-g dp

  85. P0M1=0X0f; //强推挽   推动位

  86. P0M0=0X00; //强推挽   推动位

  87. P0=0XFF;   //初始化

  88. P2=0;    //初始化

  89. /***定时器0初始化设置*****/  

  90. TMOD = 0x01;

  91.     TH0 = 0xFC;  //初值1ms

  92.     TL0 = 0x18;  //初值1ms

  93.     EA = 1;   //开总中断

  94.     ET0 = 1;  //定时器0中断打开

  95.     TR0 = 1;  //打开定时器 开始计时

  96. /*************************/

  97. ZZ=0;

  98. }

  99. void initADC()  //AD初始化

  100. {

  101. P1ASF=0x01;//只使用P1.0端口做为ADC输入端.

  102. ADC_RES=0;//ADC数据寄存器清零

  103. ADC_CONTR=ADC_POWER|ADC_SPEEDLL;  //打开ADC开关并设置 转换速率详见STC12C52.H

  104. delay(2);  //打开ADC并延时.

  105. }

  106. uchar readADC()   //读AD

  107. {

  108. ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;

  109. _nop_();

  110. _nop_();

  111. _nop_();

  112. _nop_();

  113. while(!(ADC_CONTR&ADC_FLAG));//等待转换完成标志

  114. ADC_CONTR&=~ADC_FLAG;//close ADC

  115. return ADC_RES;//返回ADC值.

  116. }

  117. void main()

  118. {

  119. init();

  120. initADC();//初始化ADC

  121. ad_data=readADC();//开机转换

  122. while(1)

  123. {

  124.   float j;

  125.   uchar ad_data;

  126.   while(ZZ>=500) //500毫秒读一次ADC

  127.   {

  128.    ad_data=readADC();//读入ADC数据

  129.    ZZ=0;

  130.   }

  131.   j=ad_data*19.5312;//由AD数据*19.5312(放大1000倍)=分流后的电压

  132.   j=j/9890; //j(电压)/接地电阻(实测)9890欧

  133.   j=j*60190;//j(电流)*(输入限流电阻(实测)60190欧+接地电阻(实测)9890欧) 计算出实际输入电压 如果使用高精度电阻,则直接输入电阻值

  134.   dis[4]=j/1000;

  135.   dis[3]=dis[4]/10;

  136.   dis[2]=dis[4]%10;

  137.   //h=(h-(dis[3]*10+dis[2]))*100;

  138.   dis[4]=j/10-dis[4]*100;

  139.   //dis[4]=j%100;//小数位第一位

  140.   dis[1]=dis[4]/10;

  141.   dis[0]=dis[4]%10;//小数位第二位

  142.   //delay(10000);

  143. }

  144. }

  145. void Timer0Interrupt(void) interrupt 1

  146. {

  147.     ZZ++;   //AD读取间隔时间控制

  148. TH0 = 0xFC;

  149.     TL0 = 0x18;

  150. display(led_bcd[dis[3]],led_bcd[dis[2]],led_bcd[dis[1]],led_bcd[dis[0]]);

  151.    }
复制代码




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

使用道具 举报

沙发
ID:79544 发表于 2015-8-20 17:12 | 只看该作者
找不到STC12C5204ad.h的头文件,来源分享出来吗?谢谢
回复

使用道具 举报

板凳
ID:100141 发表于 2015-12-23 15:58 | 只看该作者
要用LCD显示
回复

使用道具 举报

地板
ID:195950 发表于 2017-5-4 15:15 | 只看该作者
很强大
回复

使用道具 举报

5#
ID:200118 发表于 2017-6-16 20:53 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
ID:238760 发表于 2017-10-12 08:54 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:153371 发表于 2018-1-20 10:33 | 只看该作者
Build target 'Target 1'
compiling 30vdyb.c...
30VDYB.C(53): error C202: 'P00': undefined identifier
30VDYB.C(56): error C202: 'P00': undefined identifier
30VDYB.C(66): error C202: 'P01': undefined identifier
30VDYB.C(72): error C202: 'P01': undefined identifier
30VDYB.C(85): error C202: 'P02': undefined identifier
30VDYB.C(91): error C202: 'P02': undefined identifier
30VDYB.C(103): error C202: 'P03': undefined identifier
30VDYB.C(109): error C202: 'P03': undefined identifier
30VDYB.C(161): error C202: 'ADC_POWER': undefined identifier
30VDYB.C(171): error C202: 'ADC_POWER': undefined identifier
30VDYB.C(181): error C202: 'ADC_FLAG': undefined identifier
30VDYB.C(183): error C202: 'ADC_FLAG': undefined identifier
Target not created
回复

使用道具 举报

8#
ID:249545 发表于 2018-1-20 22:27 | 只看该作者
可能是太普通了吧,总觉得8位的ADC没什么用,做做课题,试验而已,不能用来做产品,做产品要14或16位还差不多.

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:334473 发表于 2018-5-27 09:16 | 只看该作者
我想问一下
j=ad_data*19.5312;//由AD数据*19.5312(放大1000倍)=分流后的电压
这个19.5312是怎么来的
回复

使用道具 举报

10#
ID:344278 发表于 2018-6-4 07:37 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

11#
ID:398477 发表于 2018-11-24 12:34 来自手机 | 只看该作者
19.5312为什么要放大1000倍?
回复

使用道具 举报

12#
ID:410591 发表于 2018-12-13 20:48 | 只看该作者
留住这一刻2014 发表于 2018-11-24 12:34
19.5312为什么要放大1000倍?

要显示三位小数
回复

使用道具 举报

13#
ID:378732 发表于 2018-12-26 23:04 | 只看该作者
13680172313 发表于 2018-5-27 09:16
我想问一下
j=ad_data*19.5312;//由AD数据*19.5312(放大1000倍)=分流后的电压
这个19.5312是怎么来的

这个是分辨率吧。
回复

使用道具 举报

14#
ID:598951 发表于 2022-7-5 11:38 | 只看该作者
Build target 'Target 1'
compiling 5204四位.c...
5204四位.c(1): warning C318: can't open file 'STC12C52.H'
5204四位.C(96): error C202: 'P2': undefined identifier
5204四位.C(100): error C202: 'P00': undefined identifier
5204四位.C(104): error C202: 'P2': undefined identifier
5204四位.C(106): error C202: 'P00': undefined identifier
5204四位.C(112): error C202: 'P2': undefined identifier
5204四位.C(116): error C202: 'P01': undefined identifier
5204四位.C(120): error C202: 'P2': undefined identifier
5204四位.C(122): error C202: 'P01': undefined identifier
5204四位.C(131): error C202: 'P2': undefined identifier
5204四位.C(135): error C202: 'P02': undefined identifier
5204四位.C(139): error C202: 'P2': undefined identifier
5204四位.C(141): error C202: 'P02': undefined identifier
5204四位.C(149): error C202: 'P2': undefined identifier
5204四位.C(153): error C202: 'P03': undefined identifier
5204四位.C(157): error C202: 'P2': undefined identifier
5204四位.C(159): error C202: 'P03': undefined identifier
5204四位.C(171): error C202: 'P2M1': undefined identifier
5204四位.C(173): error C202: 'P2M0': undefined identifier
5204四位.C(175): error C202: 'P0M1': undefined identifier
5204四位.C(177): error C202: 'P0M0': undefined identifier
5204四位.C(179): error C202: 'P0': undefined identifier
5204四位.C(181): error C202: 'P2': undefined identifier
5204四位.C(185): error C202: 'TMOD': undefined identifier
5204四位.C(187): error C202: 'TH0': undefined identifier
5204四位.C(189): error C202: 'TL0': undefined identifier
5204四位.C(191): error C202: 'EA': undefined identifier
5204四位.C(193): error C202: 'ET0': undefined identifier
5204四位.C(195): error C202: 'TR0': undefined identifier
5204四位.C(211): error C202: 'ADC_CONTR': undefined identifier
5204四位.C(221): error C202: 'ADC_CONTR': undefined identifier
5204四位.C(231): error C202: 'ADC_CONTR': undefined identifier
5204四位.C(233): error C202: 'ADC_CONTR': undefined identifier
5204四位.C(301): error C202: 'TH0': undefined identifier
5204四位.C(303): error C202: 'TL0': undefined identifier
Target not created
回复

使用道具 举报

15#
ID:703081 发表于 2023-2-16 09:56 | 只看该作者
不做电流显示吗
回复

使用道具 举报

16#
ID:537530 发表于 2023-9-23 01:33 | 只看该作者
验证一下
回复

使用道具 举报

17#
ID:227484 发表于 2023-9-25 16:36 | 只看该作者
要是能测电压0-100V,能显示电流功率就好了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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