单片机原理与接口技术实验指导书2009.10.28目录软件部分 (1)实验一赋值程序 (1)一实验目的 (1)二实验内容 (1)三程序流程图 (1)四实验步骤 (1)五参考程序 (1)实验二数据区传送程序 (3)一实验目的 (3)二实验内容 (3)三程序流程图 (3)四实验步骤 (3)五参考程序 (3)硬件部分 (5)实验一P1口亮灯实验 (5)一实验目的 (5)二实验内容 (5)三程序流程图 (5)四仿真电路 (6)五硬件实现电路 (6)六实验步骤 (7)七参考程序 (7)实验二P1口转弯灯实验 (8)一实验目的 (8)二实验内容 (8)三程序流程图 (8)四仿真电路 (8)五实验电路 (9)六实验步骤 (9)七参考程序 (9)附录一Keil Vison2使用入门 (11)附录二Protues使用入门 (13)附录三KeilC与Proteus连接调试 (15)软件部分软件实验中,涉及外部数据存储器扩展寻址操作,须按下图连接实验线路。
说明:1 将存储器单元的D0-D7与数据总线单元D0-D7相连;存储器单元的A0-A12与地址总线单元A0-A12相连。
2 存储器单元的WE/PGM与六位LED左下方单元的WR或IOWR相连。
3 存储器单元的CS1与六位LED右下方单元A15相连。
4 存储器单元的OE与六位LED左下方单元的RD或IORD相连实验一赋值程序一实验目的1 熟悉汇编指令2 掌握汇编语言程序设计的一般方法二实验内容编写程序实现存储块(2000H---20FFH)的赋值操作(如全为0FFH)。
三程序流程图图1 流程图四实验步骤1 编写程序并调试。
2 在实验箱上运行程序,并查看对应存储器和寄存器的内容。
五参考程序ORG 0000HLJMP MAINORG 0030HMAIN: MOV R0,#00HMOV DPTR,#2000HMOV A,#0FFHLOOP0:MOVX @DPTR,AINC DPTRINC R0CJNE R0,#00H,LOOP0;判断赋值是否完成LOOP1:SJMP LOOP1END实验二数据区传送程序一实验目的1 熟悉汇编指令2 掌握汇编语言程序设计的一般方法二实验内容编写程序实现内存块的移动操作(将20H单元开始的64字节数据移动到3000H开始的存储区)。
三程序流程图图 2 流程图四实验步骤1 编写程序并调试。
2 在实验箱上运行程序,并查看对应存储器和寄存器的内容。
五参考程序ORG 0000HLJMP MAINORG 0030HMAIN: MOV R0,#00HMOV R1,#20HMOV DPTR,#3000HLOOP0: MOV A,@R1MOVX @DPTR,AINC DPTRINC R1INC R0CJNE R0,#40H,LOOP0;判断赋值是否完成LOOP1:SJMP LOOP1END硬件部分实验一P1口亮灯实验一实验目的1学习P1口的使用方法;2学习延时子程序的编写。
二实验内容P1作为输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
三程序流程图图1-1 流程图四仿真电路图1-2 PROTUES仿真电路五硬件实现电路图1-3 硬件连接图六实验步骤1 编写程序并调试(在Keil c 或实验箱编译系统下均可)。
2 在Protues中,绘制电路图,并调试。
3 在实验箱上硬件实现。
七参考程序ORG 0000HLJMP MAINORG 0030HMAIN: MOV A, #0FEH ;赋初值MOV R2, #8 ;设计数值OUTPUT: MOV P1, A ;送P1口输出RL A ;数据移位ACALL DELAYSJMP LOOPDELAY: MOV R6, #0 ;延时子程序MOV R7, #0DELAYLOOP:DJNZ R6, DELAYLOOPDJNZ R7, DELAYLOOPRETEND实验二P1口转弯灯实验一实验目的进一步了解P1口的使用,学习汇编语言编程方法与调试技巧。
二实验内容开关K1接5V时,左转弯灯(D1)闪亮,开关K2接5V时右转弯(D2)灯闪亮,开关K1、K2同时接5V或接地时,转弯灯均不闪亮。
三程序流程图图2-1 流程图四仿真电路五实验电路图2-3 实验硬件电路六实验步骤1 编写程序并调试。
2 在Protues中,绘制电路图,并调试。
3 在实验箱中硬件实现。
七参考程序ORG 0000HLJMP MAINORG 0030HMAIN: MOV P1,#0FFHMOV A, P1ANL A, #03HCJNE A, #00H,LOOP1SJMP JIESHULOOP1: CJNE A,#03H,LOOP2SJMP JIESHULOOP2: CJNE A,#01H,SJMP ZUOZHUANJIESHU: CJNE A,#02H,STOP YOUZHUAN: SETB P1.6SETB P1.7LCALL DELAYCLR P1.6CLR P1.7LCALL DELAYLJMP MAINZUOZHUAN:SETB P1.4SETB P1.5LCALL DELAYCLR P1.4CLR P1.5LCALL DELAYLJMP MAINDELAY: MOV R6, #0 ;延时子程序MOV R7, #0DELAYLOOP:DJNZ R6, DELAYLOOPDJNZ R7, DELAYLOOPRETEND附录一Keil Vison2使用入门Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,该软件提供丰富的库函数和功能强大的集成开发调试工具。
按下面的步骤建立第一个项目:1、点击Project--- New Project,在“文件名”中输入一个C程序项目名称。
“保存”后的文件扩展名为uv2,这是KEIL uVision2 项目文件扩展名,以后可以直接点击此文件以打开先前做的项目。
2、选择所要的单片机,这里选择常用的Ateml公司的A T89C51。
完成上面步骤后,就可以进行程序的编写了。
3、首先要在项目中创建新的程序文件或加入旧程序文件。
点击File—New按钮,或快捷键Ctrl+N。
出现一个新的文字编辑窗口,4、保存源文件,扩展名为.C。
并将该文件加入到刚才建立的项目中。
5、编译源文件。
点击Build target或Rebuild all target files,查看编译结果是否有错,若有错,则修改源程序。
否则,则可以进行调试。
6、进入调试模式如图2,调试程序。
点击Debug---Start/stop Debug session,进入调试模式。
可连续运行,也可以单步运行。
附录二Protues使用入门Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows 操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路一工作界面二电路图绘制1、将所需元器件加入到对象选择器窗口。
单击对象选择器按钮,如图所示弹出“Pick Devices”页面,在“Keywords”输入器件名称如AT89C51,系统在对象库中进行搜索查找,并将搜索结果显示在“Results”中。
在“Results”栏中的列表项中,双击“A T89C51”,则可将“A T89C51”添加至对象选择器窗口。
2、放置元器件至图形编辑窗口在对象选择器窗口中,选中对象名如AT89C51,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置。
3、放置总线至图形编辑窗口单击绘图工具栏中的总线按钮,使之处于选中状态。
将鼠标置于图形编辑窗口,单击鼠标左键,确定总线的起始位置;移动鼠标,屏幕出现粉红色细直线,找到总线的终了位置,单击鼠标左键,再单击鼠标右键,以表示确认并结束画总线操作。
此后,粉红色细直线被蓝色的粗直线所替代,4、元器件之间的连线Proteus的智能化可以在你想要画线的时候进行自动检测。
5、元器件与总线的连线画总线的时候为了和一般的导线区分,一般画斜线来表示分支线。
此时自己可以决定走线路径,只需在想要拐点处单击鼠标左键即可。
6、给与总线连接的导线贴标签单击绘图工具栏中的导线标签按钮,使之处于选中状态。
将鼠标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“×”号,如图所示。
表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口。
在“string”栏中,输入标签名称(如a),单击“OK”按钮,结束对该导线的标签标定。
注意,在标定导线标签的过程中,相互接通的导线必须标注相同的标签名。
附录三KeilC与Proteus连接调试1、假若KeilC与Proteus均已正确安装在C:\Program Files的目录里,把C:\Program Files\Labcenter Electronics\Proteus 6 Professional\MODELS\VDM51.dll复制到C:\Program Files\keilC\C51\BIN目录中。
2、用记事本打开C:\Program Files\keilC\C51\TOOLS.INI文件,在[C51]栏目下加入:TDRV5=BIN\VDM51.DLL ("Proteus VSM Monitor-51 Driver")其中“TDRV5”中的“5”要根据实际情况写,不要和原来的重复。
(步骤1和2只需在初次使用设置。
)3、进入KeilC μVision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:Atmel公司的A T89C51)。
并为该项目加入KeilC源程序。
源程序如下:#define LEDS 6#include "reg51.h"//led灯选通信号unsigned char code Select[]={0x01,0x02,0x04,0x08,0x10,0x20};unsigned char code LED_CODES[]={ 0xc0,0xF9,0xA4,0xB0,0x99,//0-40x92,0x82,0xF8,0x80,0x90,//5-90x88,0x83,0xC6,0xA1,0x86,//A,b,C,d,E0x8E,0xFF,0x0C,0x89,0x7F,0xBF//F,空格,P,H,.,- };void main(){char i=0;long int j;while(1){P2=0;P1=LED_CODES[i];P2=Select[i];for(j=3000;j>0;j--); //该LED模型靠脉冲点亮,第i位靠脉冲点亮后,会自动熄来头。