课程设计报告之直流电机控制(C语言版)文档格式.doc

上传人:wj 文档编号:8431102 上传时间:2023-05-11 格式:DOC 页数:13 大小:306KB
下载 相关 举报
课程设计报告之直流电机控制(C语言版)文档格式.doc_第1页
第1页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第2页
第2页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第3页
第3页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第4页
第4页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第5页
第5页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第6页
第6页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第7页
第7页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第8页
第8页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第9页
第9页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第10页
第10页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第11页
第11页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第12页
第12页 / 共13页
课程设计报告之直流电机控制(C语言版)文档格式.doc_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计报告之直流电机控制(C语言版)文档格式.doc

《课程设计报告之直流电机控制(C语言版)文档格式.doc》由会员分享,可在线阅读,更多相关《课程设计报告之直流电机控制(C语言版)文档格式.doc(13页珍藏版)》请在冰点文库上搜索。

课程设计报告之直流电机控制(C语言版)文档格式.doc

附:

A.L298的原理图

B.本设计所需要芯片以及作用

AT89C51:

单片机

L298:

控制电机驱动和转向

74L408:

四与门芯片

8255A:

用于扩展51端口,作显示用

2803:

显示缓冲用

MAX239:

串口通讯芯片

四.流程图

入口

启动

NY

P1_5=1,P1_4=1

停止

P1_5=0

Y

加速

N

a=a+n,P1_4=0

Y

a>

150

a=150

Y

a=a-n,P1_4=0

减速

P1_6=0,P1_7=1,P1_4=1

Or

P1_6=1,P1_7=0,P1_4=1

a<

10

NN

反转/正传

Y

a=10

进入预先设定的值

预设速度

YN

电机停转

五.程序清单

#include<

at89x51.h>

motor_ctr.h>

absacc.h>

stdio.h>

intrins.h>

#definePAXBYTE[0x1FFF]//A口地址;

#definePBXBYTE[0x3FFF]//B口地址;

#definePCXBYTE[0x5FFF]//C口地址;

#defineCONXBYTE[0x7FFF]//*控制字地*/;

ucharkey=0;

//定义key为全局变量

uinta=100;

ucharn=5;

//单次增加的步长,用于输出脉冲占空比控制

uintk1=0,mn=10;

//设置mn为转向标志位

ucharbai,shi,ge;

uintseg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};

//0~9的七段显示代码;

/*THEMAINPROCESS*/

voidmain()

