直流电机调速霍尔测速

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
/**********************************************************************
独立按键检测
**********************************************************************/
{
while(k4==0); //按键4抬起
//W=0; //脉宽清0
k=0; //按键标记清0
e=0;
}
}
void main(void)
{
init(); /////////系统初始化
while(1)
{
key(); ////////查询按键
disp_count();//数据处理
warning_speed();//转速警告
MOTOR_A_2=1;
}
if(T==100)
T=0;
}
/*--------------------向LCD1602写命令--------------------*/
void write_command(uchar command)
{
rs=0;//选择写命令
P0=command;//向LCD写命令
lcdcs=1;//信号使能端高电平
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的读写选择端
lcdcs=0;//信号使能端低电平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写数据--------------------*/
void write_data(uchar data0)
displaytolcd();//LCD显示
}
}
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的使能信号端
{
rs=1;//选着写数据
P0=data0;//向LCD写数据
lcdcs=1;//信号使能端高电平
lcdcs=0;//信号使能端低电平
}
/*------------------------LCD显示------------------------*/
void displaytolcd()
{
write_command(0x80);//向LCD1602写命令80H
void Timer_0(void) interrupt 1
{
TH0=0x65;//50ms定时
TL0=0xF3;
msec++;
if(msec==20)//50*20=1S
{
displaytolcd();
msec=0;
zhuan=z;
z=0;
}
}
/*-----------------------数据处理------------------------*/
定时器变量定义
**********************************************************************/
void init(void)
{
warning=0;//关蜂鸣器
z=0;//初始化z的值
count=0;//初始化count的值
zhuan=0;//初始化转的值
}
/*-------------------转速过高警告程序--------------------*/
void warning_speed()
{
if(zhuan>5000)//高于5000转打开警告
{
warning=1;
}
if(zhuan<=5000)//低于5000转关闭警告
{
warning=0;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************
{
EX1=0;//关外部中断0
count++;
if(count==4)//4次循环为电机转一圈
{
count=1;//初始化计数
z++;//转圈计数加1
}//计数+1
EX1=1;//开外部中断0
return;
}
/*-----------------内部中断0计时计数程序-----------------*/
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; //计数变量
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');//转换转速的个位
L7010r接口定义
**********************************************************************/
sbit MOTOR_A_2=P1^4;//正转
sbit MOTOR_A_1=P1^5;//反转
sbit EN_MOTOR_A =P3^4;
//sbit warning=P3^1;//蜂鸣器端
uint b,z,count,zhuan,msec;//定义参数
//uchar display[]={" speed= r/sec"};//定义显示参数
void delay(uint ms); //固定函数声明
/*-----------------------毫秒延时------------------------*/
TMOD=0x01;//内部中断定时器选择
TH0=0x66;//50ms定时
TL0=0x50;
EA=1;//开中断总开关
ET0=1;//开内部中断0
TR0=1;//计时器开始工作
IT0=1;//外部中断0为下降沿触发
EX0=1;//开外部中断0
}
void timer0() interrupt 1 //用于马达转速的中断服务程序
if(W==0) //如果脉宽为0
W=100; //脉宽设置成100
else
W-=1; //否则减1
}
else if(k3==0) //按键3按下正转
{
while(k3==0); //按键3抬起
A=!A; //方向标记取反
k=0; //按键标记清0
e=1;
}
else if(k4==0) //按键4按下
{
//重置定时器时间
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;
void delay(uint ms)
{
uint b,j;//为延时引入i,j两参数
for (j=0;j<ms;j++)//延时第一循环
for (b=0;b<120;b++);//延时第二循环
}
/*********************************************************************
for (b=0;b<sizeof(display)-1;i++)//循环要传输的字符个数次,每一次传输一个字符
{
write_data(display[i]);
delay(5);
}
}
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 0
void key(vBaidu Nhomakorabeaid) //按键判断程序
{
if(k1==0) //按键1按下
{
while(k1==0); //按键1抬起
if(W==100) //如果脉宽为100
W=0; //脉宽置0
else
W+=1; //否则加1
}
else if(k2==0) //按键2按下
{
while(k2==0); //按键2抬起
rw=0;//选择LCD写数据指令
delay(15);//延时15ms
write_command(0x38);//向LCD1602写命令38H
delay(5);//延时5ms
write_command(0x0e);//向LCD1602写命令0EH
delay(5);//延时5ms
write_command(0x06);//向LCD1602写命令06H
相关文档
最新文档