当前位置:文档之家› 基于STC单片机步进电机驱动器的设计及C语言程序

基于STC单片机步进电机驱动器的设计及C语言程序

基于STC单片机步进电机驱动器的设计及C语言程序
基于STC单片机步进电机驱动器的设计及C语言程序

基于单片机系统的步进电机驱动

摘要

本文介绍了基于80C52单片机的步进电机控制系统的设计。分别概括的介绍了单片机和步进电机以及步进电机的各种驱动方案;对一款四相步进电机以及80C52单片机的功能参数和一种驱动方式的特点,以及选择其原因进行了必要的说明;对基于80C52单片机的步进电机控制系统的原理进行了介绍;根据80C52单片机和步进电机的原理以及特点和参数选择了其他元器件,结合驱动芯片ULN2003A,建立了相应的电路图;进行了必要的电路分析说明,并将这个电路图制作成型,使其工作,实现加速减速等功能。

关键词:步进电机;AT89C52单片机;ULN2003A驱动。

目录

第1章前言----------------------------------------------------------------------------1 1.1 课题的背景------------------------------------------------------------------------------------------1 1.2 发展概况---------------------------------------------------------------------------------------------1 1.3 课题主要内容---------------------------------------------------------------------------------------1 第2章步进电机的基本原理、分类和选择----------------------------------------1 2.1 步进电机的基本参数------------------------------------------------------------------------------2 2.2 步进电机的特点------------------------------------------------------------------------------------2 2.3 步进电机分类---------------------------------------------------------------------------------------2 2.4 四相混合式步进电机的工作原理及工作方式------------------------------------------------2 2.5 步进电机具体型号的选择------------------------------------------------------------------------3 第3章步进电机驱动系统及驱动接口选择----------------------------------------3 3.1 单电压功率驱动接口------------------------------------------------------------------------------4 3.2 双电压功率驱动接口------------------------------------------------------------------------------4 3.3 高低压功率驱动接口------------------------------------------------------------------------------4 3.4 斩波恒流功率驱动接口---------------------------------------------------------------------------5 3.5 集成功率驱动接口及驱动芯片的选择---------------------------------------------------------6 第4章驱动系统硬件组成及具体驱动方案分析---------------------------------------6 4.1 关于80C52单片机的介绍----------------------------------------------------------------------6 4.2 驱动系统总体结构--------------------------------------------------------------------------------8 4.3 驱动系统的驱动原理------------------------------------------------------------------------------9

4.3.1 步进电机的控制信号-----------------------------------------------------------------------9

4.3.2 控制信号功率的放大-----------------------------------------------------------------------9

4.3.3 单片机控制信号的输出--------------------------------------------------------------------10 第 5 章驱动系统硬件电路及总电路-----------------------------------------------10

5.1 单片机最小系统------------------------------------------------------------------------------------10 5.2 人机交互模块---------------------------------------------------------------------------------------11 5.3 按键开关部分---------------------------------------------------------------------------------------12 5.4 驱动芯片部分---------------------------------------------------------------------------------------12 5.5 总电路图---------------------------------------------------------------------------------------------13 第6章驱动系统程序流程图----------------------------------------------------------13

第7章结论-------------------------------------------------------------------------------14

附录----------------------------------------------------------------------------------------------------------14 参考文献----------------------------------------------------------------------------------------------------19

第1章前言

1.1课题的背景

步进电机是现代数字控制技术中最早出现的执行部件,其特点是可以将数字脉冲控制信号直接转换为一定数值的机械角位移,并且能够自动产生定位转矩使转轴锁定。如果在机械结构中再配以滚珠丝杠,那步进电机的高精度转角就可以转换为高精度直线位移,这在以精度为要求的现代机械控制中是极其重要的一点。

随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个经济领域都有应用。步进电机作为一种控制用的特种电机,其优点是结构简单、运行可靠、控制方便。尤其是步距值不受电压、温度的变化的影响、误差不会长期积累的特点,给实际的应用带来了很大的方便。研究步进电机的控制方法,对提高控制精度和响应速度、节约能源等都具有重要意义。为此,本文设计了一段步进电机驱动程序,可以实现对步进电机转动速度等级的调节,并用数码管显示。

1.2 发展概况

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

目前,生产步进电机的厂家的确不少,但具有专业技术人员,能够自行开发,研制的厂家却非常少,连最基本的设备都没有。仅仅处于一种盲目的仿制阶段。这就给户在产品选型、使用中造成许多麻烦。鉴于上述情况,本文决定以四相混合式步进电机为例叙述其基本工作原理及设计简单的驱动程序。望能对广大用户在选型使用时有所帮助。

1.3 课题主要内容

本课题将分析步进电机的工作原理,并简单介绍其各种驱动方式。使用单片机以软件方式配合有关芯片和电路元件驱动步进电机,通过C语言编程方法,对步进电机的转速进行控制,使其在一定范围下运行。在Keil中编程并调试,Proteus中进行仿真,并很好地模拟出实验结果。最后,根据电路图焊接出实物。

第2章步进电机的基本原理、分类和选择步进电机是一种将电脉冲转化为角位移的执行机构,当步进电机接收到一个脉冲信号,它就按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的。同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

2.1 步进电机的基本参数

电机固有步距角:它表示控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给出了一个步距角的值,如86BYG250A型电机给出的值为0.9°/1.8°(表示半步工作时为0.9°整步工作时为1.8°)这个步距角可以称之为“电机固有步距角”它不一定是电机实际工作时的真正步距角,真正的步距角和驱动器有关。

步进电机的相数:是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。电机相数不同,其步距角也不同,一般二相电机的步距角为0.9°/1.8°、三相的为0.75°/1.5°、五相的为0.36°/0.72°。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分驱动器,则“相数”将变得没有意义,用户只需在

保持转矩:是指步进电机通电但没有转动时,定子锁住转子的力矩。它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近保持转矩。由于步进电机的输出力矩随速度的增大而不断衰减,输出功率也随速度的增大而变化,所以保持转矩就成为衡量步进电机最重要的参数之一。比如,当人们说2N.m的步进电机,在没有特殊说的情况下是指保持转矩为2N.m的步进电机。

2.2 步进电机的特点

1.一般步进电机的精度为步进角的3%-5%,且不累积。

2.步进电机的力矩会随转速的升高而下降。

3.当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。

4.步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。

步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。

2.3步进电机分类

目前常用的有三种步进电动机:

