基于51单片机的电压电流测量【直流,交流】(仿真)

基于51单片机的电压电流测量【直流,交流】(仿真)

给大家提供一些资料详细解释,有需要的自行提取,网盘地址我放在下面

 链接:https://pan.baidu.com/s/1NigBeujDZTCFL0hdMiu7yg?pwd=syxp 
提取码:syxp 

1、系统有2个工作模式:交流模式和直流模式,通过开关切换测量模式

2、通过数码管显示测量的电压和电流大小

3、直流测量范围为0~100V,交流测量范围为0~70V

4、电压超过50V,或电流超过5A,蜂鸣器响(可修改程序来改变报警值)

#include <SHT11.h>
#include"intrins.h"
unsigned char sht_temp;			// 保存温度
unsigned char sht_humi;			// 保存湿度

typedef union              		//定义共用同类型
{
	unsigned int i;
	float f;
}value;

char ShtWriteByte(unsigned char value)
{
	unsigned char i,error=0;
	for(i=128;i>0;i>>=1)  // 高位为1,循环右移
	{
		if (i&value)
			Data_P=1;       	// 和要发送的数相与,结果为发送的位
		else
			Data_P=0;
		Sck_P=1;
		_nop_();						// 延时3us
		_nop_();
		_nop_();
		Sck_P=0;
	}
	Data_P=1;    					// 释放数据线
	Sck_P=1;
	error=Data_P;  				// 检查应答信号,确认通讯正常
	_nop_();
	_nop_();
	_nop_();
	Sck_P=0;
	Data_P=1;
	return error; 				// error=1 通讯错误
}

char ShtReadByte(unsigned char ack)
{
	unsigned char i,val=0;
	Data_P=1; 						// 释放数据线
	for(i=0x80;i>0;i>>=1)	// 高位为1,循环右移
	{
		Sck_P=1;
		if(Data_P)
			val=(val|i);    	// 读一位数据线的值
		Sck_P=0;
	}
	Data_P=!ack;    			// 如果是校验,读取完后结束通讯
	Sck_P=1;
	_nop_();							// 延时3us
	_nop_();
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Data_P=1; 						// 释放数据线
	return val;
}


void ShtTransStart(void)
{
	Data_P=1;
	Sck_P=0;
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=0;
	_nop_();
	Sck_P=0;
	_nop_();
	_nop_();
	_nop_();
	Sck_P=1;
	_nop_();
	Data_P=1;
	_nop_();
	Sck_P=0;
}

void ShtConnectReset(void)
{
	unsigned char i;
	Data_P=1; 		   		//准备
	Sck_P=0;
	for(i=0;i<9;i++)  	//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
	{
		Sck_P=1;
		Sck_P=0;
	}
	ShtTransStart();   	//启动传输
}

char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
	unsigned error=0;
	unsigned int i;
	ShtTransStart();  		// 启动传输
	switch(mode)       		// 选择发送命令
	{
		case 1 :   					// 测量温度
			error+=ShtWriteByte(0x03);
			break;
		case 2 :   					// 测量湿度
			error+=ShtWriteByte(0x05);
			break;
		default:
			break;
	}
	for(i=0;i<65535;i++)
		if(Data_P==0)
			break;  					// 等待测量结束
		if(Data_P)
			error+=1;   			// 如果长时间数据线没有拉低,说明测量错误
	*(p_value) =ShtReadByte(1);  		// 读第一个字节,高字节 (MSB)
	*(p_value+1)=ShtReadByte(1); 		// 读第二个字节,低字节 (LSB)
	*p_checksum =ShtReadByte(0);  	// read CRC校验码
	return error;  									// error=1 通讯错误
}

void CalcSHT11(float *p_humidity ,float *p_temperature)
{
	const float C1=-4.0;	 			// 12位湿度精度 修正公式
	const float C2=+0.0405;			// 12位湿度精度 修正公式
	const float C3=-0.0000028;	// 12位湿度精度 修正公式
	const float T1=+0.01;	 			// 14位温度精度 5V条件 修正公式
	const float T2=+0.00008;	 	// 14位温度精度 5V条件 修正公式
	float rh=*p_humidity;	 			// rh: 12位 湿度
	float t=*p_temperature;			// t:  14位 温度
	float rh_lin;								// rh_lin: 湿度 linear值
	float rh_true;							// rh_true: 湿度 ture值
	float t_C;	 								// t_C : 温度 ℃
	t_C=t*0.01 - 40;	 					//补偿温度
	rh_lin=C3*rh*rh + C2*rh + C1;					//相对湿度非线性补偿
	rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;		//相对湿度对于温度依赖性补偿
	*p_temperature=t_C;	 				//返回温度结果
	*p_humidity=rh_true;	 			//返回湿度结果
}

