当前位置: 移动技术网 > 科技>人工智能>嵌入式 > 51单片机Proteus仿真+Keil工程-实验4-外部中断-步进电机驱动

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

2020年08月12日  | 移动技术网科技  | 我要评论
实验4-单片机定时器外部中断实验:外部中断+步进电机+LED控制设定外部信号发生器每2s钟,产生一个下降沿,作为外部中断源,中断处理完成led灯的闪烁一次,以及控制步进电机旋转一圈。

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

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

实验目的:

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

实验目标:

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

实验环境:

   MDK-ARM V5.21a、Proteus 8.6

实现效果:

在这里插入图片描述

Proteus原理图

在这里插入图片描述

选择元器件:

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网