1.反应式步进电动机(VR)。反应式步进电动机结构简单,生产成本低,步距角小;但动态性能差。

2.永磁式步进电动机(PM)。永磁式步进电动机出力大,动态性能好;但步距角大。

3.混合式步进电动机(HB)。混合式步进电动机综合了反应式、永磁式步进电动机两者的优点,它的步距角小,出力大,动态性能好,是目前性能最高的步进电动机。它有时也称作永磁感应子式步进电动机。

综合步进电机的以上参数特点以及各种步进电机的优缺点,本课题选用四相混合式(感应子式)步进电机

2.4四相混合式步进电机的工作原理及工作方式

如图2-1。开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B 相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

图2-1 四相步进电机步工作进示意图

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2-2a、b、c所示:

a. 单四拍

b. 双四拍

c.八拍

图2-2 步进电机工作时序波形图

2.5步进电机具体型号的选择

考虑到实验室材料和驱动功率大小等实际条件,以及连线的方便与否。最终选择型号为28BYJ48的四相五线步进电机。该步进电机的主要参数为:

1.额定电压:5VDC

2.直流电阻:200?±7%(25°)

3.减速比:1/64

4.步距角:5.625°/64

5.驱动方式:4相8拍

6.牵入转矩:≧350mN.m(120Hz)

7.打滑扭力:800-1300mN.m

8.温升:<50K(5VDC 工作频率:120Hz)

9.噪音:小于35dB(120Hz)

10.绝对耐压:600V AC/1s

第3章步进电机驱动系统及驱动接口选择步进电动机不能直接接到工频交流或直流电源上工作,而必须使用专用的步进电动机驱动器,如图3-1所示,它由脉冲发生控制单元、功率驱动单元、保护单元等组成。图中点划线所包围的二个单元可以用微机控制来实现。驱动单元与步进电动机直接耦合,也可理解成步进电动机微机控制器的功率接口,这里对步进电机各种驱动接口进行简单的介绍。

图3-1 步进电动机驱动控制系统

3.1单电压功率驱动接口

在电机绕组回路中串有电阻Rs,使电机回路时间常数减小,高频时电机能产生较大的电磁转矩,还能缓解电机的低频共振现象,但它引起附加的损耗。一般情况下,简单单电压驱动线路中,Rs是不可缺少的。Rs对步进电动机单步响应的改善如图3-2。

图3-2 单电压功率驱动接口及单步响应曲线

3.2双电压功率驱动接口

双电压驱动的功率接口如图3-3所示。双电压驱动的基本思路是在较低(低频段)用较低的电压UL驱动,而在高速(高频段)时用较高的电压UH驱动。这种功率接口需要两个控制信号,Uh为高压有效控制信号,U为脉冲调宽驱动控制信号。图中,功率管TH和二极管DL构成电源转换电路。当Uh低电平,TH关断,DL正偏置,低电压UL对绕组供电。反之Uh高电平,TH导通,DL反偏,高电压UH对绕组供电。这种电路可使电机在高频段也有较大出力,而静止锁定时功耗减小。

图3-3 双电压功率驱动接口

3.3高低压功率驱动接口

图3-4 高低压功率驱动接口

高低压功率驱动接口如图3-4所示。高低压驱动的设计思想是,不论电机工作频率如何,均利用高电压UH供电来提高导通相绕组的电流前沿,而在前沿过后,用低电压UL来维持绕组的电流。这一作用同样改善了驱动器的高频性能,而且不必再串联电阻Rs,消除了附加损耗。高低压驱动功率接口也有两个输入控制信号Uh和Ul,它们应保持同步,且前沿在同一时刻跳变,如图3-4所示。图中,高压管VTH的导通时间tl不能太大,也不能太小,太大时,电机电流过载;太小时,动态性能改善不明显。一般可取1-3ms。

3.4斩波恒流功率驱动接口

恒流驱动的设计思想是,设法使导通相绕组的电流不论在锁定、低频、高频工作时均保持固定数值。使电机具有恒转矩输出特性。这是目前使用较多、效果较好的一种功率接口。图3-5是斩波恒流功率接口原理图。图中R是一个用于电流采样的小阻值电阻,称为采样电阻。当电流不大时,VT1和VT2同时受控于走步脉冲,当电流超过恒流给定的数值,VT2被封锁,电源U被切除。由于电机绕组具有较大电感,此时靠二极管VD续流,维持绕组电流,电机靠消耗电感中的磁场能量产生出力。此时电流将按指数曲线衰减,同样电流采样值将减小。当电流小于恒流给定的数值,VT2导通,电源再次接通。如此反复,电机绕组电流就稳定在由给定电平所决定的数值上,形成小小的锯齿波,如图3-5所示。

图3-5 斩波恒流功率驱动接口

斩波恒流功率驱动接口也有两个输入控制信号,其中u1是数字脉冲,u2是模拟信号。这种功率接口的特点是:高频响应大大提高,接近恒转矩输出特性,共振现象消除,但线路较复杂。目前已有相应的集成功率模块可供采用。

3.5集成功率驱动接口及驱动芯片的选择

目前已有多种用于小功率步进电动机的集成功率驱动接口电路可供选用。例如集成H桥式驱动器L298芯片,集成达林顿管ULN2003A极电极开路驱动芯片等。由于ULN2003A具有电流增益高、工作电压高、温度范围宽、带负载能力强,而且集成有续流二极管等特点,以及其对单片机的专用性。本课题选择ULN2003A驱动芯片

图3-6 ULN2003逻辑图

图3-7 ULN2003内部电路图

由图3-6、图3-7可知,ULN2003A其本质是一个基于三极管的非门电路芯片。在驱动过程中,ULN2003起到将控制信号功率放大和信号反相的作用。进而稳定地将步进电机的控制信号平稳有效地送给步进电机,确保步进电机的正常运转。

第4章驱动系统硬件组成及具体驱动方案分析

4.1 关于80C52单片机的介绍

单片机以其体积小、功能齐全、价格低廉、可靠性高等优点,在各个领域都获得了广泛的应用。即使非电子计算机专业人员,通过学习一些专业基础知识以后也能依靠自己的技术力量,来开发所希望的单片机应用系统。故在本次设计中采用了其中的低功耗型80C52单片机。

