基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计

硬件方案如下

(末尾附文件)
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第1张图片
本设计由STC89C52单片机电路+LCD1602液晶显示电路+L298N电机驱动电路+按键电路+霍尔传感器电路+DS18B20温度传感器电路+电源电路组成。
1、通过按键可以控制电机的启动、停止、正转、反转、加速、减速。
2、通过温度传感器DS18B20检测温度。
3、通过液晶显示温度、PWM档位值、速度。
4、温度超过50度蜂鸣器报警。

STC89C52单片机最小系统说明:
STC89C52单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。单片机最小系统原理图如下图所示。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第2张图片
12V电源电路设计
本系统选择12V直流电源作为总电源,直接采用12V适配器给设备供电。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第3张图片
LCD1602液晶显示模块电路设计
系统中采用LCD1602作为显示器件输出信息。在本电路中电位器可以调节液晶显示的对比度即清晰度。其具体电路原理图如下图所示。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第4张图片
3.2.4 蜂鸣器报警电路(低电平有效)设计
有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。本系统所采用的报警模块为5V有源蜂鸣器模块,电路中采用三极管9012来驱动,只要单片机控制引脚为低电平,蜂鸣器就会鸣叫报警,反之则不鸣叫,可以通过控制单片机引脚方波输出形式控制蜂鸣器的鸣叫方式。电阻为限流电阻,保护作用。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第5张图片
按键电路设计
轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。其电路原理图如下图所示。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第6张图片
L298N电机驱动模块电路设计

基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第7张图片

L298N电机驱动模块内部电路原理图如下图所示所示。P1为总电源输入、GND和5V直流电源输出接口。总电源经过L7805CV稳压芯片将高电压降为5V,L7805CV是输出电压为4.75-5.25V,最大输入电压为35V,最大输出电流为1.5A静态电流为4.2-8mA的正电压稳压器。C1-C4均起到滤波作用,让电压更将平稳。P3和P4为电机接口。二极管D1-D8起到保护作用,防止电机产生的反向感应电动势损伤L298N。P2为控制引脚,D9-D13为信号指示灯,相关电阻起到限流作用,保护LED灯。
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第8张图片
A3144霍尔传感器模块电路设计
基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计_第9张图片

主程序:

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include "18b20.h"
#include "1602.h"
#include "delay.h"

sbit IN1=P2^0;	  //引脚定义
sbit IN2=P2^1;
sbit ENA=P2^2;
sbit Buzzer=P1^7;

sbit Key1=P1^0;	 //按键引脚定义
sbit Key2=P1^3;
sbit Key3=P1^1;
sbit Key4=P1^4;
sbit Key5=P1^2;
sbit Key6=P1^5;

sbit LED1=P3^4;
sbit LED2=P3^5;

bit ReadTempFlag;//定义读时间标志

int temp;			  //温度读取
float temperature;				//实际温度
char displaytemp[16];//定义显示区域临时存储数组
unsigned long time_20ms=0;

unsigned char Count=0;	   //调节占空比
unsigned char PwmZ=2;	   //占空比调整
unsigned char MotorFlag=1;	  //正反转标志
unsigned char rekey=0;		 //防止重复按键
unsigned char PwmVal;		 //pwm显示值
unsigned char ReadSuDu=0;  //读取速度标志
float SuDu;				   //速度值
unsigned int PluNum;	  //脉冲计数

void Init_Timer0(void);		//函数声明
void UART_Init(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s,unsigned char length);

