系统的功能分析
链接:https://pan.baidu.com/s/114nSwEcDQdt8n1L8XADtiQ 提取码:hdib
本设计由STC89C52单片机电路+液晶LCD1602显示电路+光电测速(槽型光耦)电路+电源电路组成。 1、通过光电传感器测速,光电传感器检测轮盘上的孔数进而知道轮盘转了多少周。 2、LCD1602液晶实时显示转速。 本系统具体框图: 原理图设计: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200723204453962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDExNjE3NQ==,size_16,color_FFFFFF,t_70)
CXGO光电槽型光耦传感器模块电路设计 本光电槽型光耦传感器是基于红外对管模块的红外传感器。该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),此传感器广泛用于电机转速检测,脉冲计数,位置限位等。 一、模块参数说明 (1)有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。 (2)有遮挡,输出高电平;无遮挡,输出低电平。 (3)比较器输出,信号干净,波形好,驱动能力强,超过15mA。 (4)工作电压3.3V-5V (5)输出形式 :数字开关量输出(0和1) (6)使用宽电压LM393比较器 二、模块接口说明 (1)VCC 电源正 (2)GND电源负 (3)DO数字量输出 (4)AO无效 光电槽型光耦模块内部电路图如下图所示,其中R1电阻为分压电阻,将光电槽型光耦传感器检测到的障碍信息转化为模拟电压信号,模拟量信号接入LM393比较器后,即可与LM393比较器芯片2号引脚所接的分压电阻分压后的模拟电压进行比较,进而得出DO数字信号(即高低电平信号)。C1、C2为滤波电容,C1电容对电源进行滤波,让电源输出更稳定。C2电容对模拟信号进行滤波,保证模拟信号输出的稳定性。R2、R3均为限流电阻,来保护LED灯,防止LED灯烧坏,LED灯均为低电平有效。R7也为限流电阻,保护红外发射头,以防烧坏。R4为上拉电阻,上拉就是将不确定的信号通过一个电阻钳位在高电平,同时起限流作用。保证LM393比较器输出的高低电平信号在与单片机引脚连接时电平信号的读取更加稳定。
光电槽型光耦模块模块接口原理图如下图所示。 5V直流电机调速电路设计 电动马达(Electric motor),又称为马达或电动机,是一种将电能转化成机械能,并可再使用机械能产生动能,用来驱动其他装置的电气设备。 直流电动机(DC Motor)的好处为在控速方面比较简单,只须控制电压大小即可控制转速,但此类电动机不宜在高温、易燃等环境下操作,而且由于电动机中需要以碳刷作为电流变换器(Commutator)的部件(有刷马达),所以需要定期清理炭刷磨擦所产生的污物。 马达的旋转原理的依据为佛来明左手定则,当一导线置放于磁场内,若导线通上电流,则导线会切割磁场线使导线产生移动。电流进入线圈产生磁场,利用电流的磁效应,使电磁铁在固定的磁铁内连续转动的装置,可以将电能转换成力学能。 与永久磁铁或由另一组线圈所产生的磁场互相作用产生动力 直流马达的原理是定子不动,转子依相互作用所产生作用力的方向运动。 交流马达则是定子绕组线圈通上交流电,产生旋转磁场,旋转磁场吸引转子一起作旋转运动直流马达的基本构造包括“电枢”、“场磁铁”、“集电环”、“电刷”。 电枢:可以绕轴心转动的软铁芯缠绕多圈线圈。 场磁铁:产生磁场的强力永久磁铁或电磁铁。集电环:线圈约两端接至两片半圆形的集电环,随线圈转动,可供改变电流方向的变向器。每转动半圈(180度),线圈上的电流方向就改变一次。 电刷:通常使用碳制成,集电环接触固定位置的电刷,用以接至电源。 本系统选通过纯模拟电路即可实现对电机转速的调节,DC为电源插座,SW2为电源开关,PR为10K的大功率电阻。当系统上电后,按下电源开关,通过调节电位器PR即可实现调速,调节PR,则分配到电机上的电压则会在0-5V变化,通过改变施加在电机上的电压的变化来实现对电机转速的调节。其具体原理图如下图所示。电机最大的速度只与电位器分配到电机上的电压有关。 系统软件设计 部分代码
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include "1602.h"
#include "delay.h"
unsigned long PluNum=0; //检测速度转化来的脉冲量
unsigned long time_ms; //定时器计数
float Juli=0; //距离计算
char displaytemp[16]; //显示更新暂存
unsigned char DealSudu=0; //处理速度
void Init_Timer0(void); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
Init_Timer0(); //定时器0初始化
EX0=1; //外部中断0开
IT0=1; //边沿触发
EA=1; //全局中断开
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
LCD_Write_String(0,0,"My Designer! "); //初始化
sprintf(displaytemp,"ZhuanSu:%3.1fr/s",Juli);
LCD_Write_String(0,1,displaytemp);
while (1) //主循环
{
if(DealSudu==1)
{
DealSudu=0;
Juli=(float)PluNum/20.0/3.0; //m/s 20个脉冲为1圈 3s时间进行检测
PluNum=0;
sprintf(displaytemp,"ZhuanSu:%3.1fr/s",Juli); //打印转速
LCD_Write_String(0,1,displaytemp); //显示
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 Count=0; //计数
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_ms++;
if(time_ms%48==0) //定时处理
{
Count++;
if(Count>3) //3s进行处理
{
DealSudu=1;
}
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
PluNum++; //脉冲计数
}
.
.
|