西南科技大学单片机原理实实验四及代码
- 格式:doc
- 大小:89.50 KB
- 文档页数:7
建筑经济管理(独立本科段)专业课程设置与学分主考学校:西南科技大学增补的主考学校:四川大学西南民族大学成都理工大学西华大学四川教育学院四川理工学院会计(独立本科段)专业课程设置与学分主考学校:西南财经大学增补的主考学校:四川大学电子科技大学西南交通大学西南民族大学成都信息工程学院西南科技大学成都理工大学四川师范大学西华师范大学内江师范学院乐山师范学院四川理工学院攀枝花学院成都学院西华大学成都理工大学工程技术学院工商企业管理(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码:Y020202增补的主考学校:四川大学电子科技大学西南民族大学西南科技大学成都理工大学四川师范大学成都信息工程学院西华师范大学西华大学内江师范学院绵阳师范学四川教育学院四川理工学院攀枝花学院成都学院宜宾学院成都理工大学工程技术学院英语(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码:Y050201说明:已取得高级英语(1)(课码09420,6学分)或高级英语(2)(课码09447,6学分)合格成绩的可免考高级英语(课码00600,12学分)课程,课程成绩、学分由考试机构直接转换。
主考学校:四川大学增补的主考学校:电子科技大学西南交通大学西南民族大学西南科技大学成都理工大学四川师范大学西华师范大学内江师范学院攀枝花学院四川外语学院成都学院成都学院宜宾学院环境艺术设计(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码:Y050412(实践)(02366,1学分);建筑装饰材料(09416,4学分)调整为室内装饰材料(04489,5学分);素描Ⅲ、Ⅳ(09415,4学分)调整为素描(四)(00698,8学分);色彩Ⅲ、Ⅳ(09414,4学分)调整为色彩(2)(07125,3学分)。
主考学校:西南交通大学增补的主考学校:四川大学成都理工大学四川师范大学绵阳师范学院成都信息工程学院四川教育学院电子科技大学机械制造与自动化(独立本科段)专业课程设置与学分增补的主考学校:四川大学电子科技大学成都学院成都理工大学工程技术学院成都理工大学计算机及应用(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码:Y080702主考学校:电子科技大学增补主考学校:四川大学成都理工大学四川师范大学成都信息工程学院西华师范大学内江师范学院四川教育学院四川理工学院四川文理学院电子工程(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码:Y080705生;第二类为理学、工学类非电子信息、电工类专业专科毕业生,应按规定加考“模拟电路与数字电路”和PASCAL语言两门课程。
单片机实验代码集合(by fangyuan)1.多字节累加程序:ORG 0000HLJMP MAINORG 0030H;将加数和被加数送到指定地址MAIN: MOV 20H,#45HMOV 21H,#74HMOV 30H,#67HMOV 31H,#28H;低位相加MOV A,21HADD A,31HDA AMOV 42H,A;高位相加MOV A,20HADDC A,30HDA AMOV 41H,ACLR AADDC A,#0MOV 40H,ASJMP $END2.数据交换实验编写程序,实现以下操作:【功能1】产生数组Hex1:0H、1H、2H、…0FH,存储到片内RAM区中,数组Hex1的首地址为30H。
【功能2】产生数组Hex2:0FH、0EH、0DH、…0H,存储到片外RAM区中,数组Hex2的首地址为3000H。
【功能3】将片内RAM数组Hex1与片外RAM数组Hex2交换内容。
代码:ORG 0000HHex1 EQU 30H ;定义内部RAM数组首地址Hex2 EQU 3000H ;定义外部RAM数组首地址LJMP MAINORG 0030HMAIN: MOV SP,#4FH ;定义栈顶地址MOV R7,#16MOV R0,#Hex1MOV DPTR,#Hex2LCALL HEX1DE ;调用内部送数据函数LCALL HEX2DE ;调用外部送数据函数LCALL XCHDE ;调用交换函数SJMP $ORG 0100H;内部送数据HEX1DE: PUSH 00HPUSH 07HMOV A,#0LOOP1: MOV @R0,AINC AINC R0DJNZ R7,LOOP1POP 07HPOP 00HRET;外部送数据HEX2DE: PUSH 07HPUSH DPLPUSH DPHMOV A,#0FHLOOP2: MOVX @DPTR,ADEC AINC DPTRDJNZ R7,LOOP2POP DPHPOP DPLPOP 07HRET;交换子程序XCHDE:LOOP3: MOVX A,@DPTRXCH A,@R0INC R0INC DPTRDJNZ R7,LOOP3RETEND3.查表实验1、《单片机原理及应用实验教程》(第2版)“第2章实验3”(P49)。
单片机试验项目(键盘程序设计),附代码大全1、键盘与的连接图3键盘连接图4单片机与键盘接口图2、通过I/0口连接。
将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。
对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。
下面给出一个例程。
其功能很简单,四个键定义如下:P3.2:开始,按此键则灯开始流动(由上而下)P3.3:停止,按此键则停止流动,所有灯为暗P3.4:上,按此键则灯由上向下流动P3.5:下,按此键则灯由下向上流动UpDown EQU 00H ;上下行标志StartEnd EQU 01H ;起动及停止标志LAMPCODE EQU 21H ;存放流动的数据代码以下程序功能很简单,但它演示了一个单片机程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
ORG 0000HAJMP MAINORG 30HMAIN:MOV SP,#5FHMOV P1,#0FFHCLR UpDown ;启动时处于向上的状态CLR StartEnd ;启动时处于停止状态MOV LAMPCODE,#0FEH ;单灯流动的代码LOOP:ACALL KEY ;调用键盘程序JNB F0,LNEXT ;如果无键按下,则继续ACALL KEYPROC ;不然调用键盘处理程序LNEXT:ACALL LAMP ;调用灯显示程序AJMP LOOP ;反复循环,主程序到此结束DELAY:MOV R7,#100D1: MOV R6,#100DJNZ R6,$DJNZ R7,D1RET;----------------------------------------延时程序,键盘处理中调用KEYPROC:MOV A,B ;从B寄存器中获取键值JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)JB ACC.3,KeyOverJB ACC.4,KeyUpJB ACC.5,KeyDownAJMP KEY_RETKeyStart:SETB StartEnd ;第一个键按下后的处理AJMP KEY_RETKeyOver:CLR StartEnd ;第二个键按下后的处理AJMP KEY_RETKeyUp: SETB UpDown ;第三个键按下后的处理AJMP KEY_RETKeyDown:CLR UpDown ;第四个键按下后的处理KEY_RET:RETKEY:CLR F0 ;清F0,表示无键按下。
2.1 实验四中断实验一、实验目的加深对MCS-51单片机中断系统基础知识的理解。
二、实验设备Keil C单片机程序开发软件。
Proteus仿真软件DP51-PROC单片机综合实验仪。
三、实验内容和步骤内容:利用外部中断输入引脚(以中断方式)控制步进电机的转动。
要求:每产生1次中断,步进电机只能步进1步。
实验程序:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。
设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
③步进电机的转动控制由外部中断的服务程序来实现。
④当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。
设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1预习:1)编写好实验程序。
2)根据编写的程序和实验步骤的要求制定调试仿真的操作方案。
实验单元电路:1) 步进电机驱动电路。
步进电机共有4相,当以A →B →C →D →A →B …的顺序依次通电时,电机就会正转,若按相反的顺序依次通电,电机就会反转。
每顺序切换一相(1步),电机旋转18°,切换的频率决定电机的转速(切换的频率不能超过电机的最大响应频率)。
根据图2.4中的电路,当BA (插孔)输入为高时,对应的A 相通电。
2) SW 电路开关SW X 拨在下方时,输出端SWX 输出低电平,开关SW X 拨在上方时,输出端SWX 输出高电平。
其中SW1和SW3具备消除抖动电路,这样,SW1或SW3每上下拨动一次,输出端产生单一的正脉冲(上升沿在前,下降沿在后)。
(在两个中)识别最大模拟输入通道一、任务利用0809采集两路模拟电压,将电压值最大的通道号显示在LED显示器上。
(硬件电路参见AD_CH2_1.DSN)。
二、设计参考:①算法:依次采集两路模拟电压,并将其保存。
当所有通道都采集完后,比较通道的采样值,将采样值最大的通道号显示(当采样值一样时,显示其中最小通道编号)。
注:通道IN0~IN7的编号分别为0~7。
②LED显示的段码:字符编码0 0C0H1 0F9H2 0A4H3 0B0H4 99H5 92H6 82H7 0F8H8 80H9 90H③地址分配:0809片选地址3C00H通道地址片选地址+通道编号3X3键盘扫描三、任务利用8155的PB、PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8155.DSN)。
当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。
四、设计参考:①8155命令/状态寄存器格式:D7 TM2D6TM1D5IEBD4IEAD3PC2D2PC1D1PBD0PAPA 0=A口输入;1=A口输出PB 0=B口输入;1=B口输出PC2PC1 00=A口、B口基本输入输出,C口输入01=A口、B口基本输入输出,C口输出10=略11=略IEA 略IEB 略TM2TM1 略②8155端口地址分配:控制口7F00HPA 7F01HPB 7F02HPC 7F03H3X3键盘扫描五、任务利用8255的PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8255.DSN)。
当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED 熄灭。
六、设计参考:①8255控制字格式:②8255端口地址分配:PA 0000HPB 0400HPC 0800H控制口0C00H 控制字标志1有效D7D6D5D4D3 D2D1 D0C口低4位0 输出,1输入工作方式0 方式0,1方式1B口0 输出,1输入C口高4位0 输出,1输入工作方式00 方式0,01方式11x方式1A口0 输出,1输入50赫兹同步锯齿波发生器七、任务利用0832同步输出两个频率为50赫兹的锯齿波(硬件电路参见DA_BUF2_1.DSN)。
单片机原理实验报告班级:姓名:学号:实验日期:成绩:实验一基本操作实验目的:熟悉伟福仿真机软件的基本操作,熟悉MCS-51指令。
实验内容A:数据传送程序实验程序:实验步骤:(1)从起始地址开始全速运行程序Ⅰ,检查运行结果, 外部数据窗口中7000H~700FH单元的内容皆为00H;(2)按要求修改程序如Ⅱ,用单步/跟踪运行程序, 查看寄存器和外部数据窗口;(3)在PLUS处设置断点,从起始地址开始全速运行程序,查看寄存器和外部数据窗口;(4)清除断点,用运行到当前行方式将程序运行到PLUS的下一条指令,查看运行结果是否正确。
实验内容B: 1 , 当X>0时求符号函数Y= 0 , 当X=0时-1 , 当X<0时实验程序:实验步骤:(1)准备好三个有代表性的数据,分三次用单步/跟踪方式运行程序,注意PC指针的变化;当(40H)= _____(X>0) 时,ACC.7= 0 , 运行后(41H)= _01H_____(Y= 1),当(40H)= _00H____(X=0) 时,ACC.7= 0 , 运行后(41H)= __00H____(Y= 0),当(40H)= _____(X<0) 时,ACC.7= 1 , 运行后(41H)= FFH (Y=﹣1)(2)思考:能否用“JC POSI ”指令替代“JB ACC.7, POSI ”指令, 修改运行程序,验证结果。
注意“CJNE A, #00H, NZEAR”执行后CY位为0/1 ?单片机原理实验报告班级:姓名:学号:实验日期:成绩:实验二输入/输出控制实验实验目的:掌握单片机I/O口输入输出的控制方法,学会编写数码管的显示程序。
实验内容A:P1 口做输出口,接8只发光二极管L1~L8(高电平时发光二极管点亮),编写程序,使L1~L8流水闪烁。
ORG 0000HSTART: MOV A,#01HMOV R2,#08HLOOP:MOV P1,ALCALL DELAYRL ADJNZ R2,LOOPAJMP STARTDELAY:MOV R5,#40 ;延时1秒D1:MOV R6,#50D2:MOV R7,#248D3:DJNZ R7,D3DJNZ R6,D2DJNZ R5,D1RETEND实验内容B:P1 口做输入口,接拨动开关K1~K8。
单片机开发与实训演示代码全文共四篇示例,供读者参考第一篇示例:在单片机开发和实训演示代码中,我们通常会使用一些常见的单片机开发平台,比如基于STMicroelectronics公司的STM32系列单片机的开发板。
STM32系列单片机是一种性能优越的单片机,拥有丰富的外设和强大的性能,非常适合用于各种复杂的应用场景。
在进行单片机开发和实训演示代码时,我们通常会使用一些常见的开发工具,比如Keil C51开发环境、ST-Link调试器等。
这些工具可以帮助开发者更加高效地进行单片机程序的编写和调试,提高开发效率和代码质量。
接下来,我们将介绍一些常见的单片机开发与实训演示代码例程,希望可以帮助读者更好地理解和掌握单片机开发技术。
1. LED闪烁实验LED闪烁实验是单片机开发中的一个最基础的实验,通过控制单片机的IO口来驱动LED灯实现闪烁的效果。
以下是一个基于STM32单片机的LED闪烁实验代码:```c#include "stm32f10x.h"#define LED_PIN GPIO_Pin_5#define LED_GPIO GPIOAvoid LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = LED_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(LED_GPIO, &GPIO_InitStructure);}在这个代码中,我们首先调用了LED_Init函数来初始化LED的GPIO口,使其为输出模式。
第2章基础实验2.1 实验一系统认识实验一、实验目的学习实验系统的基本操作,了解在实验系统中进行程序设计、仿真和调试的操作方法和步骤。
二、实验设备Keil单片机程序开发软件。
Proteus仿真软件DP51-PROC单片机综合实验仪。
DT-2003数字万用表。
三、实验内容和步骤内容:简单单片机应用程序的编辑、编译、仿真和调试。
实验程序:功能:使连接在MCS-51单片机P1.0引脚的LED闪烁。
设计思路:①点亮LED需要约10 mA电流,此时LED两端电压差约2 V。
因此,将LED 的阴极通过一个电阻连接到P1.0引脚(电阻阻值约为200 ),阳极连接到电源VCC(5 V)。
②为便于观察,交替的时间间隔不应太小(建议选择在0.5 s左右),由于该时间不要求严格精确,所以,可采用软件延时的方法实现。
③程序可采用图2.1中的流程结构。
图2.1 实验一程序流程图预习:1)提前一周预约好实验时间。
2)自学Keil和Proteus两软件的基本使用方法。
3)按设计思路,用汇编语言或C51语言编制实验程序。
4)了解本次实验的步骤和操作方法。
图2.2 实验一电路图步骤:1)在S: \ STUDY \ Kiel文件夹中新建Ex01文件夹(该文件夹用于保存本次实验的所有内容),通过网上邻居将服务器上本次实验共享文件夹下的所有文件拷贝到S: \ STUDY \ Kiel \ Ex01文件夹中。
2)运行Keil并创建一个新工程。
工程保存为S: \ STUDY \ Kiel \ Ex01 \ Ex01. Uv2。
选择单片机型号为Generic中的8051。
创建新工程的操作方法:菜单Project New Project…3)设置工程选项,将工程选项设置如下:Target页夹:Xtal= 12 MHzOutput页夹:Create HEX FileBL51 Locate页夹:取消Use Memory Layout from Target Dialog设置Code Range属性为0x40-0xFFF如用C51编程,设置此页夹。
2.1实验四中断实验一、实验目的加深对MCS-51单片机中断系统基础知识的理解。
二、实验设备Keil C单片机程序开发软件。
Proteus仿真软件DP51-PROC单片机综合实验仪。
三、实验容和步骤容:利用外部中断输入引脚(以中断方式)控制步进电机的转动。
要求:每产生1次中断,步进电机只能步进1步。
实验程序:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。
设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
③步进电机的转动控制由外部中断的服务程序来实现。
④当前步进电机的相位通电状态信息可以使用片RAM中的一个字节单元来存储。
设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1预习:1)编写好实验程序。
2)根据编写的程序和实验步骤的要求制定调试仿真的操作方案。
实验单元电路:1) 步进电机驱动电路。
步进电机共有4相,当以A →B →C →D →A →B …的顺序依次通电时,电机就会正转,若按相反的顺序依次通电,电机就会反转。
每顺序切换一相(1步),电机旋转18°,切换的频率决定电机的转速(切换的频率不能超过电机的最大响应频率)。
根据图2.4中的电路,当BA (插孔)输入为高时,对应的A 相通电。
2) SW 电路开关SW X 拨在下方时,输出端SWX 输出低电平,开关SW X 拨在上方时,输出端SWX 输出高电平。
其中SW1和SW3具备消除抖动电路,这样,SW1或SW3每上下拨动一次,输出端产生单一的正脉冲(上升沿在前,下降沿在后)。
3) LED 和KEY 电路步骤:1) 在S : \ STUDY \ Keil 文件夹中新建Ex04文件夹(该文件夹用于保存本次实验的所有容),通过网上邻居将服务器上本次实验共享文件夹下的所有文件拷贝到S : \ STUDY \ Keil \ Ex04文件夹中。
2) 在Keil C 中创建一个新工程,新工程保存为S : \ STUDY \ Keil \ Ex04\Ex04.uv2,然后选择单片机型号为Generic 中的8051。
3) 设置工程选项,将工程选项设置如下:图2.5 单脉冲电路原理图+5V+5V图2.4 步进电机驱动电路原理图LED1 LED8+5V图2.6 LED 和KEY 电路+5VTarget页夹:Xtal= 12 MHzOutput页夹:Create HEX FileDebug页夹:根据步骤的需要正确设定(参见实验1中步骤5、6、7)BL51 Locate页夹:取消Use Memory Layout from Target Dialog设置Code Range属性为0x40-0xFFF如用C51编程,才需设置此页夹。
4)创建新文件并输入编写的实验程序,然后保存在与工程相同的文件夹中(文件名为Ex04 . ASM或Ex04 . C),最后将其加入到工程中并通过编译。
5)按预习制定的调试方案利用Keil自身的软件仿真功能调试程序,确认实验程序能够运行(操作方法参见实验1中步骤5,此步骤建议在预习时完成)。
6)利用Proteus调试程序,确认实验程序能够实现功能(操作方法参见实验1中步骤6,此步骤建议在预习时完成)。
7)利用实验仪运行程序,观察真实环境的工作现象。
①检查实验仪与计算机之间的通信线连接,然后打开实验仪电源。
②测试实验仪中涉及本次实验的电路是否完好。
I.利用C2区的逻辑笔测试D1区的SW1和SW3信号完好。
操作方法:分别将SW1或SW3连接到C2区的TEST,上下拨动开关,通过观察逻辑笔的指示灯是否正常变化来判别被测信号的完好。
(发现有问题,应马上关闭实验仪电源,然后告知老师解决)II.利用测试程序检测单片机的外部中断和步进电机及其驱动实验电路完好。
图2.7 中断实验连接线路1操作方法:i.关闭实验仪电源,按图2.7连接电路后重新打开实验仪电源。
ii.双击S: \ STUDY \ Keil \ Ex04 \ Test4 \ Test4_0.Uv2文件。
iii.在新窗口中进入调试,然后连续运行程序。
iv.在实验仪上观察连接到P1端口的8个LED是否循环向左或向右依次熄灭,同时观察步进电机的转动情况。
如果发现某个LED常亮或常灭,则意味着P1端口的对应位损坏;如果发现LED不能向右依次熄灭,说明INT1损坏,反之,INT0损坏,此时应向教师示意。
v.测试完成后退出调试,然后关闭这个用于测试的Keil窗口。
vi.连接线路保留(在后面将会使用)。
注意:I.在本次实验中如果发现P1.0 ~ 3有损坏,可用P1其它完好的位替代完成实验(实验程序及其他相关操作都应做出调整)。
II.检测中如果步进电机不转动,说明电机或其驱动电路损坏,实验时仍然可通过观察与P1端口连接的LED的工作情况来推断步进电机的转动情况。
③关闭实验仪电源,按图2.8连接电路(图2.7的电路连线仍然保留)后重新打开实验仪电源。
图2.8 中断实验连接线路2④运行实验程序,观察真实的步进电机转动与开关拨动的关系(操作方法参见实验1中步骤7)。
8)[选作] 观察在真实环境中,由普通按钮开关直接产生中断现象的不同。
操作方法:①关闭实验仪电源,将图2.8中的SW1和SW2分别替换成KEY1和KEY3重新连线,再次打开实验仪电源,用逻辑笔测试KEY1、KEY3信号的完好。
②运行实验程序,分别按动KEY1和KEY3,观察此时步进电机的转动现象(特别是LED的工作情况变化与单脉冲中断时的不同)。
四、实验报告要求1、工整书写实验程序并画出其流程图。
2、叙述步骤6、7中观察到的现象,分析原因。
3、[选作]叙述步骤8中观察到的现象,分析原因。
五、参考实验程序架构(汇编):;资源定义 **************************************;位变量 ********************************;字节变量 ******************************PHASE_OUT EQU 30H ;步进电机相位通电状态VAR_END EQU 30H ;最后一个字节变量的位置,;应根据实际需要修改;堆栈定义 ******************************STACK_INI EQU VAR_END+1 ;须保证足够的空间;程序 ******************************************ORG 0000H ;复位入口LJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 040H ;复位处理程序RESET: MOV SP,#STACK_INI ;设置栈底指针;初始化外部设备 ********************************;中断设置 ******************************;此处添加设置中断触发方式的指令(IT0, IT1);此处添加设置中断许可的指令(EX0, EX1);此处添加设置中断优先的指令(PX0, PX1);初始化变量 ****************************;如果定义了变量, 此处添加对变量的初始化指令;开中断 ********************************SETB EA;主程序 ****************************************MAIN:SJMP MAIN;INT0中断服务程序 **************************INT_EX0:;此处添加保护现场容的指令(如果需要);此处添加正向步进驱动的指令(A→B→C→D→A→B…);此处添加恢复现场容的指令(如果需要)RETI;INT1中断服务程序 **************************INT_EX1:;此处添加保护现场容的指令(如果需要);此处添加反向步进驱动的指令(A→D→C→B→A→D…);此处添加恢复现场容的指令(如果需要)RETI;程序结束 **************************************END代码:/***********************************************************************文件名: Demo_Ex04.C(C51程序框架)功能: 在DP_51PRO实验仪上利用外部中断控制步进电机转动:每中断一次电机步进1步。
***********************************************************************/#include <reg51.h>//全局变量定义unsigned char bPhaseOut; // 步进电机相位通电状态/************************************************************************* 函数名称: main()** 入口参数: 无** 出口参数: 无***********************************************************************/void main(void){TCON = 0x00;IT1 = 1;IT0 = 1; //下降沿触发中断IE = 0x00;EX0 = 1;EX1 = 1;//允许外部中断IP = 0x00; //中断优先级(设置低级):INT0高于INT1bPhaseOut = 1 << 3;EA = 1; //总中断while( 1 ); // 等待}typedef unsigned int uint;typedef unsigned char uchar;void delay1ms(uint p)//12mhz{uchar j;uint i;for(i=0;i<p;i++)for(j=0;j<124;j++);}void INT_INT0(void) interrupt 0 using 1{P1 = bPhaseOut;bPhaseOut >>= 1;if(!bPhaseOut)bPhaseOut = 0x80;// P3 &= (1<<2);// delay1ms(10);// P3 |= 1<<2;// delay1ms(10);// P3 &= (1<<2);// delay1ms(10);// P3 |= 1<<2;delay1ms(10);//INT0 = 1;}void INT_INT1(void) interrupt 2 using 1 {P1 = bPhaseOut;bPhaseOut <<= 1;if(!bPhaseOut)bPhaseOut = 1;//P3 &= ~(1 << 3);delay1ms(10);}。