找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4761|回复: 3
收起左侧

STC单片机ACS712电流电压计源程序

  [复制链接]
ID:259448 发表于 2020-10-5 02:00 | 显示全部楼层 |阅读模式
基于STC89C51系列单片机的电流电压计
电路原理图如下:
51hei.png

单片机源程序如下:
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include<stdio.h>
  3. #include "1602.h"
  4. #include "delay.h"
  5. #include "i2c.h"

  6. char dis0[16];                           //打印数组初始化
  7. unsigned long time_20ms=0;                   //定时器计数

  8. float Volt=0.0;                          //检测电压
  9. float Acurrent=0.0;                                  //检测电流

  10. void Init_Timer0(void);                //函数声明
  11. void uartSendStr(unsigned char *s,unsigned char length);
  12. void UART_Init(void);
  13. void uartSendByte(unsigned char dat);

  14. void main (void)
  15. {     
  16.         unsigned char midvolt,midcur;  //电压电流中间变量值

  17.         Init_Timer0();        //定时器0初始化
  18.         UART_Init();                  //串口初始化
  19.                      
  20.         LCD_Init();           //初始化液晶
  21.         DelayMs(20);          //延时有助于稳定
  22.         LCD_Clear();
  23.         sprintf(dis0,"My Designer!!  ");//打印
  24.         LCD_Write_String(0,0,dis0);//显示第一行
  25.         sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  26.         LCD_Write_String(0,1,dis0);//显示第二行
  27.         uartSendStr("reday ok!!",10);
  28.         while (1)         //主循环
  29.         {
  30.                 midvolt=ReadADC(1);                                //读取AD检测到的 电压值
  31.                 DelayMs(50);          //延时有助于稳定
  32.                 midcur=ReadADC(0);                //读取电流转化后的电压值

  33.                 Volt=(float)midvolt*5.13/255*3;                //计算出电压 *3表示分压值
  34.                 Acurrent=(float)midcur*5.13/255;                //计算出电流
  35.                                                                                                
  36.                 if(Acurrent>2.62)                         //如果电流转换后的电压值超过2.62
  37.                 {
  38.                         Acurrent=(Acurrent-2.62)/0.185;         //电流模块 电压转换计算
  39.                 }
  40.                 else
  41.                 {
  42.                         Acurrent=0;
  43.                 }       

  44.                 sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  45.                 LCD_Write_String(0,1,dis0);//显示第二行
  46. //                uartSendStr(dis0,16);          //串口上报
  47. //                uartSendStr("\n",1);                           //换行
  48.                 DelayMs(200);          //延时有助于稳定
  49.         }
  50. }


  51. void Init_Timer0(void)
  52. {
  53.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  54.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  55.         TL0=(65536-20000)%256;
  56.         EA=1;            //总中断打开
  57.         ET0=1;           //定时器中断打开
  58.         TR0=1;           //定时器开关打开
  59. }

  60. void Timer0_isr(void) interrupt 1
  61. {
  62.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  63.         TL0=(65536-20000)%256;
  64.        
  65.         time_20ms++;
  66. }


  67. void UART_Init(void)
  68. {
  69.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  70.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  71.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
  72.         TL1 = TH1;  
  73.     TR1   = 1;                  // TR1:  timer 1 打开                        
  74.     EA    = 1;                  //打开总中断
  75.     ES    = 1;                  //打开串口中断
  76. }

  77. void uartSendByte(unsigned char dat)
  78. {
  79.         unsigned char time_out;
  80.         time_out=0x00;
  81.         SBUF = dat;                          //将数据放入SBUF中
  82.         while((!TI)&&(time_out<100))  //检测是否发送出去
  83.         {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时
  84.         TI = 0;                                                //清除ti标志
  85. }

  86. void uartSendStr(unsigned char *s,unsigned char length)
  87. {
  88.         unsigned char NUM;
  89.         NUM=0x00;
  90.         while(NUM<length)        //发送长度对比
  91.         {
  92.                 uartSendByte(*s);  //放松单字节数据
  93.                 s++;                  //指针++
  94.                 NUM++;                  //下一个++
  95.            }
  96. }

  97. void UART_SER (void) interrupt 4         //串行中断服务程序
  98. {
  99.         if(RI)                        //判断是接收中断产生
  100.         {
  101.                 RI=0;                      //标志位清零
  102.         }
  103.         if(TI)  //如果是发送标志位,清零
  104.         TI=0;
  105. }
复制代码

所有资料51hei提供下载:
单片机数字电流表电压表.zip (362.58 KB, 下载次数: 107)
回复

使用道具 举报

ID:692206 发表于 2021-3-24 13:05 | 显示全部楼层
求助大佬,我手里有电池盒,我只想做一个电流检测,asc712端子12接什么,是接电池盒的红黑线还是得做个简单的电路引出两根导线来再测,还有,asc712的out端直接接在pcf8951的ain1端口上吧,别的还有什么要注意的点吗
回复

使用道具 举报

ID:907943 发表于 2021-4-18 18:45 | 显示全部楼层
求助大佬,我想检测8路的电压电流这个该怎么改
回复

使用道具 举报

ID:1075398 发表于 2023-5-22 08:14 | 显示全部楼层
楼上的两位,你们的电路搞好了没有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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