基于51单片机的直流电机控制系统设计Word文档格式.docx
《基于51单片机的直流电机控制系统设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的直流电机控制系统设计Word文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
第三章系统硬件电路设计
整体框图如下
第四章系统的软件设计
本系统编程部分工作采用KELI-C51语言完成,采用模块化的设计方法,与各子程序做为实现各部分功能和过程的入口,完成键盘输入、按键识别和功能、PWM脉宽控制和数码管显示等部分的设计。
单片机资源分配如下表:
P0
显示模块接口
键盘中断
P1
键盘模块接口
P1.0/P1.1
PWM电机驱动接口
系统时钟
①PWM脉宽控制:
本设计中采用软件延时方式对脉冲宽度进行控制,延时程序函数如下:
/*****************延时函数*************************/
delays()
{
uchari;
for(i=5000;
i>
0;
i--);
}
②键盘中断处理子程序:
采用中断方式,按下键,完成延时去抖动、键码识别、按键功能执行。
要实现按住加/减速键不放时恒加或恒减速直到放开停止,就需在判断是否松开该按键时,每进行一次增加/减少一定的占空比。
③显示子程序:
利用数组方式定义显示缓存区,缓存区有8位,分别存放各个数码管要显示的值。
④定时中断处理程序:
采用定时方式1,因为单片机使用12M晶振,可产生最高约为65.5ms的延时。
对定时器置初值B1E0H可定时20ms,即系统时钟精度可达0.02s。
当20ms定时时间到,定时器溢出则响应该定时中断处理程序,完成对定时器的再次赋值,并对全局变量time加1,这样,通过变量time可计算出系统的运行时间。
3、软件设计中的特点:
对于电机的启停,在PWM控制上使用渐变的脉宽调整,即开启后由停止匀加速到默认速度,停止则由于当前速度逐渐降至零。
这样有利于保护电机。
键盘处理上采用中断方式,不必使程序对键盘反复扫描,提高了程序的效率。
第五章:
程序
见附件1
第六章:
PCB图
第七章:
元件清单
元件
数量(个)
直流电机
1
极性电容20uf
1
按键
6
电容22pf
2
At8951
12MHZ晶振
RP1
1
四位一体数码管
Led
2
电阻1k
电阻200K
ULN2003
电阻10K
电源口HDR2x3
74LS04
下载口IDC
第八章:
参考文献
[1]
孙涵芳徐爱卿.MCS-51/96系列单片机原理及应用[M].北京:
北京航空航天大学出版社,1977..
[2]
何立民.单片机应用技术选编[M].北京:
北京航空航天大学出版社,2003..
[3]
史国生.交直流调速系统[M].北京:
化学工业出版社,2002.161-174.
第九章:
心得体会
本次课程设计虽然只有两周,但短短两周我掌握了汇编编程的原理和方法。
熟悉了单片机基本特征和电路设计的方法。
掌握了直流电机的控制方法。
熟练了运用定时器设计PWM波控制直流电机。
总之,收获很多。
附件1
/************头文件*********/
#include<
reg51.h>
absacc.h>
#include<
intrins.h>
/**************************/
/********自定义变量********/
#defineuintunsignedint//自定义变量
#defineucharunsignedchar
chargw,sw,bw,qw;
ucharj;
//定时次数,每次20ms
ucharf=5;
//计数的次数
sbitP10=P1^0;
//PWM输出波形1
sbitP11=P1^1;
//PWM输出波形2
sbitP12=P1^2;
//正反转
sbitP13=P1^3;
//加速
sbitP14=P1^4;
//减速
sbitP15=P1^5;
//停止
sbitP16=P1^6;
//启动
uchark;
uchart;
//脉冲加减
/**************************/*
/*********控制位定义********************/
ucharcodesmg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};
//程序存储区定义字型码表
chardataled[4]={0x08,0x04,0x02,0x01};
//位码
uintx;
//数码管显示的数值
display();
//数码管显示
delays();
//延时函数
key();
displays();
/*****************************************/
/***************主函数********************/
main(void)
{
TMOD=0x51;
//T0方式1定时计数T1方式1计数
TH0=0xb1;
//装入初值20MS
TL0=0xe0;
TH1=0x00;
//计数567
TL1=0x00;
TR0=1;
//启动t0
TR1=1;
//启动t1
gw=sw=bw=qw=0;
//数码管初始化
P0=0xc0;
P2=1;
while
(1)//无限循环
{
display();
key();
}
/***************数码管显示****************/
display()
gw=x%10;
//求速度个位值,送到个位显示缓冲区
sw=(x/10)%10;
//求速度十位值,送到十位显示缓冲区
bw=(x/100)%10;
//求速度百位值,送到百位显示缓冲区
qw=x/1000;
//求速度千位值,送到千位显示缓冲区
for(i=0;
i<
4;
)
P2=led[i];
if(i==0)//显示个位
{
P0=smg[gw];
delays();
}
elseif(i==1)//显示十位
{
P0=smg[sw];
}
elseif(i==2)//显示百位
{
P0=smg[bw];
delays();
}
elseif(i==3)//显示千位
if(k==0)//正转时显示"
三"
P0=0x49;
else
P0=0x71;
//反转时显示"
F"
}
i++;
/*******************************************************/
/************************************************/
/*********t0定时*中断函数*************/
voidt0()interrupt1using2
//重装t0
f--;
if(k==0)
if(f<
t)
P10=1;
else
P10=0;
P11=0;
if(f<
P11=1;
else
P11=0;
P10=0;
if(f==0)
f=5;
}
j++;
if(j==50)
j=0;
x=TH1*256+TL1;
//t1方式1计数,读入计数值
x++;
display();
/****************按键扫描**************/
key()
if(P12==0)//如果按下,
while(!
P12)//去抖动
k=~k;
}
if(P16==0)//启动
while(P16==0);
IE=0x8a;
}
if(P13==0)//加速
while(P13==0);
t++;
if(t>
=5)
t=5;
if(P14==0)//减速
while(P14==0);
t--;
if(t<
1)
t=1;
if(P15==0)//停止
while(P15==0);
EA=0;
}
课程设计成绩评定表
评定项目
内容
满分
评分
总分
学习态度
学习认真,态度端正,遵守纪律。
10
答疑和设计情况
认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。
40
说明书质量
设计方案正确、表达清楚;
设计思路、实验(论证)方法科学合理;
达到课程设计任务书规定的要求;
图、表、文字表达准确规范,上交及时。
回答问题情况
回答问题准确,基本概念清楚,有理有据,有一定深度。
总成绩
采用五级分制:
优、良、中、及格、不及格
指导教师评语:
签名:
年月日