找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3512|回复: 4
收起左侧

单片机1602电压电流表原理图和源程序

  [复制链接]
ID:997051 发表于 2022-1-3 13:13 | 显示全部楼层 |阅读模式
1602电压电流表制作.png

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

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

  14. sbit rs=P3^5;//液晶RS
  15. sbit rw=P3^6;//液晶RW
  16. sbit e=P3^4;//液晶E

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

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

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

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

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


评分

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

查看全部评分

回复

使用道具 举报

ID:440028 发表于 2022-1-4 11:41 | 显示全部楼层
希望多这样的作者,既不要黑B,还能学习
回复

使用道具 举报

ID:118142 发表于 2022-3-31 20:40 | 显示全部楼层
要下来学习   这个程序很好找了好久了——可以用——,
回复

使用道具 举报

ID:953052 发表于 2022-4-1 12:04 | 显示全部楼层
原理图如能清晰一些就更好,谢谢分享。
回复

使用道具 举报

ID:323213 发表于 2023-3-22 18:59 | 显示全部楼层
Proteus仿真没有数字显示怎么会事?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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