性Flash程序存储器,全部支持12时钟和6时钟操作,P89C51X2和P89C52X2/54X2/58X2 分别包含128 字节和256 字节RAM、32 条I/O 口线、3 个16 位定时/计数器、6 输入4 优先级嵌套中断结构、1 个串行I/O 口、可用于多机通信I/O 扩展或全双工UART以及片内振荡器和时钟电路。可实现两个由软件选择的节电模式—空闲模式和掉电模式,空闲模式冻结CPU,但RAM定时器、串口和中断系统仍然工作;掉电模式保存RAM的内容,但是冻结振

荡器,导致所有其它的片内功能停止工作。

其主要结构组成如下:

1.中央处理器(CPU)

2.内部数据存储器(内部RAM)

3.内部程序存储器(内部ROM)

4.定时器/计数器

5.并行I/O口

6.串行口

7.时钟电路

8.中断系统

9.外接晶体引脚

图4-1 80C52单片机管脚图

图4-2 80C52单片机工作系统图

P0、P1、P2、P3口的电平与CMOS和TTL电平兼容。

P0口的每一位口线可以驱动8个LSTTL负载。在作为通用I/O口时,由于输出驱动电是开漏方式,由集电极开路(OC门)电路或漏极开路电路驱动时需外接上拉电阻;当作为地址/数据总线使用时,口线输出不是开漏的,无须外接上拉电阻。

P1、P2、P3口的每一位能驱动4个LSTTL负载。它们的输出驱动电路设有内部上拉电阻,所以可以方便地由集电极开路(OC门)电路或漏极开路电路所驱动,而无须外接上拉电阻。

当CPU不对P3口进行字节或位寻址时,内部硬件自动将口锁存器的Q端置1。这时,P3口作为第二功能使用。

P3.0 :RXD(串行口输入);

P3.1 :TXD(串行口输出);

P3.2 :外部中断0输入;

P3.3 :外部中断1输入;

P3.4 :T0(定时器0的外部输入);

P3.5 :T1(定时器1的外部输出);

P3.6 :(片外数据存储器“写”选通控制输出);

P3.7 :(片外数据存储器“读”选通控制输出)。

EA/VPP:访问程序存储器控制信号,当其为低电平时,对ROM的读操作限定在外部的程序存储器,当其为高电平时,对ROM的读操作是从内部存储器开始的,并可延至外部程序存储器。

ALE/PROG:编程脉冲

PSEN:外部程序存储器读选通信号,在读外部ROM时PSEN是低电平有效,以实现对ROM 的读操作。

RST/VPD:复位信号,当输入信号延续2个周期以上的高电平有效,用以完成单片机复位初始化操作。

XTAL : 时钟晶振输入端。

4.2驱动系统总体结构

图4-3 驱动系统硬件结构

由图4-3可知,本系统通过计算机设定步进电机的运行速度,将这些参数和控制程序通过数据串口烧录到单片机中。按钮和单片机的控制信号通过驱动电路,输入至步进电机,控制步进电机的速度。电源和变压整流电路为单片机和驱动芯片的正常工作提供安全稳定的直流高电平。

4.3驱动系统的驱动原理

为了方便阐述,本节按照步进电机输入信号要求,控制信号功率的放大,单片机控制信号的输出和编程的顺序分析其工作过程。

4.3.1步进电机的控制信号

图4-4 28BYJ48型步进电机接线指示图

表4-1步进电机输入信号分布表

连线序号导线颜色分配顺序

1 2 3 4

5 红+ + + +

4 橙+ + ——

3 黄+ ——+

2 粉——+ +

1 蓝—+ + —

如图4-4所示,28BYJ48型步进电机接内部共有四相线圈,其中Vcc端共接在一起,为红线。四相线圈的控制信号输入端按顺序依次为蓝、粉、黄、橙。为方便编程与描述,本文采用单片机的双四拍运行时序,则其通电线圈按照时序依次为:蓝粉、粉黄、黄橙、橙蓝。其输入信号分布如表4-1所示。以此时序,按照一定的频率,步进电机就可稳定地转动。

4.3.2控制信号功率的放大

单片机不能直接驱动步进电机,这是由于单片机I/O接口输出功率很小,输出信号不稳定。因此就必须在单片机I/O接口下方接功率驱动单元。按照前文所述,本文选择具有信号放大,信号反相功能的ULN2003A驱动芯片。

图4-5 ULN2003电路图(含负载)

由图4-5所示,ULN2003A本质为达林顿管,其中Q1,Q2,R2,R3本质为以放大倍15数被加大的三极管。因此,当输入信号为高电平时,三极管导通,这时负载左端,即芯片的信号输出端为低电平,因此ULN2003A为反相输出。

此时负载中有电流产生。在本文中,负载即为步进电机的某一相线圈,所以当输入信号为高电平时,与之相连的步进电机线圈中有电流产生;当输入信号为低平时,负载左端即信号输出端为高电平,负载中无电流产生,即与之相连的步进电机线圈不工作。

又因为达林顿管放大倍数为两个三极管放大倍数之积,达到比较可观的功率放大作用。综上,将单片机四个I/O接口连接至ULN2003A输入接口,就将控制步进电机的信号放大反相。使得步进电机正常工作。

4.3.3单片机控制信号的输出

考虑到步进电机正常工作所需要的时序分布以及ULN2003A的反相所用,单片机的输出信号以及相应的输出端口如表4-2所示。为了实际电路中连线方便,信号输出端口为P1.0,P1.1,P1.2,P1.3口。

表4-2单片机输出信号分布表

输入接口对应导

线颜色

分配顺序

一二三四

P1.3 橙0 0 1 1

P1.2 黄0 1 1 0

P1.1 粉 1 1 0 0

P1.0 蓝 1 0 1 1

对应16进

制数

0xF3 0xF6 0xFc 0xF9

第五章驱动系统硬件电路及总电路5.1 单片机最小系统

包括复位电路、时钟电路、电源部分、烧录口四个单元,电源部分与烧录口省略,如图:

5.2人机交互模块

采用8段共阴数码管,P0口输出段码、位码,P2.2和P2.3分别为段锁存和位锁存。如图:

5.3 按键开关部分

其中上面的开关代表转速等级增加一级,下面的开关代表速度等级降一级,如图:

5.4 驱动芯片部分

输入端分别连接P1.0,P1.1,P1.2,P1.3管脚。输出分别连接步进电机蓝,粉,黄,橙导线。由于负载过大,此处必须加上个阻值为10K的上拉电阻。如图:

5.5 总电路图

第6章 驱动系统程序流程图

开始

电机转动

连接P3.2的按键是否按下

