步进电机ULNWord下载.docx

上传人:b****5 文档编号:16693636 上传时间:2022-11-25 格式:DOCX 页数:18 大小:100.46KB
下载 相关 举报
步进电机ULNWord下载.docx_第1页
第1页 / 共18页
步进电机ULNWord下载.docx_第2页
第2页 / 共18页
步进电机ULNWord下载.docx_第3页
第3页 / 共18页
步进电机ULNWord下载.docx_第4页
第4页 / 共18页
步进电机ULNWord下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

步进电机ULNWord下载.docx

《步进电机ULNWord下载.docx》由会员分享,可在线阅读,更多相关《步进电机ULNWord下载.docx(18页珍藏版)》请在冰豆网上搜索。

步进电机ULNWord下载.docx

二、单片机最小系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:

单片机、晶振电路、复位电路.

下面给出一个51单片机的最小系统电路图.

说明:

复位电路:

由电容串联电阻构成,由图并结合"

电容电压不能突变"

的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平.至于如何具体定量计算,可以参考电路分析相关书籍.

晶振电路:

典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)

复位电路

一、复位电路的用途

单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。

单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。

单片机复位电路如下图:

二、复位电路的工作原理

在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,那这个过程是如何实现的呢?

在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。

所以可以通过按键的断开和闭合在运行的系统中控制其复位。

开机的时候为什么为复位?

在电路图中,电容的的大小是10uF,电阻的大小是10k。

所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。

也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。

这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。

所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。

在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。

所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。

按键按下的时候为什么会复位?

在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。

当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。

随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。

根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。

单片机系统自动复位。

总结:

1、复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。

2、按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。

三、Max232串口电路

MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路,使用+5V单电源供电。

内部结构基本可分三个部分:

第一部分是电荷泵电路。

由1、2、3、4、5、6脚构成。

功能是产生+12V和-12V两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14脚构成两个数据通道。

其中13脚(R0IN)、12脚(R0OUT)、11脚(T0IN)、14脚(T0OUT)为第一数据通道。

8脚(R1IN)、9脚(R1OUT)、10脚(T1IN)、7脚(T1OUT)为第二数据通道。

TTL/CMOS数据从T0IN、T1IN输入转换成RS-232数据从T0OUT、T1OUT送到电脑DP9插头;

DP9插头的RS-232数据从R0IN、R1IN输入转换成TTL/CMOS数据后从R0OUT、R1OUT输出。

第三部分是供电。

15脚GND、16脚VCC(+5V)。

因为单片机输入、输出电平为TTL电平,而PC机配置的是RS-232C标准接口,二者的电气规范不同,所以要加电平转换电路。

给出了采用MAX-232芯片的PC机和单片机串行通信接口电路,与PC机相连采用9芯标准插座。

四、步进电机驱动模块电路

电路如下图所示:

五、系统的软件设计

要求:

可通过操作按键对步进电机的正转、反转、和启动、停止进行控制。

程序如下:

#include<

STC12C5A.H>

intrins.h>

//要用到_nop_();

函数

math.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharkey;

intn;

staticuchari;

/***************************************************************************/

/***********单片机引脚定义************/

/*DefineADCoperationconstforADC_CONTR*/

#defineADC_POWER0x80//ADCpowercontrolbit

#defineADC_FLAG0x10//ADCcompleteflag

#defineADC_START0x08//ADCstartcontrolbit

#defineADC_SPEEDLL0x00//540clocks

#defineADC_SPEEDL0x20//360clocks

#defineADC_SPEEDH0x40//180clocks

#defineADC_SPEEDHH0x60//90clocks

/*************************************************************/

/*********************硬件部分********************************/

//按键控制

sbitk1=P1^3;

sbitk2=P1^2;

sbitk3=P1^1;

sbitk4=P1^0;

//电机驱动

sbitF1=P2^4;

sbitF2=P2^5;

sbitF3=P2^6;

sbitF4=P2^7;

//12864

sbitCS=P2^3;

//片选高电平有效单片LCD使用时可固定高电平

sbitSID=P2^6;

//数据

sbitSCLK=P2^5;

//时钟

sbitPSB=P2^4;

//串并口选择/******************************************************************************/

/**********数据部分***********/

/******************************************************************************/

voidWrite_char(bitstart,ucharddata);

voidSend_byte(ucharbbyte);

voidDelaynms(uintdi);

voidLcd_init(void);

voidLCD_Write_string(ucharX,ucharY,uchar*s);

