找回密码
 注册
查看: 281|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-7 10:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

( Z. _4 U* ^" @+ [6 o单片机源程序如下:
4 p; _  Z$ x  _% P9 o2 U
  • #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  • #include<stdio.h>
  • #include "1602.h"
  • #include "delay.h"
  • #include "i2c.h"
  • char dis0[16];                           //打印数组初始化
  • unsigned long time_20ms=0;                   //定时器计数
  • float Volt=0.0;                          //检测电压
  • float Acurrent=0.0;                                  //检测电流
  • void Init_Timer0(void);                //函数声明
  • void uartSendStr(unsigned char *s,unsigned char length);
  • void UART_Init(void);
  • void uartSendByte(unsigned char dat);
  • void main (void)
  • {
  •         unsigned char midvolt,midcur;  //电压电流中间变量值
  •         Init_Timer0();        //定时器0初始化
  •         UART_Init();                  //串口初始化
  •         LCD_Init();           //初始化液晶
  •         DelayMs(20);          //延时有助于稳定
  •         LCD_Clear();
  •         sprintf(dis0,"My Designer!!  ");//打印
  •         LCD_Write_String(0,0,dis0);//显示第一行
  •         sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  •         LCD_Write_String(0,1,dis0);//显示第二行
  •         uartSendStr("reday ok!!",10);
  •         while (1)         //主循环
  •         {
  •                 midvolt=ReadADC(1);                                //读取AD检测到的 电压值
  •                 DelayMs(50);          //延时有助于稳定
  •                 midcur=ReadADC(0);                //读取电流转化后的电压值
  •                 Volt=(float)midvolt*5.13/255*3;                //计算出电压 *3表示分压值
  •                 Acurrent=(float)midcur*5.13/255;                //计算出电流
  •                 if(Acurrent>2.62)                         //如果电流转换后的电压值超过2.62
  •                 {
  •                         Acurrent=(Acurrent-2.62)/0.185;         //电流模块 电压转换计算
  •                 }
  •                 else
  •                 {
  •                         Acurrent=0;
  •                 }
  •                 sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  •                 LCD_Write_String(0,1,dis0);//显示第二行
  • //                uartSendStr(dis0,16);          //串口上报
  • //                uartSendStr("\n",1);                           //换行
  •                 DelayMs(500);          //延时有助于稳定
  •         }
  • }
  • void Init_Timer0(void)
  • {
  •         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  •         TH0=(65536-20000)/256;                  //重新赋值 20ms
  •         TL0=(65536-20000)%256;
  •         EA=1;            //总中断打开
  •         ET0=1;           //定时器中断打开
  •         TR0=1;           //定时器开关打开
  • }
  • void Timer0_isr(void) interrupt 1
  • {
  •         TH0=(65536-20000)/256;                  //重新赋值 20ms
  •         TL0=(65536-20000)%256;
  •         time_20ms++;
  • }
  • void UART_Init(void)
  • {
  •     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收
  •     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  •     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
  •         TL1 = TH1;
  •     TR1   = 1;                  // TR1:  timer 1 打开
  •     EA    = 1;                  //打开总中断
  •     ES    = 1;                  //打开串口中断
  • }
  • void uartSendByte(unsigned char dat)
  • {
  •         unsigned char time_out;
  •         time_out=0x00;
  •         SBUF = dat;                          //将数据放入SBUF中
  •         while((!TI)&&(time_out<100))  //检测是否发送出去
  •         {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时
  •         TI = 0;                                                //清除ti标志
  • }
  • void uartSendStr(unsigned char *s,unsigned char length)
  • {
  •         unsigned char NUM;
  •         NUM=0x00;
  •         while(NUM<length)        //发送长度对比
  •         {
  •                 uartSendByte(*s);  //放松单字节数据
  •                 s++;                  //指针++
  •                 NUM++;                  //下一个++
  •            }
  • }
  • void UART_SER (void) interrupt 4         //串行中断服务程序
  • {
  •         if(RI)                        //判断是接收中断产生
  •         {
  •                 RI=0;                      //标志位清零
  •         }
  •         if(TI)  //如果是发送标志位,清零
  •         TI=0;
  • }; N# M, D1 {8 g  x
3 W5 a, w, n# J0 e( c2 K  Q

该用户从未签到

2#
发表于 2022-9-7 11:07 | 只看该作者
电流电压表的基本参数 测量范围:交流电流表 A C0-6A 大于6A需外接分流器(可定做10A直通)直流电流表DC0-660V

该用户从未签到

3#
发表于 2022-9-7 13:58 | 只看该作者
Proteus能不能出pcb,简单的应该都可以吧

该用户从未签到

4#
发表于 2022-9-7 14:22 | 只看该作者
我要学习一下,反推导学习。嘿嘿
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-3 03:56 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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