连接P3.3的按键是否按下

速度等级加1

速度等级减1

上电

Y

N

Y

断电

第7章结论

数字电子技术已取得很大成就,数字电子技术应用越来越广泛。在动力方面,由于传统电机为模拟电子范畴,并不能直接与以计算机为代表的数字电子设备直接配合使用。需A\D,D\A转化装置,加大了控制成本和技术难度。但是步进电机作为一种数字动力元件的出现,则大大的改善了此情况。由于步进电机可以直接被计算机控制,使其具有可以将数字脉冲控制信号直接转换为一定数值的机械角位移,并且能够自动产生定位转矩使转轴锁定的性能特点,大大提高了电机的控制精度。而单片机作为一种简单可靠,且低功耗,性能稳定的计算机。这就使得单片机驱动步进电机这一应用收到更广泛的关注,本文在此选择较为简单的单片机和步进电机及相应的芯片,组成简单的步进电机驱动系统。做简单的论述,主要工作如下:

1.了解步进电机参数,特点。研究其工作原理,以及使用中的具体注意事项。

2.了解单片机的工作原理,掌握其基于C语言的编程方法,以及最小系统的组成。

3.搜集步进电机的驱动方案,对驱动方案进行比较,选取合适的驱动方式。

4.按照选取的驱动方式,选取相应的元器件,画出电路图,在Keil中编程并用Proteus 进行仿真,很好地模拟出实际结果。根据电路图焊接出相应的实际电路,排除故障,完成了相应的功能。

由于小组成员能力有限,而且受到实验设备的限制,本设计还存在着电路较为简单,缺少独立的供电电源等问题和不足。下一步需要在电路上加独立供电模块以及电机暂停按钮以及转向的控制和速度精确的液晶显示,将系统电路改进。并且加上一定的保护外壳,使其更加人性化,方便使用。

附录

/*--------------------------------------------------------------------------------------

名称:步进电机转速等级的控制

编写:1013105班小组

日期:2013.10

内容:本程序用于测试4相步进电机常规驱动

使用1-2相励磁

1-2相激励功率增倍,步进角度减半,抖动减少

顺序如下a-ab-b-bc-c-cd-d-da 又称4相8拍

数码管显示01-20速度等级,数字越大,速度越快

使用外部中断既可以调节速度增大又可以减小

-------------------------------------------------------------------------------------------*/

#include

#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2;//定义锁存使能端口段锁存

sbit LATCH2=P2^3;// 位锁存

unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

sbit A1=P1^0; //定义步进电机连接端口

sbit B1=P1^1;

sbit C1=P1^2;

sbit D1=P1^3;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电

#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电

#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电

#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;

/*------------------------------------------------------------------------------------

函数声明

------------------------------------------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num);

void Init_Timer0(void);

/*----------------------------------------------------------------------------------- uS延时函数,含有输入参数unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时使用汇编,大致延时

长度如下T=tx2+5 uS

---------------------------------------------------------------------------------*/ void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------------------------------------

mS延时函数,含有输入参数unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时使用汇编

---------------------------------------------------------------------------------*/ void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

/*------------------------------------------------------------------------------

主函数

----------------------------------------------------------------------------------*/

main()

{

unsigned int i=512;//旋转一周时间

Init_Timer0(); //调用定时器初始化函数

EA=1; //全局中断打开

EX0=1; //允许外部中断0中断

IT0=1; //设置外部中断0为边沿触发

EX1=1; //允许外部中断1中断

IT1=1; //设置外部中断1为边沿触发

Speed=1;

TempData[0]=DuanMa[Speed/10];//分解显示信息,如要显示58,

TempData[1]=DuanMa[Speed%10];//则58/10=5 58%10=8

Coil_OFF

while(i--) //正向

{ Coil_A1

DelayMs(Speed);

Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,

//数字越小,转速越大,力矩越小

Coil_B1

DelayMs(Speed);

Coil_BC1

DelayMs(Speed);

Coil_C1

DelayMs(Speed);

Coil_CD1

DelayMs(Speed);

Coil_D1

DelayMs(Speed);

Coil_DA1

DelayMs(Speed);

}

}

/*---------------------------------------------------------------------------------

外部中断0程序--速度等级增加

-----------------------------------------------------------------------------------*/

void ISR_INT0(void) interrupt 0

if(!INT0)//如果检测到低电平,说明按键按下触发中断

{

DelayMs(10);//延时去抖,一般10-20ms

if(!INT0)//再次确认按键是否按下,没有按下则退出

{ while(!INT1);//等待按键释放

{

Speed++;

if(Speed==21)

Speed=20;

TempData[0]=DuanMa[Speed/10];//分解显示信息,如要显示58

TempData[1]=DuanMa[Speed%10];//则58/10=5 58%10=8

}

}

}

}

/*--------------------------------------------------------------------------------------

外部中断1程序--速度等级减小

-------------------------------------------------------------------------------------------*/

void ISR_INT1(void) interrupt 2

{

if(!INT1)//如果检测到低电平,说明按键按下

{

DelayMs(10);//延时去抖,一般10-20ms

if(!INT1)

{ while(!INT1);//等待按键释放

{

Speed--;

if(Speed==20)

Speed=19;

if(Speed==0)

Speed=1;

TempData[0]=DuanMa[Speed/10];//分解显示信息,如要显示58,

TempData[1]=DuanMa[Speed%10];//则58/10=5 58%10=8

}

}

}

}

/*------------------------------------------------------------------------------------------

显示函数,用于动态扫描数码管

输入参数FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值输入2

-------------------------------------------------------------------------------------------------*/

static unsigned char i=0;

DataPort=0; //清空数据,防止有交替重影

LATCH1=1; //段锁存

LATCH1=0;

DataPort=WeiMa[i+FirstBit]; //取位码

LATCH2=1; //位锁存

LATCH2=0;

DataPort=TempData[i]; //取显示数据,段码

LATCH1=1; //段锁存

LATCH1=0;

i++;

if(i==Num)

i=0;

}