voidLCD_set_xy(ucharx,uchary);

voiddisplay();

ucharcodewaves[]={"

电机转动方式:

"

};

ucharcodeznwk1[]={"

启动"

ucharcodeznwk2[]={"

停止"

ucharcodeznwk3[]={"

正转"

ucharcodeznwk4[]={"

反转"

//电机

voidstop();

voidmotor_ffw(ucharf);

/**************************************************************************/

/************各延时程序**************/

voiddelay()//电机延时

{

for(n=0;

n<

550;

n++)

{_nop_();

_nop_();

}

}

voiddelay10ms()//按键延时,去抖动

{

ucharms,km;

for(ms=10;

ms>

0;

ms--)

for(km=150;

km>

km--);

voidDelaynms(uintdi)//12864延时

uintda,db;

for(da=0;

da<

di;

da++)

for(db=0;

db<

10;

db++);

voidInt_232(void)//232初始化

TMOD=0x20;

SCON=0x50;

TH1=0xFD;

TL1=0xFD;

TR1=1;

TI=0;

/************************************************************************/

/**************12864显示部分*****************/

/************************************************************************/

voidLcd_init(void)//初始化LCD

Delaynms(10);

//启动等待,等LCM讲入工作状态

CS=1;

Write_char(0,0x30);

//8位介面,基本指令集

Write_char(0,0x0c);

//显示打开,光标关,反白关

Write_char(0,0x01);

//清屏,将DDRAM的地址计数器归零

voidWrite_char(bitstart,ucharddata)//写指令或数据

ucharstart_data,Hdata,Ldata;

if(start==0)

start_data=0xf8;

//写指令

else

start_data=0xfa;

//写数据

Hdata=ddata&

0xf0;

//取高四位

Ldata=(ddata<

<

4)&

//取低四位

Send_byte(start_data);

//发送起始信号

Delaynms(5);

//延时是必须的

Send_byte(Hdata);

//发送高四位

Delaynms

(1);

Send_byte(Ldata);

//发送低四位

voidSend_byte(ucharbbyte)//发送一个字节

ucharled;

for(led=0;

led<

8;

led++)

{

SID=bbyte&

0x80;

//取出最高位

SCLK=1;

SCLK=0;

bbyte<

=1;

//左移

}

voidClr_Scr(void)//清屏函数

Write_char(0,0x01);

voidLCD_set_xy(ucharx,uchary)

{//设置LCD显示的起始位置,X为行,Y为列

ucharaddress;

switch(x)

{

case0:

address=0x80+y;

break;

case1:

case2:

address=0x90+y;

case3:

address=0x88+y;

case4:

address=0x98+y;

default:

address=0x80+y;

}

Write_char(0,address);

voidLCD_Write_string(ucharX,ucharY,uchar*s)

{//中英文字符串显示函数

LCD_set_xy(X,Y);

while(*s)

Write_char(1,*s);

s++;

/*voidLCD_Write_number(unsignedchars)//数字显示函数

Write_char(1,num[s]);

Delaynms

(1);

/*voidLcd_Mark2(void)

Clr_Scr();

//清屏

LCD_Write_string(1,0,znwk);

//

LCD_Write_string(2,0,waves);

*/

/********************************************************/

voiddisplay()

{//uintk;

LCD_Write_string(2,0,waves);

if(k1==0)

LCD_Write_string(3,4,znwk1);

elseif(k2==0)

LCD_Write_string(3,4,znwk2);

elseif(k3==0)

LCD_Write_string(3,4,znwk3);

elseif(k4==0)

LCD_Write_string(3,4,znwk4);

}

}//******************************************************************

//**********************电机转动*********************************

//***********************************************************************

voidmotor_ffw(ucharf)//f方向,f=0右转,

{if(f==0)

{

i++;

if(i==9)

i=1;

elseif(f==1)

i--;

if(i==0)

i=8;

}

switch(i)//一步转0.9度

/*case1:

F1=0;

F2=1;

F3=0;

F4=1;

case2:

F3=1;

F4=0;

case3:

F1=1;

F2=0;

case4:

case1:

case5:

case6:

case7:

case8:

default:

}delay();

voidmoving(ucharf,uintk)//g=0右转k=次数

while(k>

0)

{

motor_ffw(f);

k--;

voidstop()//停止

voidgoing()//启动后正反转

if(key==1)

moving(0,1);

elseif(key==2)

stop();

elseif(key==3)

elseif(key==4)

moving(1,1);

else;

voidscan()//按键控制

if(k1==0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1