878|4

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

基于80c51的电感测量 [复制链接]

10芯积分
本帖最后由 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呀,为什么会多次,我的程序是不是有大问题,这种错误我真的不知道怎么解决!求大佬解惑!

此帖出自51单片机论坛

最新回复

这个你要具体调试调试,一句一句排除。proteus仿真没玩过。   详情 回复 发表于 2024-4-24 20:18
点赞 关注
 

回复
举报

6105

帖子

4

TA的资源

版主

沙发
 
uchar  Lx[5] = "000mH";
float  ULe,lx,Use=4.9;

这里是不是Lx 和lx 有问题?据说keil c51 编译器竟然不区分变量大小写

你可以改一下名字。

此帖出自51单片机论坛

点评

谢谢大佬,解决了,但是在proteus仿真很慢,一直卡在发送“frequence",很久才发一个字母,跑不到AD转换部分,这是什么原因呢?  详情 回复 发表于 2024-4-24 11:46
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
damiaa 发表于 2024-4-24 09:11 uchar Lx[5] = "000mH"; float ULe,lx,Use=4.9; 这里是不是Lx 和lx 有问题?据说keil c51 ...

谢谢大佬,解决了,但是在proteus仿真很慢,一直卡在发送“frequence",很久才发一个字母,跑不到AD转换部分,这是什么原因呢?

此帖出自51单片机论坛

点评

这个你要具体调试调试,一句一句排除。proteus仿真没玩过。  详情 回复 发表于 2024-4-24 20:18
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

4
 

看不懂.............................................................................................

此帖出自51单片机论坛
 
 
 

回复

6105

帖子

4

TA的资源

版主

5
 
ivilil 发表于 2024-4-24 11:46 谢谢大佬,解决了,但是在proteus仿真很慢,一直卡在发送“frequence",很久才发一个字母,跑不到A ...

这个你要具体调试调试,一句一句排除。proteus仿真没玩过。

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表