您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页直流电机调速霍尔测速

直流电机调速霍尔测速

来源:爱go旅游网


#include

#include

#define uchar unsigned char

#define uint unsigned int

/**********************************************************************

L7010r接口定义

**********************************************************************/

sbit MOTOR_A_2=P1^4; //正转

sbit MOTOR_A_1=P1^5; //反转

sbit EN_MOTOR_A =P3^4;

sbit k1=P1^3; //定义k1为p1.5口

sbit k2=P1^2; //定义k2为p3.1口

sbit k3=P1^1; //定义k3为p3.2口

sbit k4=P1^0; //定义k4为p3.3口

sbit rs=P2^0; //LCD的数据/命令选择端

sbit rw=P2^1; //LCD的读写选择端

sbit lcdcs=P2^2; //LCD的使能信号端

sbit warning=P3^1; //蜂鸣器端

uchar e=0;

uchar T=0; //定时标记

uchar W=0; //脉宽值 0~100

uchar A=0; //方向标记 0,1

uchar k=0; //按键标记

uchar i=0; //计数变量

uint b,z,count,zhuan,msec; //定义参数

uchar display[]={\" speed= r/sec\ //定义显示参数

//sbit rs=P2^7; //LCD的数据/命令选择端

//sbit rw=P2^6; //LCD的读写选择端

//sbit lcdcs=P2^5; //LCD的使能信号端

//sbit warning=P3^1; //蜂鸣器端

uint b,z,count,zhuan,msec; //定义参数

//uchar display[]={\" speed= r/sec\ //定义显示参数

void delay(uint ms); //固定函数声明

/*-----------------------毫秒延时------------------------*/

void delay(uint ms)

{

uint b,j; //为延时引入i,j两参数

for (j=0;jfor (b=0;b<120;b++); //延时第二循环

}

/*********************************************************************

定时器变量定义

**********************************************************************/

void init(void)

{

warning=0; //关蜂鸣器

z=0; //初始化z的值

count=0; //初始化count的值

zhuan=0; //初始化转的值

rw=0; //选择LCD写数据指令

delay(15); //延时15ms

write_command(0x38); //向LCD1602写命令38H

delay(5); write_command(0x0e); delay(5); write_command(0x06); TMOD=0x01; TH0=0x66; TL0=0x50;

EA=1; ET0=1; TR0=1; IT0=1; EX0=1; }

//延时5ms

//向LCD1602写命令0EH

//延时5ms

//向LCD1602写命令06H

//内部中断定时器选择

//50ms定时

//开中断总开关

//开内部中断0

//计时器开始工作

//外部中断0为下降沿触发

//开外部中断0

void timer0() interrupt 1 //用于马达转速的中断服务程序

{

//重置定时器时间

TL0=0x17;

TH0=0xff;

T++; //定时标记加1

disp(); //数码管显示

if(T>W){

EN_MOTOR_A =0;

if(e==1)

{MOTOR_A_2=0;

}

else if(e==0)

{MOTOR_A_1=0;

}

}

else {

EN_MOTOR_A =1;

MOTOR_A_1=1;

MOTOR_A_2=1;

}

if(T==100)

T=0;

}

/*--------------------向LCD1602写命令--------------------*/

void write_command(uchar command)

{

rs=0; //选择写命令

P0=command; //向LCD写命令

lcdcs=1; //信号使能端高电平

lcdcs=0; //信号使能端低电平

}

/*-------------------------------------------------------*/

/*--------------------向LCD1602写数据--------------------*/

void write_data(uchar data0)

{

rs=1; //选着写数据

P0=data0; //向LCD写数据

lcdcs=1; //信号使能端高电平

lcdcs=0; //信号使能端低电平

}

/*------------------------LCD显示------------------------*/

void displaytolcd()

{

write_command(0x80); //向LCD1602写命令80H

for (b=0;b{

write_data(display[i]);

delay(5);

}

}

/*-------------------外部中断0计数程序-------------------*/

void counter(void) interrupt 0

{

EX1=0; //关外部中断0

count++;

if(count==4) //4次循环为电机转一圈

{

count=1; //初始化计数

z++; //转圈计数加1

} //计数+1

EX1=1; //开外部中断0

return;

}

/*-----------------内部中断0计时计数程序-----------------*/

void Timer_0(void) interrupt 1

{

TH0=0x65; TL0=0xF3;

msec++;

if(msec==20) {

displaytolcd();

msec=0;

zhuan=z;

z=0;

}

}

//50ms定时

//50*20=1S

/*-----------------------数据处理------------------------*/

void disp_count()

{

display[9]=(zhuan/1000+'0'); //转换转速的千位

display[10]=(zhuan/100%10+'0'); //转换转速的百位

display[11]=(zhuan/10%10+'0'); //转换转速的十位

display[12]=(zhuan%10+'0'); //转换转速的个位

}

/*-------------------转速过高警告程序--------------------*/

void warning_speed()

{

if(zhuan>5000) //高于5000转打开警告

{

warning=1;

}

if(zhuan<=5000) //低于5000转关闭警告

{

warning=0;

}

}

/**********************************************************************

按键检测

**********************************************************************/

void key(void) //按键判断程序

{

if(k1==0) //按键1按下

{

while(k1==0); //按键1抬起

if(W==100) //如果脉宽为100

W=0; else

W+=1; }

else if(k2==0) {

while(k2==0); if(W==0) W=100; else

//脉宽置0

//否则加1

//按键2按下

//按键2抬起

//如果脉宽为0

//脉宽设置成100

W-=1; //否则减1

}

else if(k3==0) //按键3按下 正

{

while(k3==0); A=!A; k=0; e=1;

}

else if(k4==0) {

while(k4==0); //W=0; //按键3抬起

//方向标记取反

//按键标记清0

//按键4按下

//按键4抬起

//脉宽清0

k=0; //按键标记清0

e=0;

}

}

void main(void)

{

init(); while(1)

{

key(); disp_count(); warning_speed(); displaytolcd(); /////////系统初始化

////////查询按键

//数据处理

//转速警告

//LCD显示

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务