/*-----------------------------------------------------------------------------------------

定时器初始化子程序

-----------------------------------------------------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值

//TL0=0x00;

EA=1; //总中断打开

ET0=1; //定时器中断打开

TR0=1; //定时器开关打开

PT0=1; //优先级打开

}

/*---------------------------------------------------------------------------------

定时器中断子程序

---------------------------------------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

TH0=(65536-1000)/256; //重新赋值1ms

TL0=(65536-1000)%256;

Display(1,4);

}

51单片机控制的步进电机C语言程序

我上周刚做的这个实验成功拉,给你参考一下吧这可是我当时辛辛苦苦编出来的啊,不过我用的是L298驱动的和ULN2003一样,你把它换成2003就行拉 #include unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf 9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00}; unsigned char temp,temp_old; unsigned char key; unsigned char i,j,k,m,s; void delay(int i) { for(m=i;m>0;m--) for(j=250;j>0;j--) for(k=10;k>0;k--); } void saomiao() { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--)

for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=4; break; } temp=P3;

temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp)

步进电机正反转控制C语言程序 只为初学者

只为初学者的步进电机正反控制程序 #include<> #define uchar unsigned char #define uint unsigned int #define MotorData P2 //步进电机控制接口定义 sbit zheng=P3^0; sbit fan=P3^1; sbit stop=P3^2; uchar phasecw[8] ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转 uchar phaseccw[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//反转 //ms延时函数 void delay(uint t) { uint k; while(t--) { for(k=0; k<125; k++); } } void Delay_xms(uint x) { uint i,j; for(i=0;i

void Motor_work(uint t) { uchar i,j; switch(t) { case 0: while(1) {if(stop==0) break; for(i=0;i<8;i++) {MotorData=phasecw[i]; delay(50);//转速调节 } } break; case 1: while(1) {if(stop==0) break; for(j=0;j<8;j++) {MotorData=phaseccw[j]; delay(50);//转速调节 } } break; } } //停止转动 void Motor_test(void) { if(zheng==0) { Delay_xms(10); if(zheng==0) Motor_work(0); } if(fan==0) { Delay_xms(10); if(fan==0) Motor_work(1); } } //主函数 void main(void) {

汇编语言程序设计教学大纲

《汇编语言程序设计》课程教学大纲 二、课程简介 汇编语言是计算机能够提供给用户使用的最快最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言,因而,对程序的空间和时间要求很高的场合及需要直接控制硬件的应用场合,汇编语言的应用是必不可少三、课程目标 汇编语言课程是计算机专业的一门专业选修课。通过本课程的学习,应使学 生系统地了解计算机组成原理与内部的运行机理,掌握汇编语言程序设计及相关 知识,为学习本专业后继课程和进行与硬件有关的技术工作打下良好基础。通过 上机实验,使学生受到软硬件实验的初步训练,并培养学生分析问题和解决问题 的能力。 四、教学内容及要求 第一章基础知识 1.教学内容 (1) 为什么要用汇编语言编写程序 (2) 进位计数制与不同基数的数之间的转换 (3) 二进制数和十六进制数运算 (4) 计算机中数和字符的表示 (5) 几种基本的逻辑运算 2.基本要求 了解机器指令、代码指令、机器语言、汇编指令、汇编语言、汇编语言源程 序、汇编程序、汇编等概念;掌握进位计数制与不同基数的数之间的转换及

运算;计算机中数和字符的表示;“与”、“或”、“非”、“异或”等几种基本的逻辑运算; 第二章80X86计算机组织 1.教学内容 计算机系统概述、存储器、中央处理机和外部设备。 2.基本要求 理解计算机的硬件和软件系统及其关系。掌握计算机的基本结构及总线;存储器的内容、地址及存储器的分段;中央处理机的组成、80X86系列CPU工作寄存器构成和功能,特别是段寄存器和标志寄存器;外设接口、端口和8086/8088的端口地址范围和访问方法。 第三章80X86的指令系统 1.教学内容(重点内容) IBM PC机的寻址方式、IBM PC机的指令系统。 2.基本要求 熟练掌握IBM PC机寻址方式及物理地址的计算;数据传送、算术、逻辑、串处理、控制转移和处理机控制指令六组中的所有指令的格式、操作、及影响的标志位。了解机器语言的指令组成; 第四章汇编语言程序格式 1.教学内容 汇编程序功能、伪操作、汇编语言程序格式、汇编语言程序的上机过程。 2.基本要求 掌握DEBUG程序和命令及能用DEBUG 程序调试和运行简单小程序;汇编语言上机步骤、汇编程序的功能;数据定义及存储器分配、表达式赋值“EQU”和“=”、段定义、程序开始和结束、对准、基数控制等六类伪操作;汇编语言程序格式中的名字、操作、操作数和注释等项。 第五章循环与分支程序设计 1.教学内容 程序设计的一般步骤和基本结构、循环程序设计和分支程序设计 2.基本要求 掌握汇编语言程序的编制步骤和结构化程序设计的三种基本结构;循环的设计方法和多层循环的设计;分支程序的设计方法,并能编制相应的程序。第六章子程序结构 1.教学内容 子程序的设计方法、嵌套与递归子程序、子程序举例和DOS系统功能调用

51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

最新51单片机控制的步进电机C语言程序汇总

51单片机控制的步进电机C语言程序

51单片机控制的步进电机C语言程序 用的是L298驱动的和ULN2003一样,你把它换成2003就行拉 #include unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4, 0xf6,0xf2,0xf3,0x00}; unsigned char temp,temp_old; unsigned char key; unsigned char i,j,k,m,s; void delay(int i) { for(m=i;m>0;m--) for(j=250;j>0;j--) for(k=10;k>0;k--); } void saomiao() { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b:

key=3; break; case 0x07: key=4; break; } temp=P3; temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3;

步进电机加减速程序

步进电机加减速程序 2009-7-24 14:52 提问者:568826036|浏览次数:1251次 要求C语言写的程序 2009-7-29 14:43 最佳答案 main.c文件内容: #include"stm32f10x_lib.h" #include"main.h" TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; int pulse; int StepCount; int pulse1; int pulse2; int t1; int t2; int r1; int r2; void RCC_Configuration(void); void NVIC_Configuration(void); void GPIO_Configuration(void); void TIM2_Configuration(void); void f(int Vt,int a,int d,int S); #define VECT_TAB_RAM int main(void) { #ifdef DEBUG debug();/*[初始化外围设备指针]*/ #endif RCC_Configuration(); //初始化时钟与复位 NVIC_Configuration();//初始化中断嵌套 TIM2_Configuration();//初始化定时器 GPIO_Configuration(); GPIO_WriteBit(GPIOD, GPIO_Pin_7, (BitAction)(0));

《汇编语言程序设计》考核方式