{

CON=0x80;

P1_5=0;

//使电机停转;

TMOD=0x15;

//定时器1工作在模式1

TH1=0xFF;

//定时器1的溢出中断时间为50ms;

TL1=0xb0;

ET1=1;

TR1=1;

while

(1)

{

key=GetKey();

/*case1~case9是预先设定的速度,方便电机直接调节到该速度,避免通过’+’键调节*/

switch(key)

{case'

1'

:

{a=10;

break;

}

case'

2'

{a=25;

break;

}

case'

3'

{a=40;

4'

{a=55;

5'

{a=70;

6'

{a=90;

7'

{a=110;

8'

{a=130;

9'

{a=150;

+'

{P1_4=0;

control();

} //电机加速

case'

-'

{control();

} //’-‘代表减速

='

{P1_7=0;

P1_6=1;

mn=0;

}//电机顺时针转

c'

{P1_7=1;

P1_6=0;

mn=1;

control();

} //逆时针转

/'

} //‘/‘键按下时,电机开始转动

default:

break;

//不影响电机运行

}

}

}

/*THEENDOFMAINPROCESS*/

/*THEINTERRUPTIONFUNCTION*/

voidtime()interrupt3//中断号为3,即是定时器1溢出中断

{//此处是计时50ms中断一次

TR1=0;

//此函数用于显示速度

k1+=TL0;

display(a/100,a%100/10,a%10,mn);

/*if(count==51)

{

sprintf(s,"

%04d"

k1%1000);

//注意sprintf的用法;

//确保有四位输出

count=1;

k1=0;

}

display(a,bai,shi,ge);

*/

TH1=0x3c;

TL1=0xb0;

TH0=0x00;

TL0=0x00;

TR1=1;

}

/*THEINTERRUPTIONFUNCTION*/

/*THEGETKEYFUNCTIONWHICHWASUSEDTOGETTHEINFORMATIONFROMTHEKEY*/

/*行信号从P1口的低四位读进,列信号从P2口的高四位读进*/

ucharGetKey()

{

P1_0=0;

P1_1=1;

P1_2=1;

P1_3=1;

P2_0=1;

P2_1=1;

P2_2=1;

P2_3=1;

_nop_();

_nop_();

//适当的延时以便消除抖动

if(!

P2_0)return'

;

if(!

P2_1)return'

P2_2)return'

if(!

P2_3)return'

P1_0=1;

P1_1=0;

P2_3){P1_4=0;

return'

*'

P1_0=1;

P1_2=0;

P1_3=0;

P2_1){P1_4=0;

0'

}//P1_4和P1_5脚通过一个“与”门用来防止误启动

return0;

}

/*延时程序*/

/*THEDELAYFUNCTION*/

voiddelay(uinti)

{

uintj,k;

for(;

i>

0;

i--)

for(j=10;

j>

j--)

for(k=10;

k>

k--);

/*THEDISPLAYFUNCTION*/

voiddisplay(ucharbai,ucharshi,ucharge,uintmn)

PB=0x08;

//00001000

PA=seg_code[ge];

delay

(2);

PB=0x04;

//00000100

PA=seg_code[shi];

PB=0x02;

//00000010

PA=seg_code[bai];

PB=0x01;

//00000001

PA=seg_code[mn];

delay

(2);

//注意这儿的延时越短越好,应为处理终端的时间越短,对电机//的实时性显示就越好;

}

/*THECONTROLFUNCTION*/

/*

由于参数a是一个全局变量,代表着脉冲的占空比,每次调用函数时;

必须注意参数a值;

/*如果按键为‘-’,‘+’(加速减速)以及‘c'

,’=‘(正转反转)时,不需跳出循环,按其他键时,需要跳出循环, 必须需要重新设置占空比*/

/*P1_4和P1_5脚通过一个“与”门用来防止误启动*/

voidcontrol()

{

EA=1;

while

(1)

{

if(a>

=150)

a=150;

//设置了a的最大值,限定了电机的最高速度

if(a<

=10)

a=10;

//设置了a的最小值,限定了电机的最高速度

P1_5=1;

//与P1_4信号形成控制L298的控制信号达到控制转速的目的

delay(a);

//调用延时,形成脉宽的调节

P1_5=0;

//电机逐渐停转;

delay(160-a);

/*以下的程序改变a的值达到改变脉冲宽度的目的*/

key=GetKey();

if(key=='

)//减速

a=a-n;

elseif(key=='

{a=a+n;

}//加速

)//如果按下’=‘键,则电机顺时针转;

{

P1_6=1;

P1_7=0;

mn=0;

}

)//反转

{P1_7=1;

P1_6=0;

P1_4=1;

mn=1;

}

||key=='

) //如果按下停止键’*‘或者’0’ ;

{P1_5=0;

P1_4=1;

//ENA=0(P1_5=0)电机停转;

break;

}

elseif(key!

=0) //如果没有按键按下,则继续在此while循环中运行

{

switch(key)

{

case'

{a=10;

}

case'

{a=25;

}

{a=40;

break;

{a=55;

{a=70;

{a=90;

{a=110;

{a=130;

{a=150;

}

default:

break;

}

}

EA=1;

}

motor_ctr.hFILE

typedefunsignedcharuchar;

typedefunsignedintuint;

externucharGetKey();

externvoiddelay(uinti);

externvoidcontrol();

voiddisplay(ucharbai,ucharshi,ucharge,uintmn);

六.课程设计心得

两周的课程设计结束了,总得算来,这两周的课程设计体会颇多。

这是我们第一次亲自设计一个系统,包括硬件和软件,还自己动手焊接了诸多的元器件,体会到了科研的滋味。

起初我们想用汇编编写的,因为我们才刚刚学过AT89C51的汇编语言,印象很深刻。

但是在编写的过程中,我感觉到,用汇编语言,我很难表达出自己的意思,很难达到目的。

后来思来想去还是决定改用C语言,毕竟我对C语言自我感觉还是很好的。

但是,面对的首要问题是,如何将C语言和硬件结合起来编程,面对这一个问题,我先后从图书馆借来了《单片机C语言教程》和《手把手教你学单片机C语言这两本》,老老实实的学习了这方面的内容。

但是,随着编程的进行,我发现之前的原理图设计存在问题,因为我原先设计是将列信号从P3口的低四位,这样造成了下载的时候按键时造成下载不成功,但在仿真的时候完全正确。

后来改用P2口的时候就可以达到了目的。

在系统的调试中,遇见了任何键都可以启动的问题,在停止电机转动后,按下加速等键,电机自动启动,这样不利于调速的系统的应用。

我设想了改用P1_4引脚和P1_5引脚通过与门(74L408芯片)后,作为L298的使能信号,控制L298的通断,达到实现防止误启动的目的,同时又能达到控制电机转速的目的。

不过在检查的时候,张老老师说,由于按键太多,所以不是很好,但我以为,所设按键是为了方便电机直接调节到某一速度而设计的,所以没有显得多余。

13

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2