基于51单片机的直流电机控制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的直流电机控制

一、试验器件选择

1、控制芯片的作用主要是与L289相连接驱动直流电机,以及与八位数码管相连

显示。

(1)、AT89C51是一种带4K自己FLASH存储器的低压、高性能CMOS8为微处理器。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失真存储制造技术制造,与工业标准的MCS-51指令集和输出关键相兼容。由于将多功能8位CPU和闪存组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性奥高且廉价的方案。

(2)、AT89C51引脚图如下:

2、电机驱动芯片

(1)、电机驱动芯片选择L298。其主要功能是作为单片机与直流电机中间的过度链接,单片机输出的信号通过L298加载到直流电机上驱动直流电机运行。其引脚图如下:

(2)、主要工作原理:

1、15脚分别是两个H桥的电流反馈脚,不用时可以直接接地;

2、3为一对输出端口,1

3、14为一对输出端口;

4为驱动电压输入,最小值必须比输入的低电平高2;

5、7一对输入端口,10、12一对输入端口,TTL电平兼容

6、11使能端,低电平禁止输出;

8、9分别为接地和逻辑电源

3、直流电机。在protues中选择motor-encoder直流电机,引脚图如下:

上方左右的两个引脚在点击运转时输出频

率相同的方波,但是在相位上相差90 ,而且

在正转和反转是相反,因此可以根据这两个引

脚的输出情况判断点击的转向。上方中间的引

脚每当电机转一圈就输出一个正脉冲,可以据

此册数点击的转速。左右两个引脚是电机的电

压输入端。

4、74HC74。当D触发器的D和CLK输入端分别接电机上方的左右两个输出端口

时可以根据D触发器的输出情况判断点击的转速。

5、八位数码管。用以显示。

二、系统硬件设计连接

1、系统的器件连接图如下:

2、单片机与数码管通过P0口和P2口相连,其中P2口选择点亮哪一个数码管,P0口则控制被点亮的数码管显示的数据。

3、单片通过P1^0和P1^1和L298的第一对输入端IN1和IN2相连,然后又L298的第一对输出端OUT1和OUT2与直流电机相连,已达到控制直流电机的目的。

4、从P1^4到P1^7分别接一个Button按钮来实现PID控制,P3^6和P3^7分别接Button按钮实现对电机的加速与减速控制。

5、双刀双掷开关SW1课实现点击的正转与反转,单刀双掷开关SW2可实现点击的开启与停止。

三、系统程序设计及功能实现

1、程序流程图:

2、各部分实现程序: (1)、普通延时: #include void delayms(unsigned char x) { unsigned char i ; while(x--) for(i = 0 ; i < 120 ; i++) ; } (2)、数码管显示: #include #include #include void display_lilun(double num) { char code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //0~7对应数码 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //8~F 对应数码 long int n=num; P0 = 0; P2 =0x7f; P0 = table[n % 1000/100]; delayms(2);//百位加小数点 P0 = 0; P2 =0xbf; P0 = table[n % 100 / 10]; delayms(2);//十位 P0 = 0; P2 =0xdf; P0 = table[n % 10]; delayms(2);//个位 P0 = 0; //关闭显示器 } void display(double num,int dir) { char code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //0~7对应数码 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //8~F 对应数码 long int n=num*10; P0 = 0; P2 =0xf7; P0 = table[n / 1000]; delayms(2); //百位加小数点 P0 = 0; P2 =0xfb; P0 = table[n % 1000/100]; delayms(2); //百位加小数点 P0 = 0; P2 =0xfd; P0 = table[n % 100 / 10]+128; delayms(2);//十位 P0 = 0; P2 =0xfe; P0 = table[n % 10]; delayms(2);//个位 P0 = 0; //关闭显示器 if(dir==1) { P0=0;P2=0xef;P0=0x40;delayms(2); } }

(3)、按键扫描:

#include

sbit jiashi=P1^3; //对各个按钮进行位定义

sbit jianshi=P1^4;

sbit jia=P1^5;

sbit jian=P1^6;

sbit enter=P1^7;

extern int num_key[5]; //定义全局变量

void keyscan()

{

if(jiashi==0)

{

while(!jiashi);

num_key[0]++;

}

if(jianshi==0)

{

while(!jianshi);

num_key[1]++;

}

if(jia==0)

{

while(!jia);

num_key[2]++;

}

if(jian==0)

{

while(!jian);

num_key[3]++;

}

if(enter==0)

{

while(!enter);

num_key[4]++;

}

}

(4)、PWM波输出:

#include

#include

#include

extern int PWM ; //赋初值extern int start,sudu_lilun; extern double dis_count;

sbit S2 =P3^6 ; //PWM 值减少键

sbit S3 =P3^7 ; //PWM值增加键

void PWM_duty()

{

if(start>=1)

PWM=sudu_lilun;

do

{

if(PWM!=0xff)

{

PWM++ ;

delayms(10);

}

}

while(S3==0);

do

{

if(PWM>=0x02)

{

PWM-- ;

delayms(10);

}

}

while(S2==0);

}

相关文档
最新文档