找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机1602电压电流表制作

  [复制链接]
跳转到指定楼层
#
学习了好久工作原因不能接触单片机,纯属爱好学习,程序借鉴的论坛里的,引脚自己定义了下,感觉精度可以,没有测试

/******引脚说明LCD液晶RS2.5  RW2.6    E2.7       DB0~DB7:P0.0~P0.7
电压测量P1.1;需要0~30v需要加分流电阻,,分辨率0.03v;
电流侧量P1.7;需要加放大电路如lm358;op07等,分辨率3ma
**********/
  1. //stc12c5a60                        
  2. #include<STC12C5A60S2.h>
  3. #include<stdio.h>
  4. #include<intrins.h>//头文件

  5. #define uchar unsigned char//宏定义
  6. #define uint unsigned int//宏定义
  7. #define ulint unsigned long int//宏定义
  8. #define N 21//ADC中值滤波次数,必须为基数
  9. #define ISP_TRIG() ISP_TRIG=0x5A,ISP_TRIG=0xA5//ISP触发命令

  10. sbit rs=P3^5;//液晶RS
  11. sbit rw=P3^6;//液晶RW
  12. sbit e=P3^4;//液晶E

  13. void AD_init(void);//ADC初始化
  14. void delay(uint z);//延时函数
  15. uint AD_get(uchar haha );//读ADC的数值
  16. void LCD_data(uchar shuju);//写数据
  17. void zhiling(uchar zhilin);//写指令
  18. void LCD_init(void);//初始化LCD
  19. void tablex(uint tab);//数据分解
  20. uint filter(uchar dat);//中值滤波
  21. void timer_init(void);//定时器初始化

  22. uchar h1,h2,h3,h4;//LCD显示变量
  23. ulint mas,maz;//容量计算

  24. uchar table[]="0123456789";//显示数组
  25. uchar table1[]=".VAWa";

  26. void main()
  27. {
  28.         ulint tempv,tempa;//存放电压电流值
  29.         AD_init();//ADC初始化
  30.         timer_init();//定时器初始化
  31.         LCD_init();//LCD初始化
  32.         while(1)
  33.         {
  34.                 tempv=filter(0x88);//设置ADC通道0、开始转换
  35.                 tablex(tempv*3);//分解数据
  36.                 zhiling(0x80);//LCD地址
  37.                 LCD_data(table[h1]);//
  38.                 LCD_data(table[h2]);//
  39.                 LCD_data(table1[0]);//
  40.                 LCD_data(table[h3]);//
  41.                 LCD_data(table[h4]);//
  42.                 LCD_data(table1[1]);//显示
  43.                
  44.                 tempa=filter(0x8f);//设置ADC通道7、开始转换
  45.                 if(tempa<=10)//防止数据成负数
  46.                         tempa=10;
  47.                 mas=tempa*3-30;//计算容量取样赋值
  48.                 tablex(tempa*3-30);//减去LM358失调的数值
  49.                 zhiling(0x88);//LCD地址
  50.                 LCD_data(table[h1]);
  51.                 LCD_data(table1[0]);
  52.                 LCD_data(table[h2]);
  53.                 LCD_data(table[h3]);
  54.                 LCD_data(table[h4]);
  55.                 LCD_data(table1[2]);
  56.                
  57.                 tablex((tempv*3/10)*((tempa*3-30)/10)/10);//计算功率
  58.                 zhiling(0x80+0x40);
  59.                 LCD_data(table[h1]);
  60.                 LCD_data(table[h2]);
  61.                 LCD_data(table1[0]);
  62.                 LCD_data(table[h3]);
  63.                 LCD_data(table[h4]);
  64.                 LCD_data(table1[3]);
  65.                
  66.                 tablex(maz/1000);//显示MAH
  67.                 zhiling(0x88+0x40);
  68.                 LCD_data(table[h1]);
  69.                 LCD_data(table1[0]);
  70.                 LCD_data(table[h2]);
  71.                 LCD_data(table[h3]);
  72.                 LCD_data(table[h4]);
  73.                 LCD_data(table1[4]);
  74.                
  75.         }
  76. }
  77. //-------------------------------------------------------------
  78. void delay(uint z)///////////////延时程序
  79. {
  80.    uint x,y;
  81.    for(x=z;x>0;x--)
  82.    for(y=19;y>0;y--);
  83. }
  84. void AD_init(void)/////////////////////初始化ADC
  85. {
  86. P1ASF=0xff;//P1口全部作为模拟功能AD使用
  87. ADC_RES=0;//清零转换结果寄存器高8位
  88. ADC_RESL=0;//清零转换结果寄存器低2位
  89. ADC_CONTR=0x80;//开启AD电源
  90. delay(5);//等待1ms,让AD电源稳定
  91. }

  92. uint AD_get(uchar haha )//ADC读数
  93. {
  94.         uint rew;
  95.         ADC_CONTR=haha;//开启AD转换
  96.         _nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时
  97.         while(!(ADC_CONTR&0x10));//等待转换完成
  98.         ADC_CONTR&=0xe7;//关闭AD转换,ADC_FLAG位由软件清0
  99.         rew=ADC_RES*4+ADC_RESL;//组合成10位
  100.         delay(1);//等待
  101.         return rew;//返回ADC值
  102. }
  103. void zhiling(uchar zhilin)//写指令
  104. {
  105.         e=0;
  106.         rs=0;
  107.         rw=0;
  108.         P0=zhilin;
  109.         delay(20);
  110.         e=1;
  111.         delay(20);
  112.         e=0;
  113. }
  114. void LCD_data(uchar shuju)//写数据
  115. {
  116.         e=0;
  117.         rs=1;
  118.         rw=0;
  119.         P0=shuju;
  120.         delay(20);
  121.         e=1;
  122.         delay(20);
  123.         e=0;
  124. }
  125. void LCD_init(void)//初始化LCD
  126. {
  127. delay(300);
  128. zhiling(0x38);
  129. delay(100);
  130. zhiling(0x38);
  131. delay(100);
  132. zhiling(0x38);
  133. delay(100);
  134. zhiling(0x38);
  135. zhiling(0x38);
  136. zhiling(0x08);
  137. zhiling(0x01);
  138. zhiling(0x06);
  139. zhiling(0x0c);
  140. }
  141. void tablex(uint tab1)//数据分解
  142. {
  143.         h1=tab1/1000;//1023//1
  144.         h2=tab1%1000/100;//023//0
  145.         h3=tab1%100/10;//23//2
  146.         h4=tab1%10;//3
  147. }
  148. uint filter(uchar dat)//中位值滤波
  149. {
  150.    uint value_buf[N];
  151.    uint count,i,j,temp;
  152.    for(count=0;count<N;count++)
  153.    {
  154.                          AD_init();//初始化ADC
  155.       value_buf[count] = AD_get(dat);//读ADC数值
  156.       delay(1);
  157.    }
  158.    for (j=0;j<N-1;j++)
  159.    {
  160.       for (i=0;i<N-j;i++)
  161.       {
  162.          if ( value_buf[i]>value_buf[i+1] )
  163.          {
  164.             temp = value_buf[i];
  165.             value_buf[i] = value_buf[i+1];
  166.             value_buf[i+1] = temp;
  167.          }
  168.       }
  169.    }
  170.    return value_buf[(N-1)/2];
  171. }
  172. void timer_init(void)//定时器初始化
  173. {
  174.         TMOD=0x01;/////////设置工作方式1
  175.         TH0=(65536-50000)/256;///////赋值
  176.         TL0=(65536-50000)%256;
  177.         EA=1;ET0=1;//开总中断;开定时器中断
  178.         TR0=1;////////启动计数器
  179. }