考核方式与要求 期末总成绩构成:期末开卷考试60% + 平时作业10% + 实验和实验报告30%。 1、试卷考核方式与要求 “汇编语言程序设计”的课程要求是使学生具有一定的程序设计能力。虽然课程是通过80x86微处理机来开展教学的,但学习的重点不仅仅是学会80x86指令的语法和规范,更重要的是通过多读程序、多练习编写程序来掌握程序设计的基本方法和技术,要求学生在工作中遇到其他机型,都应该能利用所掌握的方法和技术顺利解决实际问题。因此,我们在教学过程的各个环节,特别是具有指挥棒作用的考核环节中,着重体现了“能力培养是首位”的指导思想。 为此,汇编课一直实行多元化考核方式,在考核评分上,平时练习和上机实验占40%,期末考试占60%。期末考试实行开卷考试,这样学生平时学习的关注点就会放在分析问题和编程实现的方法上,有利于学生开阔思路,发挥自身创造力。每年设计开卷考试的考题是有一定难度的,教师必须非常熟悉课程的知识点、重点和难点,以及体现这些知识和能力水平的多种题目类型。 2、实验方式与要求 实验的目标为:加强课堂上相关理论和技术学习的有效性;提高学生上机编程和调试的能力;培养学生科学实践的理念和独立分析问题、解决问题的能力。其设计思想是:实验内容兼顾基础性和综合性,实验题目由简单→复杂,程序功能由单一→综合,实验安排有基本要求题+自选题,实验题类型有验证型和自主创新设计型。 √实验课组织形式: 1.系教学实验室按课程要求负责上机环境配置及实验设备管理; 2.以班为单位组织上机实验,并将上机时间安排表发至每位同学; 3.每单元实验课安排一位助教(助博)负责实验指导和答疑; 4.学生每做完一个实验即可提交老师验收,老师将实验运行结果记录下来作为实验成 绩的依据。验收时教师要注意发现比较突出的好的实验例题(完成时间短、程序运行效率高); 5.要求提交实验报告,根据实验报告及实验运行结果的记录,评出实验成绩,实验成 绩一般占总成绩的30%。 √教师指导方法: 1.大课集体指导。每学期实验前教师安排一次实验指导课,讲解实验方法和实验要求; 2.每次实验课都安排助教(助博)进行个别或集体的实验指导和答疑; 3.对具有共性的、问题比较多的实验,主讲教师在课堂上再进行集体指导; 4.每学期对实验中出现的问题,对照实验题目进行分析、总结,以利于以后的教学。 5.对于实验中有创新点的学生,还可以请他上讲台为同学们介绍他的设计思路,引发大家展开讨论。

步进电机正反转控制C语言程序只为初学者

步进电机正反转控制C 语言程序只为初学者公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

只为初学者的步进电机正反控制程序 #include<> #define uchar unsigned char #define uint unsigned int #define MotorData P2 //步进电机控制接口定义 sbit zheng=P3^0; sbit fan=P3^1; sbit stop=P3^2; uchar phasecw[8] ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转uchar phaseccw[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//反转//ms延时函数 void delay(uint t) { uint k; while(t--) { for(k=0; k<125; k++); } } void Delay_xms(uint x) { uint i,j; for(i=0;i

void Motor_work(uint t) { uchar i,j; switch(t) { case 0: while(1) {if(stop==0) break; for(i=0;i<8;i++) {MotorData=phasecw[i]; delay(50);//转速调节 } } break; case 1: while(1) {if(stop==0) break; for(j=0;j<8;j++) {MotorData=phaseccw[j]; delay(50);//转速调节 } } break; } } //停止转动 void Motor_test(void) { if(zheng==0) { Delay_xms(10); if(zheng==0) Motor_work(0); } if(fan==0) { Delay_xms(10); if(fan==0) Motor_work(1); } } //主函数 void main(void) {

河北工业大学汇编语言知识程序设计实验

汇编语言程序设计实验 网络*** *** 实验一 顺序与分支程序设计 一 、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。 3) 熟悉在pc 机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验内容 1.实验六 从键盘上接收一位十进制数x ,计算y 值,并以十六进制形式显示出来,y 按下列公式计算。 ???????===-=+=) 6(2/) 5()4(2) 3(22 2 2X X X X X X X X X X Y 2..实验七 实验内容:从键盘上接收两个一位十六进制数x 和y ,然后再输入一个a-d 之间的一个字符,按下列要求计算。 a) 当输入字符为a ,则计算x+y ,并以十六进 制形式显示出来 b) 当输入字符为b ,则计算|x-y|,并以十六进制形式显示出来 c) 当输入字符为c ,则计算x*y ,并以十六进制形式显示出来 d) 当输入字符为d ,则计算x/y ,并以十六进制形式显示出来 三、实验代码 实验六 DATE SEGMENT X DB ?

DATE ENDS ;数据段 CODE SEGMENT ASSUME CS:CODE,DS:DATE START:MOV AX,DATE ;代码段 MOV DS,AX ;初始化ds寄存器 MOV AH,1 INT 21H ;读文件到缓冲区 CMP AL,33H ;比较指令 JB L0 ;A

步进电机控制程序(c语言+51单片机)

步进电机控制程序(c语言+51单片机) 发布:2011-05-31 | 作者: | 来源: guozhangfu | 查看:720次 | 用户关注: 摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA—C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18μm CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。关键词:Butte #include #define uint unsigned int #define uchar unsigned char #define ms *77 // f = 12 M #define LEDLen 4 #define Dj_star() {IE=0x81; pri_dj=0; } #define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; } #define Chilun_Num 8 /* 齿轮数 8 个*/ #define set_display_num() { LEDBuf[0] = tmp / 1000; LEDBuf[1] = tmp / 100 % 10; LEDBuf[2] = tmp / 10 % 10; LEDBuf[3] = tmp % 10; } uchar LEDBuf[LEDLen] = {0,0,0,0}; void read_num (); /* 读播码盘到 set_round_num * 8 */ void display (); void delay(uint delay_time) { uint i; for (i=0; i < delay_time ; i++) ; } void run (); void fx_run(); uint round_num = 0; /* 记录已转的齿轮数 , 中断1次加1*/ uint set_round_num = 0; /* 播码盘设置圈数 */ uint set_pwm_width = 0; /* 播码盘设置步进电机正向速度 */ bit one_round_flg = 0; sbit led_1000 = P0^7; //use for display sbit led_100 = P0^6; //use for display sbit led_10 = P0^5; //use for display sbit led_1 = P0^4; //use for display

