ULN2003直流电机正反转以及10级调速
- 格式:docx
- 大小:65.33 KB
- 文档页数:8
ULN2003直流电机正转以及10级PWM调
速功能说明
本设计是基于STC89C52单片机和ULN2003芯片驱动的直
流电机。
并在数码管显示当前速度级数。
具有正传和PWM
10级调速等功能。
速度的控制是由PWM输入信号来完成的。
通过调节pwm信号的占空比来完成速度的控制。
(1)通过52单片机加载程序,ULN2003做驱动控制直
流电机旋转。
(2)用按键增加或者减小当前的旋转速度,可以控制10
级变速。
(3)用数码管显示当前旋转的速度级数。
一、原理图
(1)最小系统
(2)驱动芯片
二、源程序代码
#include<reg52.h>
#define uint unsigned int
uint pp;
char num=2,dis;
sbit pwm=P3^6;
sbit s2=P3^4;
sbit s3=P3^5;
sbit dula=P2^0; //段选信号的锁存器控制
sbit wela=P2^1; //位选信号的锁存器控制
sbit cs88=P2^2; //点阵管的锁存器控制
cs88=0;//关点阵管
sbit LCD1602=P2^5; //定义LCD1602使能端,用于HJ-C52实验板复位,与本实验无关
sbit DS1302=P2^7; //定义DS1302时钟使能端,用于HJ-C52实验板复位,与本实验无关
sbit SD=P2^6; //定义SD卡使能端,用于HJ-C52实验板复位,与本实验无关
void cmg88()//关数码管,点阵函数
cmg88();//关数码管,点阵函数
{
dula=1;
P0=0x00;
dula=0;
cs88=0x00;
P0=0x00;
cs88=1;
}
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void keyscan()
{
if(s2==0)
{
while(!s2);
num++;
if(num==11)
num=10;
dis=num;
}
if(s3==0)
{
while(!s3);
num--;
if(num==-1)
num=0;
dis=num; }
}
void display(a) {
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
}
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=(65536-160)/256;
TL0=(65536-160)%256;
ET0=1; //开定时器0中断
EA=1; //开总中断
num=6;
//主板初始化因51单片机芯片开机时各个IO口输出为高电平,加上以下源代码是为了防止各种外部模块误动作
DS1302=0; //关DS1302模块,与本实验无关
SD=0;//关SD卡模块,与本实验无关
LCD1602=0;//关LCD1602模块,与本实验无关
cs88=0;//关点阵管
while(1)
{
keyscan();
if((num!=0)&&(num!=10)) //对于占空比为0和100%这两种极端情况,最好分离出,单独考虑
{
if(pp<=num)
pwm=1;
else
pwm=0;
}
else if(num==0) //当占空比为0
pwm=0;
else
pwm=1;
display(num);//显示num当前值,占空比为num/10。
}
}
void time0() interrupt 1
{ T H0=(65536-160)/256;
TL0=(65536-160)%256;
pp++;
if(pp==11) //当占空比为100%
pp=0;
}
三、设计总结
本次设计由于在设计时没能完善设计思路。
导致器件
采集时没有买L293芯片,所以直流电机的反转只能
靠手动换线完成。
以后要吸收教训,提前准备好器件。