复制代码
全部资料51hei下载地址:
12c5a60s2.rar (45.79 KB, 下载次数: 1180)


评分

参与人数 9黑币 +228 收起 理由
ko44 + 10 共享资料的黑币奖励!
lanmeiddd + 15 赞一个!
都市郎 + 15 赞一个!
xiou + 8 赞一个!
piplxh + 30 赞一个!
ysandi + 30
ckai + 5
杨雪飞 + 15 共享资料的黑币奖励!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

来自 108#
ID:1111684 发表于 2024-3-23 13:48 | 只看该作者
电压挡内阻太小,对被测电路影响太大,如果单片机AD有10位精度,完全可以设计出每伏电压2K欧姆以上的内阻电压表。而楼主的电路上的电压挡内阻最大仅为(10000+680)/ 30=356(欧姆每伏电压)
我们常用的指针万用表如MF47的电压挡内阻是每伏20K欧姆,即20K/V
而数字万用表的电压挡内阻更大,为每伏数百K欧姆以上。

评分

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

查看全部评分

回复

使用道具 举报

107#
ID:1086290 发表于 2024-11-8 11:26 | 只看该作者
可惜我不会程序。
回复

使用道具 举报

106#
ID:258695 发表于 2024-11-7 10:28 | 只看该作者
感谢楼主分享,收藏先
回复