unsigned char TempCorrect(int temp)
{
	if(temp<0)	temp=0;
	if(temp>970)  temp=970;
	if(temp>235)  temp=temp+10;
	if(temp>555)  temp=temp+10;
	if(temp>875)  temp=temp+10;
	temp=(temp%1000)/10;
	return temp;
}

unsigned char HumiCorrect(unsigned int humi)
{
	if(humi>999)  humi=999;
	if((humi>490)&&(humi<951))  humi=humi-10;
	humi=(humi%1000)/10;
	return humi+4;
}

void ReadShtData()
{
	value humi_val,temp_val;  	// 定义两个共同体,一个用于湿度,一个用于温度
	unsigned char error;  							// 用于检验是否出现错误
	unsigned char checksum;  						// CRC
	unsigned int temp1,humi1;						// 临时读取到的温湿度数据

	error=0; 										//初始化error=0,即没有错误
	error+=ShtMeasure((unsigned char*)&temp_val.i,&checksum,1); 	//温度测量
	error+=ShtMeasure((unsigned char*)&humi_val.i,&checksum,2); 	//湿度测量

	if(error!=0) 		  					//如果发生错误,系统复位
		ShtConnectReset();
	else
	{
		humi_val.f=(float)humi_val.i; 				//转换为浮点数
		temp_val.f=(float)temp_val.i;  				//转换为浮点数
		CalcSHT11(&humi_val.f,&temp_val.f);  	//修正相对湿度及温度
		temp1=temp_val.f*10;
		sht_temp=TempCorrect(temp1);
		humi1=humi_val.f*10-50;
		sht_humi=HumiCorrect(humi1);
		humi1=humi1-1;
	}

}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经
### 回答1: 基于51单片机直流电机测速系统是一种用于测量直流电机转速的系统。Proteus是一种虚拟仿真软件,可以用来模拟这个系统的电路和程序。以下是该系统的基本原理和实现步骤: 1. 原理: 通过测量电机转子两个定点之间的时间间隔,可以计算出电机的转速。基于51单片机直流电机测速系统通过使用光电传感器来检测转子定点,并通过单片机采集和处理传感器信号来计算转速。 2. 硬件设计: 搭建一个电机驱动电路,将电机连接到单片机的引脚上。选择合适的光电传感器连接到单片机的另外一个引脚上,以便检测转子定点。确保电路中有适当的电流限制电阻和电压稳定器,以保护单片机和其他元件。 3. 程序设计: 使用C语言编写单片机的程序,用于采集和处理光电传感器的信号。程序的主要任务是计算两个定点之间的时间间隔,并将结果转换为转速值。程序还可以根据需要进行其他功能的扩展,例如显示转速值或进行电机控制。 4. Proteus仿真: 在Proteus中创建一个新的电路设计并添加所需的电子元件和引脚连接。在51单片机引脚上连接电机和光电传感器,并将单片机引脚与相关电路连接。使用Proteus提供的仿真工具验证电路的正确性和性能。 通过上述步骤,基于51单片机直流电机测速系统的仿真和验证就可以完成。在仿真过程中,可以通过改变电机转速和光电传感器的位置来检查系统的功能和稳定性,以确保系统在实际应用中的可靠性。 ### 回答2: 基于51单片机直流电机测速系统是一种通过使用51单片机控制直流电机并测量其转速的系统。通过Proteus仿真软件可以进行系统的模拟和测试。 首先,需要设计并搭建电路。电路中需要包括直流电机、51单片机、光电传感器等元件。光电传感器可以用来检测直流电机旋转的动作,并将信号传递给51单片机进行处理。 其次,需要编写程序实现对直流电机的控制和测速。在程序中,首先需要初始化51单片机的IO口和定时器,然后使用IO口来控制直流电机的运行,调整电机的转速。在定时器中断函数中,可以采集光电传感器的信号,并根据信号的变化来计算直流电机的转速。可以根据光电传感器每个脉冲所代表的角度来计算电机的转速。 最后,使用Proteus进行仿真和测试。可以在Proteus软件中创建一个仿真环境,并将电路和编写好的程序加载到仿真环境中进行测试。可以通过仿真结果来验证程序的正确性和电路的功能,并进行必要的调整和优化。 基于51单片机直流电机测速系统可以用于工业自动化、机器人、电动车等领域。通过通过Proteus仿真软件进行模拟测试,可以快速验证系统的功能和性能,并进行必要的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值