西南科技大学单片机原理实实验四及代码
西南科技大学微机原理4huibian
1
汇编程序的执行
一、汇编程序的功能 将汇编语言源程序翻译成机器语言编写的目标程 序,并可输出列表文件。 • 检查语法并给出错误信息 • 展开宏指令
常用汇编工具: ASM 和 MASM
输 入
源程序.ASM
翻 译
汇编程序 MASM
输 出 目标代码(.OBJ) 列表文件(.LST) 交叉索引文件(.CRF)
2
汇编程序的执行
二、程序的编辑、汇编与连接 1.建立源文件 用编辑软件完成,常见软件:Edit、记事本 2.汇编源程序 用汇编程序MASM对源程序进行汇编 3.连接产生可执行文件
用连接程序LINK对*.OBJ进行连接, 产生可执行
文件*.EXE;
4.执行程序 *.EXE
3
4.1 汇编程序的格式
基本定义
④ 注释项:用来说明一段或一句指令的功能,前加“;”
5
4.3 指示性语句
一、符号定义语句
基本定义
① EQU 等值语句 格式: <名 字> EQU <表达式> 功能:把表达式的值赋给符号名。 举例:NUMBER EQU 8 ② = 等号语句 格式: TMP = 6 功能:将符号TMP赋值为6。
6
4.3 指示性语句
COMMON:本段与其它COMMON类型的同名段形成一个覆盖段,所有同 名段将具有相同的段基址,共享该覆盖段存储区。覆盖段长度取同名段中 最长段的长度。 STACK:本段与同名段连接成一个连续段作为堆栈段,系统自动对段寄存 器SS赋予该连续段的首址,并初始化堆栈指针寄存器SP。 AT表达式:本段从表达式指定的地址(绝对地址)开始装入。 MEMORY:本段定位于所有其它段之前(地址最高端),若有多个这样的 段,则只对第一个MEMORY段这样定位,其它按PUBLIC类型处理。
建筑经济管理(独立本科段)专业课程设置与学分
建筑经济管理(独立本科段)专业课程设置与学分主考学校:西南科技大学增补的主考学校:四川大学西南民族大学成都理工大学西华大学四川教育学院四川理工学院会计(独立本科段)专业课程设置与学分主考学校:西南财经大学增补的主考学校:四川大学电子科技大学西南交通大学西南民族大学成都信息工程学院西南科技大学成都理工大学四川师范大学西华师范大学内江师范学院乐山师范学院四川理工学院攀枝花学院成都学院西华大学成都理工大学工程技术学院工商企业管理(独立本科段)专业课程设置与学分专业层次:独立本科段专业代码: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语言两门课程。
单片机个实验代码详细
(1).初始化:启动AT89S51单片机进入ISP下载状态,若启动成功,则状态显示区就会显示如图3.2所示的文字。否则,不成功会有“初始化失败”的字样提示。
图3.2
(2).特征字:点击一下检测器件,会读出单片机的芯片的特征字,对于AT89S51单片机的特征字为:1E5106。
进入Keil C51后,屏幕如下图所示。几秒钟后出现编辑界
启动Keil C51时的屏幕
进入Keil C51后的编辑界面
简单程序的调试
学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习Keil C51软件的基本使用方法和基本的调试技巧。
1)建立一个新工程
6)回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group1”上单击右键,弹出如下菜单
然后单击“Add File to Group ‘Source Group 1’”屏幕如下图所示
选中Test.c,然后单击“Add ”屏幕好下图所示 注意到“Source Group1”文件夹中多了一个子项“Text1.c”了吗?子项的多少与所增加的源程序的多少相同
单片机原理课程实验
实验一LED显示器指示
实验二软件延时及灯光控制实验
实验三多级外部中断实验
实验四脉冲频率的测量实验
实验五串行口扩展实验
实验六串行EEPROM的读出和写入实验
实验七8位A/D、D/A转换器的应用实验
实验八串行A/D、D/A的应用实验
实验九直流继电器的驱动及控制实验
实验十数据采集的软件抗干扰实验
(15)EEPROM
EEPROM(AT24C16),用来保存数据信息,接口序号为:串行数据线:SDA;时钟线:SCL;写保护线:WP。
单片机实验代码总结
单片机实验代码集合(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编程,设置此页夹。
单片机实验考试,实验报告源程序
单⽚机实验考试,实验报告源程序1.ORG 0000HLJMP CHABIAO1ORG 0040HCHABIAO1:DEC AMOV R6,AMOV DPTR,#TAB1MOVC A,@A+DPTRXCH A,R6INC ASJMP $TAB1: DB 1H,4H,9H,16H,25H,36H,49H,64H,81H END2ORG 0000HLJMP CHABIAO1ORG 0040HCHABIAO1:DEC AMOV R5,AMOV DPTR,#TAB1MOVC A,@A+DPTRXCH A,R5INC ASJMP $TAB1: DB 1H,4H,9H,16H,25H,36H,49H,64H,81H END3.ORG 0000HLJMP CHABIAO2ORG 0040HCHABIAO2:DEC ARL AMOV R6,AADD A,#08HADD A,#03HMOVC A,@A+PCMOV R7,ASJMP $TAB2: DW 1H,4H,9H,16H,25H,36H,49H,64H,81H END …4.. ORG 0000HLJMP CHABIAO2ORG 0040HCHABIAO2:DEC ARL AMOV R5,AADD A,#08HMOVC A,@A+PCXCH A,R5INC AADD A,#03HMOVC A,@A+PCMOV R4,ASJMP $TAB2: DW 1H,4H,9H,16H,25H,36H,49H,64H,81H END 5ORG 0000H LJMP MAIN1ORG 1000HMAIN1: MOV DPTR,#TAB1MOV A,R3DEC ARL AJMP @A+DPTRTAB1: AJMP PROG1AJMP PROG2AJMP PROG3AJMP PROG4RLC AMOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONEPROG2: MOV A,R7MOV B,#10MUL ABMOV R7,AMOV R6,BSJMP DONEPROG3: MOV A,R7ADD A,#8MOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONEPROG4: MOV A,R7MOV B,#2DIV ABMOV R7,AMOV R6,BDONE: SJMP $END6ORG 0000HLJMP MAIN1ORG 1000HMAIN1: MOV DPTR,#TAB1 MOV A,R3 DEC ARL ATAB1: AJMP PROG1 AJMP PROG2 AJMP PROG3 AJMP PROG4 PROG1: MOV A,R7 CLR CRLC ACLR AADDC A,#0MOV R6,ASJMP DONE PROG2: MOV A,R7 MOV B,#10MUL ABMOV R7,AMOV R6,BSJMP DONE PROG3: MOV A,R7 ADD A,#10MOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONE PROG4: MOV A,R7 MOV B,#2DIV ABMOV R7,AMOV R6,B DONE: SJMP $ END7ORG 0000HLJMP MAIN1ORG 0000HMAIN2: MOV DPTR,#TAB2 MOV A,R1 DEC ARL AMOV R3,AMOVC A,@A+DPTRXCH A,R3INC AMOVC A,@A+DPTRMOV DPL,AMOV DPH,R3CLR AJMP @A+DPTRTAB2: DW PROG1DW PROG3DW PROG4PROG1: MOV A,R7CLR CRLC AMOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONEPROG2: MOV A,R7MOV B,#5MUL ABMOV R7,AMOV R6,BSJMP DONEPROG3: MOV A,R7ADD A,#5MOV R7,ACLR APROG4: MOV A,R7MOV B,#2DIV ABMOV R7,AMOV R6,BDONE: SJMP $END8ORG 0000HLJMP MAIN2ORG 1000HMAIN2: MOV DPTR,#TAB2 MOV A,R1DEC ARL AMOV R3,AMOVC A,@A+DPTRXCH A,R3INC AMOVC A,@A+DPTRMOV DPL,AMOV DPH,R3CLR AJMP @A+DPTR TAB2: DW PROG1 DW PROG2 DW PROG3DW PROG4 PROG1: MOV A,R7CLR CRLC AMOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONE PROG2: MOV A,R7MOV R6,BSJMP DONE PROG3: MOV A,R7 ADD A,#6MOV R7,ACLR AADDC A,#0MOV R6,ASJMP DONE PROG4: MOV A,R7 MOV B,#2DIV ABMOV R7,AMOV R6,B DONE: SJMP $END9ORG 0000HLJMP PAIXU2ORG 1000HPAIXU2: MOV R7,#9 LOOP1: DEC R7 MOV A,R7JZ DONEMOV R6,ACLR F0MOV R0,#40HLOOP2: MOV A,@R0INC R0MOV R2,ACLR CSUBB A,@R0MOV A,R2JNC NEXTXCH A,@R0DEC R0NEXT: DJNZ R7,LOOP2 MOV A,R6 MOV R7,AJB F0,LOOP1 DONE: SJMP $END10ORG 0000HLJMP PAIXU2ORG 1000HPAIXU2: MOV R7,#9 LOOP1: DEC R7 MOV A,R7JZ DONEMOV R6,ACLR F0MOV R0,#40HLOOP2: MOV A,@R0INC R0MOV R2,ACLR CSUBB A,@R0MOV A,R2JC NEXTXCH A,@R0DEC R0MOV @R0,AINC R0SETB F0NEXT: DJNZ R7,LOOP2 MOV A,R6 MOV R7,AJB F0,LOOP1 DONE: SJMP $END11ORG 0000HPAIXU2: MOV R7,#8 LOOP1: DEC R7 MOV A,R7JZ DONEMOV R6,ACLR F0MOV R0,#50HLOOP2: MOV A,@R0INC R0MOV R2,ACLR CSUBB A,@R0MOV A,R2JNC NEXTXCH A,@R0DEC R0MOV @R0,AINC R0SETB F0NEXT: DJNZ R7,LOOP2 MOV A,R6 MOV R7,AJB F0,LOOP1 DONE: SJMP $END12ORG 0000HLJMP PAIXU2ORG 1000HPAIXU2: MOV R7,#8 LOOP1: DEC R7 MOV A,R7JZ DONEMOV R6,ACLR F0MOV R0,#50HLOOP2: MOV A,@R0CLR CSUBB A,@R0MOV A,R2JC NEXTXCH A,@R0DEC R0MOV @R0,AINC R0SETB F0NEXT: DJNZ R7,LOOP2 MOV A,R6MOV R7,AJB F0,LOOP1 DONE: SJMP $END13TIMER0 EQU 30HTIMER1 EQU 31HORG 0000HLJMP MAINORG 0003HLJMP INTERRUPT_0ORG 0013HLJMP INTERRUPT_1 ORG 1000HMOV SP,#60HMOV IE,#10000101B MOV IP,#00000100B SETB IT0 SETB IT1LOOP:MOV A,#11110000B MOV P1,ALCALL DELAY500 MOV A,#00001111B MOV P1,A LCALL DELAY500 SJMP LOOPINTERRUPT_0:PUSH ACCPUSH BMOV B,#8MOV P1,ALCALL DELAY500 RR ADJNZ B,LOOP1POP BPOP ACCRETIINTERRUPT_1:PUSH ACCPUSH BMOV B,#7MOV A,#00000011B LOOP2:MOV P1,ALCALL DELAY500 RL ADJNZ B,LOOP2POP BPOP ACCRETIMOV TIMER0,#250 DELAY2:NOPNOPDJNZ TIMER0,DELAY2 DJNZ TIMER1,DELAY RET DELAY500:NOPPUSH TIMER1MOV TIMER1,#250 LCALL DELAY LCALL DELAY POP TIMER1RETEND14TIMER0 EQU 30H TIMER1 EQU 31HORG 0000HLJMP MAINORG 0003HLJMP INTERRUPT_1 ORG 1000H MAIN:MOV SP,#60HMOV IE,#10000101B MOV IP,#00000100B SETB IT0 SETB IT1LOOP:MOV A,#11110000B MOV P1,ALCALL DELAY500 MOV A,#00001111BMOV P1,ALCALL DELAY500 SJMP LOOPINTERRUPT_0:PUSH ACCPUSH BMOV B,#6MOV A,#11100000B LOOP1:MOV P1,ALCALL DELAY500RR ADJNZ B,LOOP1POP BPOP ACCRETIINTERRUPT_1:PUSH ACCPUSH BMOV B,#8MOV A,#00000001B LOOP2:MOV P1,ALCALL DELAY500RL ADJNZ B,LOOP2POP BPOP ACCRETINOPDJNZ TIMER0,DELAY2 DJNZ TIMER1,DELAY RET DELAY500:NOPPUSH TIMER1MOV TIMER1,#250 LCALL DELAY LCALL DELAY POP TIMER1RETEND15TIMER0 EQU 30H TIMER1 EQU 31HORG 0000HLJMP MAINORG 0003HLJMP INTERRUPT_0ORG 0013HLJMP INTERRUPT_1 ORG 1000H MAIN:MOV SP,#60HMOV IE,#10000101B MOV IP,#00000100B SETB IT0 SETB IT1LOOP:MOV A,#11110000B MOV P1,ALCALL DELAY500 MOV A,#00001111B MOV P1,A LCALL DELAY500 SJMP LOOPINTERRUPT_0:PUSH ACCPUSH BMOV B,#7MOV A,#11000000BLOOP1:MOV P1,ALCALL DELAY500POP ACCRETIINTERRUPT_1:PUSH ACCPUSH BMOV B,#8MOV A,#00000001B LOOP2:MOV P1,ALCALL DELAY500RL ADJNZ B,LOOP2POP BPOP ACCRETIDELAY:MOV TIMER0,#250 DELAY2:NOPNOPDJNZ TIMER0,DELAY2 DJNZ TIMER1,DELAY RET DELAY500:NOPPUSH TIMER1MOV TIMER1,#250 LCALL DELAY LCALL DELAY POP TIMER1RETEND16TIMER0 EQU 30H TIMER1 EQU 31HORG 0000HLJMP MAINORG 0003HLJMP INTERRUPT_0MOV SP,#60HMOV IE,#10000101B MOV IP,#00000100B SETB IT0 SETB IT1LOOP:MOV A,#11110000B MOV P1,ALCALL DELAY500 MOV A,#00001111B MOV P1,A LCALL DELAY500 SJMP LOOPINTERRUPT_0:PUSH ACCPUSH BMOV B,#7MOV A,#00000111B LOOP1:MOV P1,ALCALL DELAY500 RR ADJNZ B,LOOP1POP BPOP ACCRETIINTERRUPT_1:PUSH ACCPUSH BMOV B,#8MOV A,#10000000BLOOP2:MOV P1,ALCALL DELAY500RL ADJNZ B,LOOP2POP BPOP ACCRETIDELAY:MOV TIMER0,#250DJNZ TIMER0,DELAY2DJNZ TIMER1,DELAYRETDELAY500:NOPPUSH TIMER1MOV TIMER1,#250LCALL DELAYLCALL DELAYPOP TIMER1RETEND17题T1定时50ms,2s钟左移⼀次ORG 0000H MLJMP MAINORG 001BHLJMP DVT1ORG 0100HMAIN:MOV TMOD,#10HMOV TH1,#3CHMOV TL1,#0B0HMOV R7,#40SETB ET1SETB EAMOV A,#01MOV P1,ASETB TR1SJMP $DVT1:MOV TH1,#3CHMOV TL1,#0B0HDJNZ R7,EXITEXIT:RETIEND18题T1定时10ms,1s钟左移⼀次ORG 0000H MLJMP MAINORG 001BHLJMP DVT1ORG 0100HMAIN:MOV TMOD,#10HMOV TH1,#0D8HMOV TL1,#0F0HMOV R7,#100SETB ET1SETB EAMOV A,#01MOV P1,ASETB TR1SJMP $DVT1:MOV TH1,#0D8HMOV TL1,#0F0HDJNZ R7,EXITMOV R7,#100MOV P1,ARL AEXIT:RETIEND19题T0定时10ms,2s钟右移⼀次ORG 0000H MLJMP MAINORG 000BHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,#0F0HMOV R7,#200SETB ET0SETB EAMOV A,#01MOV P1,ASETB TR0SJMP $DVT0:MOV TH0,#0D8HMOV TL0,#0F0HDJNZ R7,EXITMOV R7,#200MOV P1,ARR AEXIT:RETIEND20题T1定时10ms,3s钟右移⼀次ORG 0000H MLJMP MAINORG 001BHLJMP DVT1ORG 0100HMAIN:MOV TMOD,#10HMOV TH1,#0D8HMOV TL1,#0F0HMOV R7,#300SETB ET1SETB EAMOV TH1,#0D8HMOV TL1,#0F0HDJNZ R7,EXITMOV R7,#300MOV P1,ARR AEXIT:RETIEND21题T1定时20ms 1s钟左移1次ORG 0000H MLJMP MAINORG 001BHLJMP DVT1ORG 0100HMAIN:MOV TMOD,#10HMOV TH1,#0B1HMOV TL1,#0E0HMOV R7,#50SETB ET1SETB EAMOV A,#01MOV P1,ASETB TR1SJMP $DVT1:MOV TH1,#0B1HMOV TL1,#0E0HDJNZ R7,EXITMOV R7,#50MOV P1,A22题T0定时20ms,2s钟右移⼀次ORG 0000H MLJMP MAINORG 000BHLJMP DVT0。
西南科技大学单片机原理与应用期末试题A(2009)
西南科技大学2008——2009学年第2 学期《单片机原理及应用B 》期末考试试卷( A卷)学院:_______________班级:_____________姓名:_______________学号:____________ 答题提示:答题时间2小时,全部答案必须写在答题纸上。
一、填空题:(30分,每空2分)1、在MCS-51单片机的汇编语言中,带符号数采用补码编码方式。
2、计算机中的堆栈是一组按照后入先出(或先入后出)工作方式工作的存储单元。
MCS-51单片机在复位后,若不修改SP,则第一个入栈的字节数据保存在08H 。
3、若要使工作寄存器R3映射在片内RAM中的1BH单元,此时PSW寄存器中的RS0= 1 ,RS1= 1 。
4、80C51单片机的中断系统具有5个中断源, 2 个中断优先级。
5、MCS-51单片机对SFR的访问只能使用直接寻址方式,位地址08H~0FH被定义为片内数据存储器 21H 单元中的各位。
6、指令一般具有功能、时间和空间三种属性。
MCS-51指令系统中能够实现寄存器间接寻址的寄存器有 3 个。
7、8051单片机内部并行端口 P0 作一般I/O使用时,往往需要外接上拉电阻。
8、在所有MCS-51单片机的定时器工作方式中,方式2 能够提供最高定时精度,TF0在T0定时中断响应后会自动清0 。
二、判断题:(20分,每小题2分)1、8051的同级中断可以相互嵌套,从而实现特殊全嵌套功能。
X2、在MCS-51指令系统中,指令AJMP和LJMP的区别在于AJMP能够实现64KB范围的跳转。
x3、8051单片机所有内部并行端口均可驱动8个TTL负载。
x4、MCS-51单片机复位后片内RAM的内容将全部清0。
x5、MCS-51单片机的串行口只能提供异步通信方式。
x6、MCS-51单片机的P0口可作为外部数据总线。
T22西南科技大学2008——2009学年第 2 学期《 单片机原理及应用B 》期末考试试卷( A 卷)7、 8051的堆栈只能设在片内RAM 中且地址不得超过7FH 。
单片机实验代码
单片机实验代码文件排版存档编号:[UYTR-OUPT28-KBNTL98-UYNN208]单片机实验代码实验一ORG 0000hAJMP HA1SORG 0030HHA1S: MOV A,#00HHA1S1: JB P3.3,HA1S1MOV R2,#20HLCALL DELAYJB P3.3,HA1S1HA1S2: JNB P3.3,HA1S2MOV R2,#20HLCALL DELAYJNB P3.3,HA1S2INC APUSH ACCMOV P1,APOP ACCAJMP HA1S1DELAY: PUSH 02HDELAY1: PUSH 02HDELAY2: PUSH 02HDELAY3: DJNZ R2,DELAY3POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验二ORG 0000HAJMP 0030HORG 0013HLJMP HA2S3ORG 0030HHA2S: MOV P1,#0fFH ORL P3,#00HHA2S1: JB P3.4,HA2S1 ORL IE,#84HORL IP,#04HMOV PSW,#00HMOV SP,#53HHA2S2: MOV P1,#081H ACALL HA2S7MOV P1,#082HACALL HA2S7MOV P1,#084HACALL HA2S7MOV P1,#088HACALL HA2S7MOV P1,#090HACALL HA2S7MOV P1,#0A0HACALL HA2S7MOV P1,#0C0HACALL HA2S7SJMP HA2S2HA2S3: MOV B,R2HA2S5: SETB P1.7ACALL HA2S6CLR P1.7ACALL HA2S6JNB P3.3,HA2S5MOV R2,BRETIHA2S6: MOV R2,#06H ACALL DELAYRETHA2S7: MOV R2,#30HACALL DELAYRETDELAY: PUSH 02H DELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验10org 0000hSjmp MAINorg 000bhmov th0,r1mov tl0,r0cpl p1.0RETIMAIN:MOV TMOD,#01H MOV IE,#82HMOV DPTR,#TABLOOP: CLR AMOVC A,@A+DPTRMOV R1,AINC DPTRCLR AMOVC A,@A+DPTRMOV R0,AORL A,R1JZ NEXT0MOV A,R0ANL A,R1CJNE A,#0FFH,NEXTSJMP MAINNEXT : MOV TH0,R1MOV TL0,R0SETB TR0SJMP NEXT1NEXT0:CLR TR0NEXT1: CLR AINC DPTRMOVC A,@A+DPTRMOV R2,ALOOP1: ACALL D200CDJNZ R2,LOOP1INC DPTRAJMP LOOPD200C:MOV R3,#81HD200B:MOV A,#0FFHD200A:DEC AJNZ D200ADEC R3CJNE R3,#00H,D200BRETTAB: DB 0FEH,25H,04H,0FEH,25H,02H ;11 1 5 DB 0FEH,25H,02H,0FDH,80H,04HDB 0FEH,84H,02H,0FEH,84H,02H;33 3 1DB 0FEH,84H,04H,0FEH,25H,04HDB 0FEH,25H,02H,0FEH,84H,02H;13 5 5DB 0FEH,0C0H,04H,0FEH,84H,02HDB 0FEH,98H,02H,0FEH,84H,02H;43 2 -DB 0FEH,57H,08H,00H,00H,04HDB 0FFH,0FFHEND;1=131 262 523 1047;2=147 294 587 1175;3=165 330 659 1319;4=175 349 698 1397;5=196 392 784 1568;6=220 440 880 1760;7=247 494 988 1976实验十一ORG 0000HAJMP STARTORG 0030HSTART: SETB P1.0 LCALL DELAYCLR P1.0LCALL DELAYSJMP STARTDELAY: MOV R7,#0FFH DELAY1: MOV R6,#0FFH DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1RETEND实验六ORG 0000HAJMP HA6SORG 0030HHA6S: MOV SP,#53HHA6S1: MOV R6,#00HHA6S2: MOV DPTR,#8000H MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;INC R6;CJNE R6,#0FFH,HA6S2 HA6S3: MOV R6,#0FFH MOV DPTR,#8000H; DEC R6MOV A,R6MOVX @DPTR,AMOV R2,#30HLCALL DELAY;CJNE R6,#00H,HA6S3 SJMP HA6S1DELAY: PUSH 02HDELAY1: PUSH 02H DELAY2: PUSH 02H DELAY3: DJNZ R2,DELAY3 POP 02HDJNZ R2,DELAY2POP 02HDJNZ R2,DELAY1POP 02HDJNZ R2,DELAYRETEND实验29TIMER EQU 01Horg 0000hajmp STARTORG 000BHAJMP INT_T0ORG 070HSTART: MOV SP,#53H MOV TMOD,#01HMOV TL0,#00HMOV TH0,#4BHMOV R0,#0HMOV TIMER,#20MOV SCON,#00HCLR TICLR RISETB TR0SETB ET0SETB EASJMP $INT_T0: PUSH ACCPUSH PSWCLR EACLR TR0MOV TL0,#0HMOV TH0,#4BHSETB TR0DJNZ TIMER,EXITMOV TIMER,#20MOV DPTR,#CDATAMOV A,R0MOVC A,@A+DPTRCLR TICPL AMOV SBUF,AINC R0CJNE R0,#0AH,EXITMOV R0,#0HEXIT: SETB EAPOP PSWPOP ACCRETICDATA: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H END相关文档:更多相关文档请访问:。
单片机原理及应用实验代码 -回复
单片机原理及应用实验代码-回复什么是单片机?单片机(Microcontroller,简称MCU)是一种集成了处理器、存储器和输入输出设备的微型计算机系统。
它具有体积小、功耗低、可编程性强等特点,被广泛应用于嵌入式系统和电子产品中。
单片机的基本原理单片机系统由CPU、存储器和输入输出设备等部分组成。
CPU是单片机的核心,它负责处理数据和控制系统的运行。
存储器包括程序存储器(ROM)和数据存储器(RAM),分别用于存储程序和数据。
输入输出设备用于与外部环境进行通信。
单片机主要靠程序来控制其内部运行。
程序是通过编程语言编写的一系列指令,通过存储器加载到单片机中。
单片机按照程序中的指令逐条执行,完成各种任务。
应用实验代码下面,我将为你介绍一些基本的单片机应用实验,并给出相应的代码示例:1. 点亮LED实验这是最基础的单片机应用实验之一。
通过编写程序控制单片机输出电平,从而点亮LED。
代码示例:include <reg52.h>sbit LED = P1^0; 定义LED连接的IO口void main(){LED = 0; 将LED引脚置低,点亮LEDwhile(1){无限循环,保持LED亮}}2. 数码管显示实验数码管是一种常见的输出设备,可用于显示数字和字符。
通过编写程序控制单片机输出电平,实现数码管上数字的显示。
代码示例:include <reg52.h>sbit SDA = P1^0; 定义SDA引脚sbit SCL = P1^1; 定义SCL引脚void delay(unsigned int x){unsigned int i, j;for(i = 0; i < x; i++){for(j = 0; j < 500; j++){空循环延时,具体时间根据单片机时钟频率确定}}}void IIC_Start(){SDA = 1;SCL = 1;SDA = 0;delay(5);SCL = 0;}void IIC_Stop(){SDA = 0;SCL = 1;SDA = 1;delay(5);}void IIC_Send_Byte(unsigned char dat){unsigned char i;for(i = 0; i < 8; i++){SDA = (dat & 0x80) >> 7;dat <<= 1;SCL = 1;SCL = 0;}}void main(){IIC_Start(); 发送起始信号IIC_Send_Byte(0x76); 发送数据,例如0x76用于控制数码管上显示的数字IIC_Stop(); 发送停止信号while(1){无限循环,保持数字的显示}}这里只是展示了两个简单的单片机实验示例,实际应用中单片机可以实现更复杂的功能,如控制电机、传感器数据处理等。
西南大学工程技术学院机械专业单片机第4章
版权所有 All Rights Reserved
13
2012-10-17
间接寻址、基址加变址寻址、相对寻址六种基本的寻址方式,具有丰富
的位操作指令,对位的寻址均采用直接寻址方式。 • 学习指令系统时,对于传送类指令,要注意访问程序存储器、片内数
据存储器(RAM区和专用寄存器区)、片外数据存储器时指令与寻址方
式的区别。对运算类指令注意指令执行后对程序状态字的影响。对控制 转移类指令,要注意转移的条件、转移的目的地址、转移的范围。
P1. 0 P1. 1 P1. 2 P1. 3 P1. 4 P1. 5 P1. 6 P1. 7 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
SJMP START
DELAY: MOV R3,#0FFH DEL2: MOV R4,#0FFH
DEL1: NOP
DJNZ R4,DEL1 DJNZ R3,DEL2 RET
Single Chip Controller
Single Chip Controller
版权所有 All Rights Reserved
9
2012-10-17
单片机原理及应用
第4章 汇编语言程序设计基础
Single Chip Controller
Single Chip Controller
版权所有 All Rights Reserved
第4章 汇编语言程序设计基础
例5:多重循环,50毫秒延时(12MHz晶振) 最简单的多重循环为由DJNZ 指令构成的软件延时程序
DEL: MOV R7, #200 DEL1: MOV R6, #125 DEL2:DJNZ R6, DEL2 DJNZ R7, DEL1 RET
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);}。