使用道具 举报

105#
ID:1047454 发表于 2024-10-23 22:57 | 只看该作者
这个正是想要的,学习学习,不知能否移植到12864的屏上用啵。谢谢分享!
回复

使用道具 举报

104#
ID:239055 发表于 2024-4-13 07:36 来自触屏版 | 只看该作者
ouco123 发表于 2024-3-23 13:48
电压挡内阻太小,对被测电路影响太大,如果单片机AD有10位精度,完全可以设计出每伏电压2K欧姆以上的内阻电 ...

请问电压档内阻是怎么计算的,不明白30是怎么来的
回复

使用道具 举报

103#
ID:583100 发表于 2024-3-19 12:48 | 只看该作者
猎户l 发表于 2018-9-15 00:26
感觉电路图的接地是不有标错的地方,电流测量口接一个0.22的电阻到地,一通电不短路了

检测0.22欧电阻上面电压测,电压除电阻等于电流值。
回复

使用道具 举报

102#
ID:536156 发表于 2022-2-14 16:07 | 只看该作者
上电显示画面如楼主所发照片,接入待测量电压显示屏数值不变,什么原因?
回复

使用道具 举报

101#
ID:100749 发表于 2022-2-12 15:01 | 只看该作者
我做出来个,电压显示正常,电流显示不正常。
回复

使用道具 举报

100#
ID:233015 发表于 2022-1-28 14:10 来自触屏版 | 只看该作者
13960592586 发表于 2021-12-11 16:33
1602显示屏无字符什么原因

调调可调电阻
回复

使用道具 举报

99#
ID:991121 发表于 2021-12-12 09:12 | 只看该作者
谢谢!正在学习中
回复

使用道具 举报

98#
ID:484674 发表于 2021-12-11 16:33 来自触屏版 | 只看该作者
1602显示屏无字符什么原因
回复

使用道具 举报

97#
ID:262 发表于 2021-12-7 16:18 | 只看该作者

你点击顶部的帮助 3.怎么收藏帖子:www.51hei.com/bbs/dpj-167498-1.html
回复

使用道具 举报

96#
ID:796012 发表于 2021-12-7 16:05 | 只看该作者
admin 发表于 2018-8-27 19:52
看程序里面的接口定义吧

站长有没有收藏功能
回复

使用道具 举报

95#
ID:484674 发表于 2021-11-25 17:26 来自触屏版 | 只看该作者
出现白屏是那个引脚出问题
回复

使用道具 举报

94#
ID:484674 发表于 2021-11-25 17:09 来自触屏版 | 只看该作者
请大家帮帮忙那个显示广脚出问题无显示白屏
回复

使用道具 举报

93#
ID:966606 发表于 2021-9-23 20:49 | 只看该作者

请问这个测量范围是多少呢?
回复

使用道具 举报

92#
ID:965189 发表于 2021-9-17 11:31 | 只看该作者
有时间要试下。
回复

使用道具 举报