void main (void)
{                  
	Init_Timer0();
	UART_Init();
	EX0=1;         //外部中断0开
	IT0=1;         //边沿触发
    EA=1;          //全局中断开

	LCD_Init();           //初始化液晶
	DelayMs(20);          //延时有助于稳定
	LCD_Clear();          //清屏
	SendStr("ready ok!",9);
	sprintf(displaytemp,"Now:%4.1f       ",temperature);//打印温度值
	LCD_Write_String(0,0,displaytemp);
	LCD_Write_Char(8,0,0xdf);//写入温度右上角点
	LCD_Write_Char(9,0,'C'); //写入字符C
	ENA=1;
	LED1=0;
	LED2=1;
	while (1)         //主循环
	{
		if((P1&0x3f)!=0x3f)
		{
			if(rekey==0)
			{
				if((P1&0x3f)!=0x3f)
				{
					rekey=1;
					if(Key1==0)	//加速
					{
						 if(PwmZ<=9)
						 PwmZ++;
					}
					else if(Key2==0)	//减速
					{
						 if(PwmZ>1)
						 PwmZ--;
					}
					else if(Key3==0)	//正转
					{MotorFlag=1;LED1=0;LED2=1;}
					else if(Key4==0)	//反转
					{MotorFlag=0;LED1=1;LED2=0;}
					else if(Key5==0)	//开
					{ENA=1;}
					else if(Key6==0)	//停
					{ENA=0;}
				}
			}
		}
		else
		{rekey=0;}

		DelayUs2x(20);          //延时有助于稳定

		if(ReadTempFlag==1)
		{
			EA=0;
		    temp=ReadTemperature();			   //读取温度
			EA =1;
			temperature=(float)temp*0.0625;		//温度转换
			sprintf(displaytemp,"Now:%4.1f       ",temperature);//打印温度值
			LCD_Write_String(0,0,displaytemp);
			LCD_Write_Char(8,0,0xdf);//写入温度右上角点
			LCD_Write_Char(9,0,'C'); //写入字符C
			if((unsigned int )temperature>50) //未达到设置温度
			{
				Buzzer=0;		//打开蜂鸣器
			}
			else
			{
				Buzzer=1;		//关闭蜂鸣器
			}
			if(PwmZ==1){PwmVal=5;}
			else if(PwmZ==2){PwmVal=15;}		//获取占空比值
			else if(PwmZ==3){PwmVal=30;}		//获取占空比值
			else if(PwmZ==4){PwmVal=40;}		//获取占空比值
			else if(PwmZ==5){PwmVal=50;}		//获取占空比值
			else if(PwmZ==6){PwmVal=60;}		//获取占空比值
			else if(PwmZ==7){PwmVal=70;}		//获取占空比值
			else if(PwmZ==8){PwmVal=80;}		//获取占空比值
			else if(PwmZ==9){PwmVal=90;}		//获取占空比值
			else if(PwmZ==10){PwmVal=100;}		//获取占空比值
			sprintf(displaytemp,"PWM:%3d ZSu:%3.1f",(int)PwmVal,SuDu);//打印温度值
			LCD_Write_String(0,1,displaytemp);
			ReadTempFlag=0;
		}
		if(ReadSuDu==1)
		{
			ReadSuDu=0;
			SuDu=(float)PluNum/3;		//2个脉冲1圈   5s一次
			PluNum=0;
		}			
	}
}

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 
{

	static unsigned char IN1Count;
	static unsigned long numCount;

	TL0 = 0xCD;		//设置定时初值 2ms
	TH0 = 0xF8;		//设置定时初值
 
	IN1Count++;
	if(IN1Count=PwmZ)&&(IN1Count<=11))	//关闭时间段
	{
	 	IN1=1;IN2=1;			//关闭
	}
	else
	{
		IN1Count=0;  //一个周期结束
	}
	numCount++;
	if(numCount%300==0)
	{
	 	ReadTempFlag =1;
		if(numCount%1500==0)
		{
			ReadSuDu =1;
		}
		
	}
}

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 SendByte(unsigned char dat)
{
	unsigned char time_out;
	time_out=0x00;
	SBUF = dat;
	while((!TI)&&(time_out<10))
	{time_out++;DelayMs(1);}
	TI = 0;
}

void SendStr(unsigned char *s,unsigned char length)
{
	unsigned char NUM;
	NUM=0x00;
	while(NUM

链接:https://pan.baidu.com/s/1E-NbbzLJytTXx7xI5bz6zQ
提取码:lh8k

你可能感兴趣的:(基于51单片机的霍尔测转速表温度检测调速方案原理图程序设计)