1、本系统主要由电源模块、控制模块、电机驱动模块、按键中断模块等四个模块组成。电源模块的功能是将交流220V电源经过整流转化为直流+5V电源,以供给控制、显示、驱动等模块供电。控制模块是系统的主导作用,即51单片机的最小系统,用来发送信号以控制电机及显示。电机驱动模块使用的是ULN2003芯片。ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的直流工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。按键模块则分为启动按键和中断按键,启动按键使用的是单片机普通的I/O口。用来控制系统启动。中断按键则是使用的外部中断口(P3.2,P3.3)。在
2、系统运行时则可以随时控制电机的加减速。2.系统硬件设计2.1单片机最小系统原理介绍该电路工作原理:本项目中选用了最基础的C51单片机做为其控制核心,单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统,本设计采用AT89C51单片机,最小系统一般应该包括:单片机、晶振电路、复位电路、电源电路。单片机最小系统复位电路的极性电容C3的大小直接影响单片机的复位时间,一般采用1030uF,51单片机最小系统容值越大需要的复位时间越短。51单片机最小系统晶振X1也可以采用6MHz或者12MHz,在正常工作的情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响
3、单片机的处理速度,频率越大处理速度越快。单片机最小系统起振电容C2、C3一般采用1533pF,并且电容离晶振越近越好。P0口为开漏输出,作为输出口时需加上拉电阻RP1,阻值一般为10k。设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t.设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。在每个机器周期的S5P2期间采样T0、T1引脚电平。当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一
4、个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2ms。图2-1最小系统电路图2.1.1 AT89C51的工作原理AT89C51是一个低电压,高性能CMOS8位单片机带有4K字节的可反复擦写的程序存储器(PENROM)。和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。片内含有8位中央处理器和闪烁存储单元,有较强的功能的AT89C51单片机能够被应用到控制领域中。本设计采用AT89C51,它提供
5、以下的功能标准:4K字节闪烁存储器,128字节随机存取数据存储器,32个I/O口,2个16位定时/计数器,1个5向量两级中断结构,1个串行通信口,片内震荡器和时钟电路。另外,AT89C51还可以进行0HZ的静态逻辑操作,并支持两种软件的节电模式。闲散方式停止中央处理器的工作,能够允许随机存取数据存储器、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存随机存取数据存储器中的内容,但震荡器停止工作并禁止其它所有部件的工作直到下一个复位。VCC:电源电压 GND:地P0口:P0口是一组8位漏极开路双向I/O口,即地址/数据总线复用口。作为输出口时,每一个管脚都能够驱动8个TTL电路。当“1”
6、被写入P0口时,每个管脚都能够作为高阻抗输入端。P0口还能够在访问外部数据存储器或程序存储器时,转换地址和数据总线复用,并在这时激活内部的上拉电阻。P0口在闪烁编程时,P0口接收指令,在程序校验时,输出指令,需要接电阻。P1口:P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动4个TTL电路。对端口写“1”,通过内部的电阻把端口拉到高电平,此时可作为输入口。因为内部有电阻,某个引脚被外部信号拉低时输出一个电流。闪烁编程时和程序校验时,P1口接收低8位地址。P2口:P2口是一个内部带有上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL电路。对端口写“1”,通过内部的电阻
7、把端口拉到高电平,此时,可作为输入口。因为内部有电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器时,P2口线上的内容在整个运行期间不变。闪烁编程或校验时,P2口接收高位地址和其它控制信号。P3口:P3口是一组带有内部电阻的8位双向I/O口,P3口输出缓冲故可驱动4个TTL电路。对P3口写如“1”时,它们被内部电阻拉到高电平并可作为输入端时,被外部拉低的P3口将用电阻输出电流。P3口除了作为一般的I/O口外,更重要的用途是它的第二功能,如下表2-1所示:端口引脚第二功能P3.0RXDP3.1
8、TXDP3.2INT0P3.3INT1P3.4T0P3.5T1P3.6WRP3.7RD表2-1P3口还接收一些用于闪烁存储器编程和程序校验的控制信号。RST:复位输入。当震荡器工作时,RET引脚出现两个机器周期以上的高电平将使单片机复位。ALE/ :当访问外部程序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE以时钟震荡频率的1/16输出固定的正脉冲信号,因此它可对输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲时,闪烁存储器编程时,这个引脚还用于输入编程脉冲。如果必要,可对特殊寄存器区中的8EH单元的D0位置禁止ALE
9、操作。这个位置后只有一条MOVX和MOVC指令ALE才会被应用。此外,这个引脚会微弱拉高,单片机执行外部程序时,应设置ALE无效。PSEN:程序储存允许输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器读取指令时,每个机器周期两次PSEN 有效,即输出两个脉冲。在此期间,当访问外部数据存储器时,这两次有效的PSEN 信号不出现。EA/VPP:外部访问允许。欲使中央处理器仅访问外部程序存储器,EA端必须保持低电平。需要注意的是:如果加密位LBI被编程,复位时内部会锁存EA端状态。如EA端为高电平,CPU则执行内部程序存储器中的指令。闪烁存储器编程时,该引脚加上+12V的编程允许电
10、压VPP,当然这必须是该器件是使用12V编程电压VPP。XTAL1:片内振荡器反相放大器和时钟发生线路的输入端。使用片内振荡器时,连接外部石英晶体和微调电容。XTAL2:片内振荡器反相放大器的输出端。当使用片内振荡器时,外接石英晶体和微调电容。2-2 AT89C51引脚2.1.2复位电路的工作原理单片机在启动运行时需要复位,使CPU以及其他功能部件处于一个确定的初始状态,并从这个状态开始工作,另外,在单片机工作过程中,如果出现死机时,也必须对单片机进行复位,使其重新开始工作。电路中C1(电解电容)、R2组成复位电路,它的作用是将单片机内部特殊功能寄存器和端口寄存器恢复到初始状态,从内部FLAS
11、H存储器的初始状态开始执行。如图所示,当要对晶片重置时,只要按此开关就能完成LED和开关的重置。复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。单片机的RST管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。单片机的复位方式可由手动复位方式完成。RST引脚是复位信号输入端,复位信号为高电平有效,其有效时间应持续24个振荡周期以上才能完成复位操作,若使用6MHz晶振,则需持续4S以上才能完成复位操作。在通电瞬间,由于RC的充电过程,在RST端出现一定宽度的正脉冲,只要该正脉冲保持10ms以上
12、,就能使单片机自动复位。CPU在第二个机器周期内执行内部复位操作,以后每个机器周期重复一次,直至RST端电平变低。在单片机复位期间,AlE和 信号都不产生。复位操作将对部分专用寄存器产生影响。上电瞬间由于电容C上无储能,其端电压近似为零,RST获得高电平,随着电容器C的充电,RST引脚上的高电平将逐渐下降,当RST引脚上的电压小于某一数值后,单片机就脱离复位状态,进入正常工作模式。只要高电平能保持复位所需要的时间(约两个机器周期),单片机就能实现复位。图2-3复位电路2.1.3晶振电路的工作原理 晶振分为有源晶振和无源晶振两种,其作用是在电路产生震荡电流,发出时钟信号。它是时钟电路中最重要的部
13、件,它的作用是向IC等部件提供基准频率,它就像个标尺,工作频率不稳定会造成相关设备工作频率不稳定,自然容易出现问题。一般的晶振振荡电路都是在一个反相放大器,两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,一般IC的引脚都有等效输入电容。图2-4晶振电路 2.2电机驱动电路原理介绍步进电机是一种将电脉冲转化为角位移的执行机构。解释说明:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进脚)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和
14、加速度,从而达到调速的目的。本次系统采用的是四相八拍电机,电压为DC5V-DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或者两相绕组的通电状态转变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,通常的通电方式有单(单相绕组通电)四拍(A-B-C-D-A)双(双相绕组通电)四拍(AB-BC-CD-DA-AB-.)八拍(A-AB-B-BC-C-CD-D-DA-A.)。步进电机必须加驱动才可以运转,驱动信号必须为脉冲信号,没有脉冲的时候,步进电机
15、静止,如果加入适当的脉冲信号,就会以一定的角(称为步角)转动。转动的速度和脉冲的频率成正比。本系统的28BYJ48 5V 驱动的4相5线的步进电机,而且是减速步进电机,减速比为1:64,步进角为5.625/64度。如果需要转动1圈,那么需要360/5.625*64=4096个脉冲信号。图2-5驱动电路3.系统软件设计 3.1系统流程图图3-1系统流程图3.2系统程序分析 如流程图所示,系统主要是电机控制部分,以及两个外部中断,下面将一一阐述。1.电机控制部分电机控制主要是靠的ULN2003驱动电路。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地运转。每一个脉冲信号对应步进电机的某
16、一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态改变完成一个循环时,转子转过一个齿距,而八拍(A-AB-B-BC-C-CD-D-DA-A.)。Uchar F_Rotation8=0xE2,0xE6,0Xe4,0Xec,0Xe8,0Xf8,0xf0.0xf2;/正转表格,0111,0011,1011,1001,1101,1100,1110,0110/a-ab-b-bc-c-cd-d-da 四相八拍方式void zheng() uint i,j; for(j=0;j64*8;j+) /步距角5.625/64 减速比1/64,8拍,这个循环为一圈。 for(i=
17、0;i8;i+) dianji=B_Rotationi; delay_50us(speed); 2.中断程序本文中断只要使用的两个外部中断(int0,int1),使用的是下降沿出发方式,所以,让其中的引脚接地,即可得到一个下降沿,系统就会执行中断程序,由于两个中断是独立的,所以不需要考虑优先级问题。/主程序打开中断void main() EA=1; /全局中断开 EX0=1;/外部中断0开 EX1=1; IT0=1;/ 中断程序void int0() interrupt 0 delay(500); zdup(); speed-=5;4.系统总程序#include#define uchar un
18、signed char#define uint unsigned int#define dianji P2uchar liushui=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff;uchar F_Rotation8=0xE2,0xE6,0xE4,0xEC,0xE8,0xF8,0xF0,0xF2;/正转表格, 0111,0011 1011,1001 1101,1100 ,1110,0110uchar B_Rotation8=0xF2,0xF0,0xF8,0xE8,0xEC,0xE4,0xE6,0xE2;/反转表格void delay_50us(uint
19、 t) uchar j; for(;t0;t-) for(j=19;jj-);void delay(uint z) uint x,y; for(x=z;xx-) for(y=110;yy-);void write_com(uchar com) lcdrs=0; P0=com; delay(60); /stc12型MCU,延时乘以12倍 lcden=1; lcden=0;void write_data(uchar date) lcdrs=1; P0=date;void init() write_com(0x38); write_com(0x0e); write_com(0x06); write_
20、com(0x01);void xianshi1() uint i; /for(i=0;2; init(); write_com(0x82+0x10); for(num=0;num13;num+) write_data(xs11num); delay(300);16; write_com(0x18); delay(2000); delay(5000); write_com(1); write_com(0x82+0x50); delay(8000);void xszheng() init(); write_com(0x80); write_data(xsznum); write_com(0x80+
21、0x43);9; write_data(xsz1num); delay(1000); write_data(0x00); delay(2000);void xsfan() delay(500);10; write_data(xsz2num);delay(1000); write_data(0x00);void zdup() write_com(0x82);12; write_data(zd1num);write_data(0x00);void zddown() write_data(zd2num);delay(2000);/步距角5.625/64 减速比1/64,8拍,这个循环为一圈void
22、fan() /步距角5.625/64 减速比1/64,8拍,这个循环为一圈 dianji=F_Rotationi; delay_50us(speed);void stop()dianji=0x00;void liushui1() uint m; for(m=0;mm+) delay(200); P0=liushuim; P1=liushuim; P2=liushuim; / P3=liushuim; /P1=0xff; IT1=1; speed=150;/ delay(10000);/ while(1) if(!zz) delay(20);zz) liushui1(); xianshi1();
23、 xszheng(); while(1) zheng();fz) delay(20); liushui1(); xsfan(); while(1) fan(); delay(500);zdup();void int1() interrupt 2 delay(500);zddown(); speed+=5;4调试过程与结果调试过程主要分为硬件调试以及软件调试两大部分。其中硬件调试主要是指将电路接好之后,对其是否虚焊,短路进行检查,主要依靠万用表的电阻档。看连接的焊点是否都导通,不该相连接的焊点是否电阻无穷大。因此,在焊接的时候就应多注意点,要知道,焊错了就不好再改,所以,我们大多采用插针的方式连接电路。这样做就方便插拔,即使连接错误也只要重新插下就可以。软件调试则是比较重要的部分,在系统未成型的时候,主要依靠proteus软件进行仿真。对每个模块进行分块调试。比如调试电机的时候,程序直接就是单片机控制电机执行一些简单的操作。当技术成熟之后,再在程序中加入其它控制模块。在程序调试的时候,我尽量将程序模块化,主程序直接用子函数。这样程序修改起来就比较方便。当所有子函数全部建立好了,再将所有该应用的程序放到主程序里面。在prot
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1