汇编语言的编程步骤与调试方法

汇编语言的编程步骤与调试方法 一、汇编源程序的建立 1. 使用工具 (1)EDIT,记事本等文本编辑软件,编辑源程序,保存为.asm文 件; (2)ASM,MASM汇编程序,对源程序进行汇编,生成.obj文件- 目标文件,以及调试用.LST-列表文件和.CRF-交叉引用表; (3)Link连接程序,对使用的目标文件和库文件进行连接,生 成.exe文件,同时调试用.map-地址映像文件; 如果源程序无语法错误,上述三步将生成可运行的.exe文件, 如果运行结果无误,则完成对汇编程序的编程,如果运行后结果存 在错误,需要进行调试。 (4)Debug调试程序,对.exe文件进行调试,修改,直到程序正 确。 图3 目标程序生成步骤图2. 编程过程 (1)用文本编辑软件,编写扩展名为.asm的源文程序文件。 (2)用汇编程序对编好的源文件进行汇编。 命令行:masm [*.asm] ↙ 如果源文件中存在语法错误,则汇编程序将指出错误类型及位置,可根据这些信息重新编辑源文件,直至无语法错误,汇编后,将生成指定名称的目标文件.obj。 使用MASM50汇编程序进行汇编,输入命令行masm或者masm *.asm后,根据提示,输入文件名,在汇编没有错误的情况下,如屏幕所示:汇编程序可生成三个文件,*.obj,*.lst和*.crf。 *.obj-目标文件,用于连接生成可执行文件; *.lst-列表文件(可选),汇编语言汇编的机器语言与汇编语言对照表,可用于

调试; *.crf-交叉引用文件(可选),给出了用户定义的所有符号和对每个符号定义、引用的行号。 (3)目标文件的连接 命令行:link [*.obj] [*.obj] [*.lib] ↙ 连接程序,将多个目标程序及库文件,连接生成可执行的*.exe文件,同时可选择生成*.map文件。 *.map-地址映像文件,给出内存地址分配的有关信息。 下图所示屏幕,为Link连接两个目标文件,没有错误的情况下,生成*.exe 文件。 (4)执行程序 执行*.exe文件,观察程序运行结果,如果存在错误,需要进行调试。调试工具DEBUG是针对汇编语言程序设计的一种调试工具,熟练使用DEBUG有助于汇编语言程序员对于逻辑错误的调试。 二、汇编程序的调试

汇编语言程序设计课程教学大纲

课程教学大纲 (理论课) 课程名称:汇编语言程序设计 适用专业:计算机科学与技术 课程类别:学科基础课 制订时间: 2006年8月 数学与计算机科学学院制

汇编语言程序设计课程教学大纲 (2002年制订,2006年修订) 一、课程代码:0502121009 二、课程类别:学科基础课程 三、预修课程:计算机导论、高级语言程序设计等 四、学分: 4学分 五、学时: 86学时(其中实验部分32学时) 六、课程概述: 汇编语言是计算机能提供给用户最快也最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言,因而在对于程序的空间和时间要求很高的场合,汇编语言是必不可少的,至于对于很多需要直接控制硬件的应用场合,则更是非用汇编语言不可。 汇编语言作为计算机专业的一门必修课程是了解计算机体系结构和操作系统的最佳切入点。通过汇编语言课程的学习,对计算机理论中包括CPU体系结构、指令调度方式、存储器管理、基本输入输出接口的理解都会有一个比较本质而且直观的认识。在对汇编语言实际运用的基础上同时还能帮助对高级语言程序设计的深入体会,包括变量的组织,地址的访问,循环与分支在机器码中的处理,调用函数时参数的传递等,所以汇编语言在本专业中是一门核心的课程,通过对本课程的学习是加深对后续课程认识的基础。 七、教学目的: 通过对本课程的学习,掌握8086微处理器的寄存器组和基本寻址方式,学生要达到对程序在计算机中的基本调度有一定认识,对二进制基础理论有深入的理解,同时熟练掌握8086汇编语言的编写方式,掌握基本的系统调用,具备良好的源程序调试能力以及最基本的、实模式下的反汇编能力。

汇编语言程序设计基本方法

第七章汇编语言程序设计基本方法1.教学目的:掌握微型汇编语言程序分析和设计方法 2.教学要求: ①熟悉汇编语言程序设计的基本步骤。 ②掌握程序流程图的使用,会利用其分析问题。 ③掌握汇编语言的顺序、分支、循环程序的设计。 ④了解实模式下80386及其后继机型的汇编语言的程序设计3.教学重点: ①利用流程图分析问题。 ②顺序、分支、循环程序的设计。 4.掌握难点: ①分支程序设计 ②循环程序设计 5.教学进程安排:P137~P168 6.教学方法: 课堂讲授 7.教学内容摘要: 7.1 汇编语言程序设计概述 7.1.1 汇编语言程序设计的基本步骤 1.分析问题,抽象出描述问题的数学模型 2.确定算法 3.绘制流程图 4.分配存储空间和工作单元 5.编写程序 6.静态检查 7.上机调试运行 7.1.2 程序流程图 1. 用自然语言表示算法 2. 流程图的组成 ⑴执行框(矩形框) ⑵判别框(菱形框) ⑶开始框和终止框 ⑷指向线 ⑸连接点 3. 三种基本结构和改进的流程图 ⑴传统流程图的弊端 ⑵三种基本结构 ①顺序结构 ②选择结构 ③循环结构

图7.4 顺序结构图图7.5 选择结构图 4. 结构化程序设计的特点 ⑴只有一个入口 ⑵只有一个出口 ⑶各功能框均可执行 ⑷结构中无死循环 7.2 顺序程序设计 顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。 【例7-3】将—个字节压缩BCD码转换为两个ASCII码。 7.3 分支程序设计 7.3.1 分支程序的结构形式 分支程序结构可以有两种形式,如图7.6 (1) IF_THEN_ELSE结构 (2) CASE结构 7.3.2 分支程序设计方法 程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令使程序产生了多个不同的分支,而对于数组中的每一个数,它只能是多个分支中的某一个。 【例7-5】在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI 寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。 【例7-6】折半查找算法程序 7.3.3 跳跃表法

汇编语言程序设计

