资源描述
大连理工大学本科实验报告
题目:基于AT89S52单片机直流电机设计
课程名称: 《电子工程训练》
学院(系): 电信学部
专 业: 通信工程
班 级: 电子1102班
学 号: 201181442
学生姓名: 陈柯锦
成 绩:
2014年 11月 12日
电子安装实验室安全守则
(请在下一页手抄一份安全守则)
1、 每次实验前,认真预习准备,仔细阅读实验安全守则,严格按照安全规范进行实验,确保实验安全;
2、 桌面要保持整洁,不允许有杂物,禁止将水杯、瓶装水放在桌面;
3、 电烙铁在使用前,必须检查电源线有无烫损漏线情况,一经发现,立即找老 师进行安全处理;
4、 电烙铁长时间不使用,应将电源线拔掉;电烙铁使用后,应放回烙铁架中,以免烫伤物品;
5、 实验结束后,必须拔掉电烙铁的电源线;已经加热的电烙铁,必须冷却后再放入抽屉中;
6、 焊锡中含铅,不要含在口中,实验结束后要洗手;
7、 稳压电源在使用前,应先调好要使用的电压,再进行线路连接,并确保连接的极性正确;
8、 抢救触电人员时,应首先切断电源或用绝缘物体挑开电源线,使触电者脱离电源,千万不要用手拖拉触电人员,以免连环触电;
9、 实验结束后,必须关闭桌面电源开关,将桌面收拾干净,工具物品整理好。
题目:基于AT89S52单片机直流电机设计
1 设计要求
a) 实现直流9V电源到5V输出的转换。
b) 设计单片机最小系统。
c)用单片机控制直流电机启动、加速、减速、正反转和停止。
d)利用数码管输出显示电机转动的档位和正反转标志。
2 设计分析及系统方案设计
1)方案设计:
首先对电压的转换可以使用整流桥和7805芯片来设计,直流电机只要能提供一定的直流就可以转动,改变电压极性可以改变转动方向,可以通过给直流电机提供脉冲信号来驱动它,利用PWM控制占空比从而达到改变电机速度,因此可以通过调整占空比从而能实现调速的目的。直流电机的驱动电路要有过流保护作用,可用二极管来实现,另外电机的驱动电流是比较大的所以需要用三极管来放大电流。程序可以通过对51单片机定时器重装初值进行改变,从而改变时间。数码管的显示采用四位一体数码,管利用四个选通端来控制不同位置的数码管输出显示,公用一组数据线。选用单片机四个引脚控制选通端,利用一个八位口来实现数据输出显示。
图2-1 总电路设计图
3 各功能模块硬件电路设计
1)电源电路
利用7805来实现电压的转换。在输入端由于输入直流电压存在极性不确定的情况,选用桥式整流避免输入电压的极性不同队之后电路的影响。7805两侧加入两个电容用于滤波,避免杂波对之后单片机系统的影响。当输出电压不足5V时,可在输入端并联一个大电容,利用其储能的作用抬升输入电压,从而使得7805输出达到5V。
图3-1 电源电路
2)H桥驱动电路
基于三极管的使用机理和特性,在驱动电机中采用H桥功率驱动电路,H桥功率驱动电路可应用于步进电机、交流电机及直流电机等的驱动.直流电机控制使用H桥驱动电路(下图所示),当P1^0输出1,P1^1输出0时,控制1输出的占空比可以实现电机的调速;P1^0输出0,P1^1输出1时,电机转动方向改变,利用输出1的引脚变化来实现电机的正反转。
图3-2 H桥的电机驱动电路
3)51最小系统
单片机CPU部分
采用STC89C52芯片,封装DIP-40。40个引脚,用40个排针引出,40脚接VCC,20脚接GND,P0,P1,P2,P3做I\O接口。9脚接RST(复位电路)。18,19脚接晶振,(这次实验用晶振为12M)。31脚接EA,使能单片机。
晶振部分
采用12M晶振,接电容30P(可以用更小点的电容,小点的电容理论上效果会好点),用于滤波。在焊接电路的时候,晶振部分加了一个晶振插座,这样,可以更换升级晶振,以便适应不同的系统。
复位电路部分
电复位和手动复位,电复位就是接一个10uF的电容,手动复位就是接一个开关,这个开关选用点触开关比较方便。开关按下之后RET引脚为高,单片机复位。
P2^0引脚接一个LED灯,用于调试最小系统是否正常工作。P0口由于不输出高电平,不用拉动外部负载,所以未接上拉电阻,直接与之后的四位一体数码管的数据线相连,输出低电平有效。
图3-3 51最小系统
4)LCD显示模块
四位数码管是一种半导体发光器件,其基本单元是发光二极管。能显示4个数码管叫四位数码管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
图3-4-1四位一体共阳极数码管ARK SR41028
图3-4-2 LCD显示电路
4 系统软件设计
1)软件流程图
图4-1 程序流程图
2)程序代码
#define _1_C_
#include "reg51.h"
#include "1.h"
#include "absacc.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
/********变量定义**********/
uchar code smg[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xB8,0x8E};//定义共阳数码管表
char data led[4]={0xfd,0xfb,0xf7,0xef}; //数码管选择
char g; //个
uint x; //数码管显示的数值
uchar k; //正反转标志位
int t=0; //档位调节位
int m=0; //译码器选择位
bit stop=1; //终止标志
uchar f=9; //供电周期
sbit P30=P1^0; //正向供电
sbit P31=P1^1; //反向供电
sbit P10=P1^2; //正反转
sbit P11=P1^3; //加速
sbit P12=P1^4; //减速
sbit P13=P1^5; //停止
//sbit P14=P1^6; //启动
sbit P15=P1^7; //外部中断控制位
/*****************延时函数******************************/
void delay ()
{
uchar i;
for(i=4608;i>0;i--);
}
/*****************定时器0背景程序***********************/
void time0 ()
{
if(k==0)
{
if(f<t)
P30=1;
else
P30=0;
P31=0;
}
else
{
if(f<t)
P31=1;
else
P31=0;
P30=0;
}
if(f==0)
{
f=9;
}
}
/*****************数码管显示****************************/
void display ()
{
uchar i,n;
if(stop==0)
{
x=t;
g=x%10; //求速度个位值,送到个位显示缓冲区
for(i=0;i<4;)
{
P2=led[i];
if(i==0) //显示个位
{
P0=smg[g];
delay();
}
else if(i==1) //显示十位
{
P0=0xB7;
delay();
}
else if(i==2) //显示百位
{
P0=0xC1;
delay();
}
else if(i==3) //显示千位
{
if(k==0) //正转不显示
{
P0=0xFF;
delay();
}
else
{
P0=0xBF; //反转时显示"-"
delay();
}
}
P0=0xFF; //去重影
i++;
}
}
else
{
for(n=0;n<4;)
{
P2=led[n];
if(n==0)
{
P0=0x8C;
delay();
}
else if(n==1)
{
P0=0xC0;
delay();
}
else if(n==2)
{
P0=0x87;
delay();
}
else if(n==3)
{
P0=0x92;
delay();
}
P0=0xFF; //去重影
n++;
}
}
}
/*****************按键扫描******************************/
void key ()
{
if(P10==0) //如果按下
{
while(!P10) //去抖动
display();
k=~k;
}
if(P13==0) //启动
{
while(P13==0);
IE |= 0x80; //EA置1
TH0=-(18433/256); //给定时器0装入初值
TL0=-(18433%256);
TR0=1; //定时器0开始计数
EX0=1; //开外部中断0
stop=0;
}
if(P11==0) //加速
{
while (P11==0);
t++;
}
if(t>=9)
t=9;
if(P12==0) //减速
{
while(P12==0);
t--;
}
if(t<1)
t=0;
/*****************定时器0中断程序***********************/
void TIME0_ROUTING () interrupt 1 using 2
{
TH0=-(18433/256); //定时器0初始化
TL0=-(18433%256);
f--;
P15=0;
time0();
P15=1;
}
/*****************外部中断0初始化***********************/
void INIT_INT0 ()
{
IT1 = 1;
IT0 = 1;
IP &= 0x00; //设定外部中断0优先级为低优先级
IE |= 0x01; //开外部中断0
}
/*******************************************************/
/*****************定时器0初始化*************************/
void INIT_TIME0 ()
{
TMOD &= 0x00; //工作模式清零
TMOD |= 0x01; //工作模式选方式1
IP &= 0xFD; //设定定时器0中断为低优先级
IE |= 0x02; //开定时器0中断
}
/*****************中断初始化****************************/
void InitInterrupt ()
{
INIT_INT0();
INIT_TIME0();
}
/*****************主函数********************************/
void main ()
{
IE=0x00; //关中断
InitInterrupt(); //中断初始化
g=0; //数码管初始化
P0=0xFF;
P2=0xF1
x=0;
k=0;
while(1)
{
display ();
key();
}
5 系统调试运行结果说明计分析
运用汇编语言进行程序编写,运用MedWin进行单片机仿真,运用Keil C51进行软件的仿真。通过硬件可实现9V转换为5V的接口,按下相应的键时,直流电机能实现启动、左传、右转、加速、减速等功能。
6 结论和体会
通过本次实验,我对电路的硬件设计和软件编程的结合有了一定的锻炼,在电路的焊接有了初步的认识和实践,尽管第一次焊的电路不够美观,设计不够合理,但是这也是一种新的体验和学习。在51单片机的编程上,由于以前是用汇编编程,所以用c编程显得比较不熟练,但是在老师的悉心指导下,也成功的完成了电路的编程。本次实验收获颇多,希望以后有更多的机会去尝试,锻炼自己的综合能力。
展开阅读全文