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

硬件方案如下

链接:https://pan.baidu.com/s/1E-NbbzLJytTXx7xI5bz6zQ
提取码:lh8k
在这里插入图片描述
本设计由STC89C52单片机电路+LCD1602液晶显示电路+L298N电机驱动电路+按键电路+霍尔传感器电路+DS18B20温度传感器电路+电源电路组成。
1、通过按键可以控制电机的启动、停止、正转、反转、加速、减速。
2、通过温度传感器DS18B20检测温度。
3、通过液晶显示温度、PWM档位值、速度。
4、温度超过50度蜂鸣器报警。

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

在这里插入图片描述

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灯。
在这里插入图片描述
A3144霍尔传感器模块电路设计
在这里插入图片描述

主程序:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#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)	   //led1 占空比调节
	{
		if(MotorFlag==1)	//正转
		{IN1=1;IN2=0;}
		if(MotorFlag==0)	//反转
		{IN1=0;IN2=1;}
	}
	else 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<length)
	{
		SendByte(*s);
		s++;
		NUM++;
  	 }
}

void UART_SER (void) interrupt 4 	//串行中断服务程序
{
	unsigned char rebuf;
	if(RI)                        //判断是接收中断产生
	{
		RI=0;                      //标志位清零
		rebuf=SBUF;
		SBUF=rebuf;
	}
	if(TI)  //如果是发送标志位,清零
	TI=0;
} 

/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
	PluNum++;		
}
  • 8
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值