91#
ID:47634 发表于 2021-7-19 10:14 | 只看该作者
很好很好,找时间也做一个,多谢楼主
回复

使用道具 举报

90#
ID:163501 发表于 2021-6-27 15:04 | 只看该作者
刚才上机测试了一下,可以正常运行。
回复

使用道具 举报

89#
ID:114068 发表于 2021-6-16 08:36 | 只看该作者
下载了,谢谢楼主分享!
回复

使用道具 举报

88#
ID:484674 发表于 2021-5-10 19:05 来自触屏版 | 只看该作者
怎么归零
回复

使用道具 举报

87#
ID:510170 发表于 2021-3-26 20:07 | 只看该作者
楼主大大,lm324的第8脚不接吗?谢谢了。
回复

使用道具 举报

86#
ID:886521 发表于 2021-2-25 21:47 | 只看该作者
多谢楼主分享  找了好久 新手学习了
回复

使用道具 举报

85#
ID:161939 发表于 2021-1-31 11:34 | 只看该作者
正想做个电压电流表,不知道从何下手,借鉴一下。
回复

使用道具 举报

84#
ID:779899 发表于 2020-11-18 08:35 | 只看该作者
相当不错的
回复

使用道具 举报

83#
ID:517951 发表于 2020-11-17 15:42 | 只看该作者
51论坛有你更精彩,这个可以好好学习一下!
回复

使用道具 举报

82#
ID:76671 发表于 2020-11-17 11:30 | 只看该作者
tempv=filter(0x88);//设置ADC通道0、开始转换
改成p1.2要怎么改?
回复

使用道具 举报

81#
ID:617813 发表于 2020-8-22 01:42 来自触屏版 | 只看该作者
支持一下,不错不错
回复

使用道具 举报

80#
ID:136485 发表于 2020-8-8 08:35 | 只看该作者
猎户l 发表于 2018-10-13 21:37
楼主,我照上面的电路仿了一个,用ch340连接电脑,用stc-isp烧录时一直提示正在检测目标单片机 ...
ch340 ...

ch340有时没反应,你最好用CP2101,你用CH340现在的蓝牙和WIFI模块都烧不进的,CP2102好用点
回复

使用道具 举报

79#
ID:796531 发表于 2020-8-7 14:47 | 只看该作者
感谢楼主分享,我修改一个试试 测量高压
回复

使用道具 举报

78#
ID:704585 发表于 2020-4-30 15:25 | 只看该作者
多谢楼主分享
回复

使用道具 举报

77#
ID:142485 发表于 2020-4-27 19:06 | 只看该作者
好资料
回复

使用道具 举报

76#
ID:114068 发表于 2020-4-8 16:02 | 只看该作者
(*^__^*) 嘻嘻,拿走了,谢谢楼主分享@!!!!
回复

使用道具 举报

75#
ID:100749 发表于 2020-3-23 11:13 来自触屏版 | 只看该作者
做一个,也学学
回复

使用道具 举报

74#
ID:202824 发表于 2020-3-18 21:07 | 只看该作者
猎户l 发表于 2018-9-15 00:26
感觉电路图的接地是不有标错的地方,电流测量口接一个0.22的电阻到地,一通电不短路了
0.22是检测电流。应该串连。怎2个接地标?是不是画错了。
回复

使用道具 举报

73#
ID:695749 发表于 2020-2-27 23:24 | 只看该作者
很想要一块自己制作的电压表,终于找到了,谢谢!
回复

使用道具 举报

72#
ID:686387 发表于 2020-2-23 18:32 | 只看该作者
谢谢分享
回复

使用道具 举报

71#
ID:599349 发表于 2020-2-23 13:15 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

70#
ID:233015 发表于 2020-2-4 11:55 来自触屏版 | 只看该作者
有没有 其他那位大神仿制成功的,说说遇到的问题和经验呗
回复

使用道具 举报

69#
ID:69408 发表于 2020-2-1 13:09 | 只看该作者
谢谢分享,下载学习学习用单片机内的A/D转换程序!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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