欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

51单片机Proteus仿真+Keil工程-实验4-外部中断-步进电机驱动

程序员文章站 2022-03-03 19:01:38
实验4-单片机定时器外部中断实验:外部中断+步进电机+LED控制设定外部信号发生器每2s钟,产生一个下降沿,作为外部中断源,中断处理完成led灯的闪烁一次,以及控制步进电机旋转一圈。...

实验4-单片机定时器外部中断实验

  之前做的一次实验,51单片机定时器外部中断实验。虽说是个外部终端实验,但相对实验3而言,实验4像是它的简化版,不过多了不仅电机的控制。如有问题欢迎指正。

实验目的:

  掌握外部中断的打开方式;掌握步进电机的基本控制。

实验目标:

  设定外部信号发生器每2s钟,产生一个下降沿,作为外部中断源,中断处理完成led灯的闪烁一次,以及控制步进电机旋转一圈。

实验环境:

   MDK-ARM V5.21a、Proteus 8.6

实现效果:

51单片机Proteus仿真+Keil工程-实验4-外部中断-步进电机驱动

Proteus原理图

51单片机Proteus仿真+Keil工程-实验4-外部中断-步进电机驱动

选择元器件:

DEVICES 说明
7SEG-MPX8-CC-BLUE 八位共阴极数码管
MOTOR-STEPPER 步进电机
ULN2003A 达林顿管
AT89C51 MCU
BUTTON 按键
CAP 普通电容
CAP-ELEC 电解电容
CRYSTAL 晶振
LED-BLUE 蓝色LED灯
LED-RED 红色LED灯
LED-YELLOW 黄色LED灯
RES 电阻
RESPACK-8 排阻

  51单片机的P0口做IO口使用时是漏极开路输出,其引脚一般需要在片外接一定阻值的上拉电阻,此时端口不存在高阻抗的悬浮状态,因此它是一个准双向口。同时,P0口每一位的驱动能力是P1~P3口的两倍,每位可以驱动8个LSTTL(Low-power Schottky TTL,即低功耗肖特基TTL)输入,89C51等单片机任何一个端口想要获得较大的驱动能力,必须采用低电平输出。
  时钟晶体振荡频率为fosc=12MHZf_{osc}=12MHZ
  时钟周期相当于Tosc=1fosc83.33nsT_{osc}=\frac{1}{f_{osc}} \approx 83.33ns
  复位电路的话通过给89C51等单片机的复位引脚RST加上大于2个机器周期的高电平(即24个时钟振荡周期)就可以使单片机复位。

KEIL工程:

  1.按照要求,设定外部信号发生器每2s钟产生一个下降沿,即设置频率0.5HZ;
  2.步进电机是将脉冲信号转变为角位移或线位移的开环控制器件,非超载情况下,电机的转速停止的位置只取决于脉冲信号的频率和脉冲数,故它只有周期性的误差,而无累积误差;
  3.步进电机驱动芯片使用ULN2003A。此芯片是高耐压、大电流达林顿阵列产品,它由7个NPN达林顿管组成。ULN2003A具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点其输入5V的电平输出可达50mA/50V。

  主函数:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MotorPort P1
uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转
sbit LED=P1^7;
/*---函数声明---*/
void Init();
void SETP_MOTOR_FFW(uchar n);
void SETP_MOTOR_REV(uchar n);
void DelayMS(uint ms);
/*--------------*/
void main(void)
{
	Init();
	while(1)
	{
		/*要做的任务*/
	}
}

  定时器初始化及中断子函数:

void Init()
{
	EA=1;
	EX0=1;	//外部中断0开
	IT0=1;  //边沿触发
	LED=1;	//灭灯
}
/*外部中断0子程序,对应端口P3^2*/
void ISR_Key(void) interrupt 0 using 1
{
	SETP_MOTOR_FFW(1);
}

  电机驱动及延时函数:

void SETP_MOTOR_FFW(uchar n)
{
 	uchar i,j,temp;
	LED=~LED;
	for(i=0;i<5*n;i++)
	{
	 	for(j=0;j<8;j++)
		{
			MotorPort = FFW[j];
			for(temp=0;temp<25;temp++)
			{
				DelayMS(1);
			}
		}
	}
	LED=~LED;
}
void DelayMS(uint ms)
{
 	uchar i;
	while(ms--)
	{
	 	for(i=0;i<120;i++);
	}
}

参考文献
1.《单片机原理与接口技术》张毅刚

返回目录

本文地址:https://blog.csdn.net/qq_43353985/article/details/107945849