《汇编语言程序设计》课程教学大纲 学时:32 学分:2 理论学时:24 实验学时:8 面向专业:电科、电信、通信课程代码:B2700009 先开课程:C语言程序设计课程性质:必修 执笔人:王艳春审定人:陈龙猛、张金政 第一部分:理论教学部分 一、说明 1、课程的性质、地位和任务 本课程属于专业基础课,是电科、电信和通信专业学生必修的核心课程之一,是进一步学习微机原理、操作系统等课程的基础。掌握它有助于提高学生对计算机系统的设计、研究、开发和应用能力。汇编语言是一种面向机器、实践性很强的程序设计语言,必须结合一种实际的计算机来组织教学。因此,本课程选择最广泛使用的IBM PC作为具体的机型来介绍。通过课堂教学和上机实践,培养学生用汇编语言进行编程的思路、方法,养成良好的程序设计习惯,并了解底层I/O 驱动软件的编程方法,熟悉源程序汇编、链接和调试运行的步骤和方法,掌握dos、BIOS功能的调用方法及使用debug工具的调试手段,为后续课的学习打下扎实的基础。 2、课程教学和教改基本要求 课程的目的与教学基本要求:本课程主要介绍汇编语言和宏汇编的基本概念,80X86CPU的指令系统和寻址方式;介绍汇编语言程序格式、伪操作和上机全过程。通过实际例子,详细叙述顺序、分支、循环、子程序等基本程序结构以及程序设计的基本方法和技巧。学习这门课程,应达到以下几个要求: ①掌握汇编语言的基本理论知识和有关概念;掌握用汇编语言编写源程序的基本原则、方法和技巧; ②具有阅读,分析汇编语言程序的能力; ③通过上机实践,能够熟练地掌握汇编语言程序的编辑、汇编、连接、运行 过程及debug工具的调试手段。

步进电机C语言程序

C语言程序清单 #include #include #include #include #include #include void dis(void); void key(void); void clear(void); void ccscan(void); void action(void); void putbuf(void); void getkey(void); void delay0(int time); void keyscan(void); void delay1(int time); #define IOY0 0x0C400 #define MY8255_A IOY0+0x00*4 #define MY8255_B IOY0+0x01*4 #define MY8255_C IOY0+0x02*4 #define MY8255_MODE IOY0+0x03*4 char a[]={0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,0x4f,0x66,0x80}; char b[]={0x00,0x09,0x04,0x05}; char c[] = {0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; int dir=1; int mode=0; int grd=1; int cc; int n; void main()

{ int i=0; int j; outp(MY8255_MODE, 0x81); while(1) { while((i<=7)&&(i>=0)) { while(1) { keyscan(); if(mode==1) break; key(); } if(dir==1) i++; if(dir==0) i--; outp(MY8255_C, c[i]); if(grd==4) for(j=500;j>0;j--) { delay1(0x10); keyscan(); } if(grd==3) for(j=1000;j>0;j--) { delay1(0x10); keyscan(); } if(grd==2) for(j=3000;j>0;j--) { delay1(0x10); keyscan(); } if(grd==1) for(j=5000;j>0;j--)

汇编语言程序设计的实验环境及上机步骤

第1章汇编语言程序设计实验 1.1 汇编语言程序设计的实验环境及上机步骤 1.1.1 实验环境 汇编语言程序设计的实验环境如下。 1.硬件环境 微型计算机(Intel x86系列 CPU)1台。 2.软件环境 ·Windows 98/XP/Me/2000操作系统; ·任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等); ·汇编程序(MASM.EXE或TASM.EXE); ·链接程序(LINK.EXE或TLINK.EXE); ·调试程序(DEBUG.EXE或TD.EXE)。 本书建议文本编辑器使用EDIT或NOTEPAD,汇编程序使用MASM.EXE,链接程序使用LINK.EXE,调试程序使用TD.EXE。 1.1.2 上机步骤 汇编语言程序设计的实验2和实验3仅使用TD.EXE,关于TD.EXE的使用方法请参见附录B。下面介绍的上机实验步骤适用于除实验2和实验3的所有实验(包括硬件接口部分的全部实验)。 1.确定源程序的存放目录 建议源程序存放的目录名为ASM,并放在C盘或D盘的根目录下。如果没有创建过此目录,请用如下方法创建。 通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中单击右键,弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。 请把MASM5文件夹下的所有文件及TD.EXE都复制到此目录中。 2.建立ASM源程序 建立*.ASM源程序可以使用记事本文本编辑器。注意:保存时扩展名必须ASM。设建立的源文件为HELLO.ASM 3.用MASM.EXE汇编源程序产生OBJ目标文件 源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。具体操作如下: 方法一:在Windows中操作 用资源管理器打开源程序目录C:\ASM,把HELLO.ASM拖到MASM.EXE程序图标上。 方法二:在DOS命令提示符窗口中操作 选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令: I:>C:<回车> C:>CD\ASM<回车> C:\ASM>MASM HELL0.ASM<回车> 操作时的屏幕显示如图1所示。

汇编教程汇编语言编程实例

汇编语言编程实例一这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microso ft Access 97) . 注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 "SQL_NULL_HANDLE",将得到下面这行: SQL_NULL_HANDLE equ 0L 将0后面的"L"删除,象这样: SQL_NULL_HANDLE equ 0 这个程序是一个基于对话框的程序,有一个简单的菜单.当用户选择"connect"时,它将试图连接test.mdb数据库,如果连接成功,将显示由ODBC驱动程序返回的完整连接字符串.接下来,用户可选择"View All Records"命令,程序会使用listview control来显示数据库中的所有数据.用户还可以选择"Query"命令来查询特定的记录.例子程序将会显示一个小对话框提示用户输入想找的人名.当用户按下OK钮或回车键,程序将执行一个查询来查找符合条件的记录.当用户完成对数据库的操作时,可以选择"disconnect"命令与数据库断开连接. 现在看一下源程序: .386 .model flat,stdcall include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\odbc32.inc include \masm32\include\comctl32.inc include \masm32\include\user32.inc includelib \masm32\lib\odbc32.lib includelib \masm32\lib\comctl32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib IDD_MAINDLG equ 101 IDR_MAINMENU equ 102 IDC_DATALIST equ 1000 IDM_CONNECT equ 40001 IDM_DISCONNECT equ 40002 IDM_QUERY equ 40003 IDC_NAME equ 1000 IDC_OK equ 1001 IDC_CANCEL equ 1002 IDM_CUSTOMQUERY equ 40004 IDD_QUERYDLG equ 102 DlgProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

相关主题
文本预览
相关文档 最新文档