- 2024-04-24
-
回复了主题帖:
基于80c51的电感测量
damiaa 发表于 2024-4-24 09:11
uchar Lx[5] = "000mH";
float ULe,lx,Use=4.9;
这里是不是Lx 和lx 有问题?据说keil c51 ...
谢谢大佬,解决了,但是在proteus仿真很慢,一直卡在发送“frequence",很久才发一个字母,跑不到AD转换部分,这是什么原因呢?
-
发表了主题帖:
基于80c51的电感测量
本帖最后由 ivilil 于 2024-4-24 00:30 编辑
#include "reg51.h"
#include <data.h>
#include <LCD1602.h>
#include <math.h> // 导入数学库
#include <stdio.h> // 使用sprintf函数
#define uchar unsigned char
#define uint unsigned int
#define dataout P3 //正弦波输出口
#define ADC_RESULT P1 // 定义P1端口,用于读取AD转换结果
sbit ST = P2^0; // START和ALE控制信号
sbit EOC = P2^1 ; // EOC(转换结束)信号
sbit OE = P2^2; // 输出使能
uchar fre[5] ="100Hz";
uchar Lx[5] = "000mH";
float ULe,lx,Use=4.9;
uint data THHL=65536-39;
uchar data n=0;
uchar data Signal_chose = 0;
uchar data div = 100; //频率为100
uchar data dil = 0; //
void init() //初始化
{
dataout=0x00;THHL=65536-39; ///初始频率为100Hz
TH1=THHL/256;TL1=THHL%256;
ST=1;EOC=1;OE=0;ADC_RESULT=0x00;
TMOD=0x11;ET1=1;TR1=1;EA=1;
}
void start_adc_conversion() {
ST=0;
ST=1; //上升沿,地址000,IN0输入
ST=0 ; // 下降沿
}
unsigned char read_adc_result() {
while (EOC == 0); // 等待EOC信号,表示转换完成
OE=1; //允许输出
return ADC_RESULT; // 返回转换结果
}
void timer1_isr(void) interrupt 3
{
TL1 = THHL % 256; // 重新装载定时器
TH1 = THHL / 256;
n++; // 更新正弦波索引
if (n >= sizeof(sin_tab)) // 如果n达到sin_tab数组的上限
{
n = 0; // 重新开始
}
dataout = sin_tab[n]; // 输出正弦波的值
}
void main()
{
unsigned char adc_value;
init();
LCD_init();
LCD_send(2,0,"frequency:",10);
fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
LCD_send(2,11,fre,5);
TR1=1;
while(1) {
start_adc_conversion(); // 启动AD转换
adc_value = read_adc_result(); // 读取AD转换结果
// 进行浮点数运算以计算Lx
ULe = adc_value * (5.0 / 255.0); // 转换ADC值到电压
lx = 0.019 * sqrt((Use / ULe) * (Use / ULe) - 1);
lx *= 1000; // 转换为毫亨
dil=(uchar)lx;
LCD_send(1, 0, "value:", 6);
Lx[0]=dil/100 + '0';Lx[1]=dil/10%10 + '0';Lx[2]=dil%10 + '0';
LCD_send(1, 7, Lx, 5);
OE=0;
delay(500); // LCD的延迟时间
}
}
下面是<reg51.h>
/*--------------------------------------------------------------------------
REG51.H
Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG51_H__
#define __REG51_H__
/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;
/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
#endif
求大佬帮帮我,做的毕设,上面是我的代码,实现的是电感的测量,51单片机实现正弦波发生与将lx即电感值计算与显示,测量部分上一篇求组得到了解决,AD转换部分我老师说很简单,网上开源的,然后我弄了一个,就弄成上面的代码的样子,还报错的,编程能力太差了,不敢问老师,呜呜呜,救救我!
下面是报错截图,
他说我多次定义,我就这个程序用了Lx呀,为什么会多次,我的程序是不是有大问题,这种错误我真的不知道怎么解决!求大佬解惑!
- 2024-04-22
-
回复了主题帖:
用峰值检测电路实现电感测量
呜呼哀哉 发表于 2024-4-17 17:42
可是有没有注意到不同规格(或是分类),电感的测试频率不一样,有些已经到MHz了,这个怎么看?
所以得选好范围,我是第一次搞这个,选的是小频率发生信号,大概能测mH级别吧,仿真是没有误差得,实体还没做出来,唉,主要是完成毕业任务
- 2024-04-17
-
回复了主题帖:
用峰值检测电路实现电感测量
呜呼哀哉 发表于 2024-4-17 13:52
朋友,打听下,电感感值峰值电路测量是什么原理?有效值不行么?
我推理用的有效值,但是想到了有效值跟峰值的关系,然后峰值电路比有效值感觉简单一点,就用峰值了。
-
回复了主题帖:
用峰值检测电路实现电感测量
maychang 发表于 2024-4-17 13:38
U3U5是不必要的。左边单片机和DA芯片产生的带有偏置的正弦波电压信号只要用个电容即可去掉其直流分量,仅保 ...
谢谢 恍然大悟 我试试
-
发表了主题帖:
用峰值检测电路实现电感测量
有没有到大佬帮忙解惑一下,左边是我网上找的正弦波发生电路,输出的为负电压,我加了一个2.5V的正电压,让其具有正负值各一半,右边第二个是我的测量电路,我想实现电感值测量,下面第三部分是我的峰值整流电路,经过运放后电压表输出电压大概3v,比输入还大了,特别是U7运放过后,电压值差不多14V了。是我的加法电路出问题了么?但是U6输出的是正弦波呀,用multisim仿真图形也正确。请大佬教教怎么回事?
留言