《单片机技术》实训指导书(带所有源程序版).doc_第1页
《单片机技术》实训指导书(带所有源程序版).doc_第2页
《单片机技术》实训指导书(带所有源程序版).doc_第3页
《单片机技术》实训指导书(带所有源程序版).doc_第4页
《单片机技术》实训指导书(带所有源程序版).doc_第5页
已阅读5页,还剩206页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机技术实训指导书主编:杨小锋参编:黎云汉义乌工商学院计算机工程系2009年 2 月目录项目一 Keil uVision软件快速入门3项目二 Proteus软件快速入门15项目三 模拟开关灯26项目四 多路开关状态指示29项目五 广告灯的左移右移34项目六 广告灯(利用取表方式)39项目七 报警产生器44项目八 I/O并行口直接驱动LED显示49项目九 按键识别方法之一53项目十 一键多功能按键识别技术58项目十一 0099计数器64项目十二 0059秒计时器(利用软件延时)69项目十三 可预置可逆4位计数器74项目十四 动态数码显示技术80项目十五 44矩阵式键盘识别技术84项目十六 定时计数器T0作定时应用技术(一)96项目十七 定时计数器T0作定时应用技术(二)104项目十八 99秒马表设计110项目十九 “嘀、嘀、”报警声118项目二十 “叮咚”门铃实验123项目二十一 数字钟130项目二十二 拉幕式数码显示技术141项目二十三 电子琴150项目二十四 模拟计算器数字输入及显示167项目二十五 8X8 LED点阵显示技术177项目二十六 点阵式LED“09”数字显示技术184项目二十七 点阵式LED简单图形显示技术193项目二十八 ADC0809A/D转换器基本应用技术199项目二十九 数字电压表207项目一 Keil uVision软件快速入门一、实训目的与要求:1、认识Keil uVision软件;2、掌握用Keil uVision软件建立工程;3、掌握用Keil uVision软件进行仿真调试;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:本实训主要介绍用于单片机开发的常见编程语言和开发环境,重点介绍Keil uVision集成开发环境的使用。1、51语言编译器介绍常见的MCS-51系列单片机编程语言有4种,汇编语言、C语言、BASIC语言和PL/M语言。目前最为常用的是汇编语言、C51语言,他们有良好的编译器支持,使用较为广泛。C51常用于编写较为复杂的大型程序,汇编语言则用于对效率要求较高的场合,尤其是对底层函数的编写,因此,一个好的单片机开发者,不仅要熟悉单片机内部的体系结构,还要理解单片机内部的工作过程,能熟练的使用汇编语言和C51语言进行单独或联合开发。C51语言的编译器很多,各有各的特点,如表1.1所示。表1.1 C51编译器及其比较类别特点American automation编译器通过#asm 和endasm预处理支持汇编语言,编译器速度慢,需通过汇编语言作为中间环节。archimedes兼容标准c,支持分组rank编译,但需要一个比较复杂的link程序才能运行。Bso/tasking兼容x86系列汇编,c编译器支持内置函数并且允许调用MCS-51系列单片机的汇编指令。intermetrics需要大量的宏来支持编译、汇编、链接。Micro computer controls不支持浮点数、长整数、结构和多维数组,生成的源文件必须用intel或mcc的8051汇编其汇编。franklin该编译器支持浮点数等类型,但不提供库代码,不能生成相应的汇编代码,只能生成混合代码。keil最常用的编译器,支持浮点数、多维数组,能生成对应的汇编代码,能直接编译汇编代码,内嵌多种工具,可以很方便的链接生成可执行文件。2、Keil uVision3集成开发环境uVision3 IDE是Keil software公司继uVision2后的产品,它集项目管理、编译工具、源代码编写工具、代码调试以及完全仿真于一体,是目前市面上最流行的单片机开发软件平台。该软件具有类似VC风格的界面,提供了丰富的工具、命令和窗口,可以使开发者在程序调试过程中随时掌握代码所实现的功能。本节通过CLR RAM实例,详细叙述uVision3的使用方法。2.1 项目工程的建立(1) 建立工程文件在桌面上双击Keil uVision3图标,启动集成开发环境如图1.1所示,该界面中最上面一行是菜单,菜单下面是各种工具按钮,左边的project workspace窗口为项目管理窗口(Project Window),最下面的为输出窗口(Output Window),中间部分为工作去,通常我们所编的源程序、调试程序代码窗口会出现在这里。图1.1点击Project菜单下的New Project命令,在出现的对话框中输入项目名CLR RAM.Uv2,选择合适的文件夹下建立新的工程项目CLR RAM.Uv2,点击确定按钮出现如图1.2所示的Select Device For TargetTarget1对话框,在Date base下选择Atmel,点开“+”号,选择AT89C51器件,点击确定按钮。在project workspace下出现。图1.2(2) 源程序文件的建立使用菜单File-New命令,弹出源程序编辑窗口,输入以下程序:ORG 0030H MOV R0,#30 MOV R1,#40HCLEAR: CLR A MOV R1,A INC R1 DJNZ R0,CLEAR SJMP $ END点击File-Save as命令,保存文件名为CLR_RAM.ASM。图1.3(3)将文件加入到工程项目中 按图1.3所示点击Add File to Group Source Group1命令,然后选中CLR_RAM.ASM文件,点击Add按钮,将刚才编写的源程序CLR_RAM.ASM加入项目中。如图1.4所示:图1.4注意:添加完文件后,该对话框并不消失,等待继续加入其它文件,初学者常误认为添加文件不成功,其实已添加成功,只需点击Close按钮关闭对话框即可。2.2工程的详细设置工程建立好后,要对工程进行进一步的设置,以满足后续工作的要求。首先点击左边的Project窗口的Target1,然后使用菜单的菜单“Project-Option for target target1”出现对工程设置的对话框,其中有8个页面,这里绝大部分设置取默认值就可以了。Target页面如图1.5所示:图1.5Xtal后面的数值为晶振频率值,默认值为所选CPU的最高工作频率,对AT89C51而言为24MHz,我们常选12MHz值,该值与最后产生的目标代码无关,仅用于软件仿真显示程序执行时间,一般于你的硬件所用频率设为同一值我们将它设为12MHz。Memory Model用于设置RAM的使用情况,设置为small,Code Rom Size用于设置ROM的空间,设置为Large:64k,Operation用于选择操作系统,一般不用操作系统,选择None,Use on-chip ROM用于是否进使用片内的ROM,在此设置如图1.5所示。Off Chip Code memory用以确定系统扩展ROM的地址范围,Off Chip xData memory组用于确定系统扩展RAM的地址范围,这些需根据硬件来决定。设置对话框中的OutPut页面,如图1.6所示,这里也有多个选项,其中Creat Hex file用于声称可执行代码文件(可用编程器械如单片机芯片中执行的HEX格式文件)默认情况下该项未被选中,如果要写片做硬件试验,就必须选中该项,这一点要特别注意。Select Folder for opjects是用于选择最终生成目标文件所在的文件夹,默认是与工程文件在同一个文件夹中,Name of Executable用于指定最终生成的目标文件的名字,默认与工程的名字相同。图1.6Debug页面的设置,如果要进行仿真的,选中Use Simulator,就可以进行软件仿真。其它所有页面设置为默认选择即可,设置完后,按确认键返回主界面,工程文件建立设置完毕。2.3编译、连接设置好工程后,即可以进行编译、连接。选择菜单Project-Build target,对当前工程进行连接,如果当前文加以修改,会现对该文件按进行编译,然后再连接以产生目标代码,如果选择Rebuild All target files将会对当前工程中的所有文件重新编译后再连接确保最终生成的目标代码是最新的。编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会报告错误,双击该行,可以自动定位到出错的位置。如果没有出错,最终会得到如图所的结果,提示已生成.hex的文件。图1.9 正确编译、连接后的结果3 Keil uVision3仿真调试、在线汇编与断点设置上一节我们学习了如何在建立工程文件、源程序以及编译生成目标代码,这仅仅是语法上没有错误,如果你的程序在逻辑上出现错误就必须通过调试来解决,实际上绝大部分的程序都必须经过反复调试残能得到正确的结果,调试是软件开发中的一个重要环节。下面着重介绍常用的调试命令、利用在线汇编设置断电进行调试的方法。3.1常用调试命令、窗口介绍Keil内建了一个仿真CPU用来模拟执行程序,可以在没有硬件和仿真机的情况下进行程序的调试。在对工程成功汇编、连接后,点击菜单Debug-Start/Stop Debug Session或者按Ctrl+F5或者点击工具按钮即可进入调试状态。调试状态和编辑状态相比有比较明显的变化,在Debug菜单中原来不能使用的命令现在都可以使用了,工具栏中多出了一个用于运行和调试的工具条。如图1.7所示:图1.7该工具条从左到右依次为复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析等命令。学习程序调试必须先了解全速运行和单步运行的概念,全速运行即一次运行完成,可以看见程序运行的整体效果,但如果出错则用这种方法很难查找到具体的出错位置,必须借助于单步运行工具,单步执行是每次执行一行即停止,可以看见当前程序运行的中间状态,两种方式都经常会用到。按下F11键或使用菜单STEP或相应的命令按钮可以单步执行程序,使用STEP OVER或功能键F10可以进行过程单步执行,进入如图1.8所示的界面,可以看见在源程序窗口的左边出现一个黄色的调试箭头,每执行单步一次,黄色箭头向下移一行。通过单步执行可以找出一些问题所在,但仅仅依靠单步执行来差图1.8错有时很困难,甚至有时效率会很低,有时通过过程单步执行、断点设置等几种方法联合调试来达到目的。另外在调试的过程中可以随时监视到各寄存器的状态,可以查看存储器的值,还可通过设置变量在观察窗口中观看变量值的变化。各监视窗口如图1.9所示。 寄存器窗口 Watches、Memory窗口图1.9在调试状态下,点击菜单Peripherals,可以打开弹片击中的资源,包括中断源、定时器计数器、串口以及P0、P1、P2、P3口的窗口一边观察它们的值。如图1.10所示。图1.103.2在线汇编技术在进入Keil的调试环境后,如果发现程序有错,可以直接修改源程序,但是要使修改后的程序代码有效,必须先退出调试环境,重新编译连接后在进入调试,但如果只是需要对某些程序行进行测试,或仅需对原程序进行临时的修改,这样的过程就显得有些麻烦,为此Keil软件提供了在线汇编的能力,将光标定位于需要修改的程序行上,用菜单Debug-Inline Assambly即可出现如图1.10所示的对话框。图1.11在Enter New后面的编辑框内直接输入要更改的程序语句,输入完后键入回车将自动指向下一条语句,可以继续修改,如果不再需要修改,可以点击右上角的关闭按钮关闭窗口。3.3断点设置程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的质、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步调试方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法断点设置。设置好断点后可以全速运行程序,一旦运行遇到断点就会停止运行,此时可以观察有关变量的值,寄存器的值已确定问题所在。设置/移除断点的方法是将光标定位到需要设置断点的程序行,使用菜单Debug-Insert/Remove BreakPoint设置或移除断点,也可以用鼠标在该行双击实现相同的功能;Debug-Enable/Disable BreakPoint是开启或暂停光标所在行的断点功能;Debug-Disable All BreakPoint暂停所有断点;Debug-Kill All BreakPoint清除所有的断点设置。这些功能也可以用工具条中相应的快捷按钮进行设置。断点调试窗口如图1.11所示。图1.12断点设置工具条如图所示。依次为设置/移除断点、取消所有断点、开启/关闭断点、关闭所有断点。4 实例下面通过实例讲解Keil软件的编程调试全过程例:将片内从40H开始的连续30个地址内容清零。ORG 0030HMOV R0,#30HMOV R1,#40HCLEAR: CLR AMOV R1,AINC R1DJNZ R0,CLEARSJMP $END项目二 Proteus软件快速入门一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有Proteus和Keil软件的微机。三、实训步骤:1、在Proteus软件中画原理图;2、Keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、 PROTUES ISIS设计与仿真平台1.1 ISIS窗口介绍在计算机上启动PROTUES ISIS后直接进入ISIS窗口如图2.1所示:仿真按钮对象预览窗口工具栏菜单栏编辑区对象选择器器件选择按钮图2.12.2 PROTUES 文件操作(1)文件的建立和保存如图所示,可以通过点击文件菜单(File)或工具按钮来新建、打开、保存设计文件。图2.2选择“File-New Design”菜单项,弹出如图2.3所示的新建设计(Creat New Design)对话框,对话框中有多种可供选择的模板,选择所需模板,单击“OK”按钮即可建立一个新的空白文件。通常系统默认模板为DEFAULT模板。如要保存设计文件,点击“File-Save Design”命令,输入文件名后点击保存按钮,注意保存的文件类型为Design File。图2.3(2)打开已保存文件选择“File-Load Design”菜单项或单击工具图标,弹出“Load ISIS Design File”对话框如图2.4所示,选择所要打开的文件即可。注意打开的是.DNS设计文件。图2.4(3) PROTUES文件类型PROTUES中的主要有以下文件类型设计文件(*.DSN),包含了一个电路所有的信息,最为常用。备份文件(*.DBK),保存覆盖现有设计文件时会产生文件备份。局部文件(*.SEC),设计图的一部分,可输出为一个局部文件,以后可以导入到其他的图中。在文件菜单中以导入(Import)导出(Export)命令来操作。模型文件(*.MOD)库文件(*.LIB),元器件和库。网表文件(*.SDF),当输出到PROSPICE and ARES时产生的网表文件,扩展名为.SDF。PROTEUS VSM中还有一些其他文件类型,可参看相关资料。2.3 PROTUES 库PROTUES的库相当丰富,有系统符号库和元件库,系统符号库有124个,其中有终端、模块端口、器件阴交等符号,可直接放置到原理图中,也可用来建立自己的元件模型,元件库大约有30个,每个苦又有许多模型,总共有大约8000多个,元器件库如图2.5所示:未指定模拟集成电路电容CMOS400系列接插件数字转换器调试工具二极管EL C10000系列电动机系列感应器Laplace原型存储器系列微处理器集成电路其他模型原型运放光电器件PLD FPGA电阻仿真原型喇叭音响开关继电器开关热离子真空管。图2.5PROTUES后期的版本不断的有元件库和模型库增加,会越来越完善。PRIOTUES部分模型举例:图2.6 部分单片机模型图2.7部分动态开关模型图2.8部分动态显示器模型2.4 单片机系统的PROTUES设计与仿真实例前面已对PROTUES软件做了简单的介绍,下面通过AT89C51单片机实例手把手的教你如何应用PROTUES软件对单片机系统进行仿真。AT89C51单片机有4个I/O端口,其中P1口为准双向口,其每一位口线都可以独立的作为输入或输出线使用,如图2.9所示:图2.9通过按钮控制实现D1、D2二极管灯的亮和灭,要求按下P1时,接P1.1的灯亮,否则接P1.0的灯亮,应用PROTUES对该电路进行仿真实现,具体实现步骤如下:(1) 打开PROTUES软件的ISIS Professional窗口,单击菜单命令“File-New Design”,新建一个DEFAULT模板,并且保存文件名为“P1口的简单应用.DSN”。(2) 单击器件选择按钮P,添加如下表2-1所列的元件。在ISIS编辑窗口中放置表2-1 P1口的简单应用所需元件单片机AT89C51电容CAP 30pF晶振CRYSTAL 12MHz电阻 RES按钮BUTTON发光二极管LED-BIBY发光二极管LED-BIGY元器件,在单击工具箱中的元件终端图标,在对象选择器中分别点击“POWER”和“GROUND”添加电源和地。(3) 放置好元器件到相应位置,布好线并且对图中的元件参数进行修改设置如图2.10所示。图2.10(4) 编写源程序在ISIS菜单中单击Source(源程序),弹出下拉菜单,点击“Add/Remove Source File”,弹出如图2.11所示的对话框,选择Code Generation Tool下拉菜单中的代码生成工具ASEM51,然后点击New按钮,在“P1口简单应用文件夹”下新建start.asm文件,单击是按钮,新建的start.asm源程序文件就添加到“Source Code Filename”下方框中。然后重新点击菜单“Source-start.asm”编写如下源程序并保存。P1口简单应用源程序清单:ORG 0030H MOV A,#0FFH MOV P1,A JNB P1.2,LOOP1LOOP: CLR P1.0 LCALL EXITLOOP1: CLR P1.1EXIT: NOP END图2.11(5) 汇编编译源程序、生成目标代码文件点击“Source-Build All”菜单命令编译源程序生成.HEX文件,如果有错则需根据编译提示来调试源程序,直到无错为止。注意此处要设置好目标代码生成工具,点击“Source-Define Code Generation Tool”设置如图2.12所示,选择好ASEM51的路径。图2.12(6) 加载目标代码文件、设置时钟频率在ISIS编辑窗口中双击AT89C51单片机芯片,再弹出的对话框中点击如图2.13所示的按钮,选择前面所生成的start.hex代码文件,再在Clock Frequency:栏中设置时钟为12MHz,点击“ok”即可。图2.13(7) PROTUES交互仿真代码装载完毕后即可进行仿真,只需点击运行仿真按钮,仿真运行结果如图2.14所示。图2.14项目三 模拟开关灯一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有Proteus和Keil软件的微机。三、实训步骤:1、在Proteus软件中画原理图;2、Keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:如图3.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。 2、电路原理图: 图3.13、程序设计内容: (1)开关状态的检测过程 单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。(2)输出控制 如图3.2所示,当P1.0端口输出高电平,即P1.01时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.00时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 4、程序框图:图3.25、汇编源程序:ORG 00H START:JB P3.0,LIG CLR P1.0 SJMP START LIG: SETB P1.0 SJMP START END 6、C语言源程序: #include sbit K1=P30; sbit L1=P10; void main(void) while(1) if(K1=0) L1=0; /灯亮 else L1=1; /灯灭 项目四 多路开关状态指示一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:如图4.1所示,AT89C51单片机的P1.0P1.3接四个发光二极管L1L4,P1.4P1.7接了四个开关K1K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。2、电路原理图:图4.13、程序设计内容: (1)开关状态检测对于开关状态检测,相对单片机来说是输入关系,可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。 (2)输出控制根据开关的状态,由发光二极管L1L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,1111XXXXB方法一次指示。 4程序框图:图3.3.25、方法一 汇编源程序ORG 00H START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A ORL A,#0F0H MOV P1,A SJMP START END 6、方法一 C语言源程序include unsigned char temp; void main(void) while(1) temp=P14 temp=temp | 0xf0; P1=temp; 7、方法二 编源程序ORG 00H START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1 NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2 NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3 NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4 NEXT4: SETB P1.3 NEX4: SJMP START END 8、方法二 C语言源程序#include void main(void) while(1) if(P1_4=0)P1_0=0;elseP1_0=1; if(P1_5=0)P1_1=0; elseP1_1=1; if(P1_6=0)P1_2=0; elseP1_2=1; if(P1_7=0)P1_3=0; elseP1_3=1; 项目五 广告灯的左移右移 一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:做单一灯的左移右移,硬件电路如图5.1所示,八个发光二极管L1L8分别接在单片机的P1.0P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0P1.1P1.2P1.3P1.7P1.6P1.0亮,重复循环。 2、电路原理图:图5.13、程序设计内容:我们可以运用输出端口指令MOV P1,A或MOV P1,DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。每次送出的数据是不同,具体的数据如下表1所示:4、程序框图: 图3.4.25、汇编源程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 6、 C语言源程序 #include unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) unsigned char m,n,s; for(m=20;m0;m-) for(n=20;n0;n-) for(s=248;s0;s-); void main(void) while(1) temp=0xfe; P1=temp; delay(); for(i=1;i8;i+) a=temp(8-i); P1=a|b; delay(); for(i=1;ii; b=temp(8-i); P1=a|b; delay(); 项目六 广告灯(利用取表方式)一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)2、电路原理图: 图6.14、程序设计内容:在用表格进行程序设计的时候,要用以下的指令来完成 (1)利用MOV DPTR,DATA16的指令来使数据指针寄存器指到表的开头。 (2)利用MOVC A,ADPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用MOVC 工,ADPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示: 5、程序框图: 图6.26、汇编源程序 ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,A+DPTR CJNE A,#01H,LOOP1 JMP START LOOP1: MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR JMP LOOP DELAY: MOV R4,#20 D1: MOV R5,#248 DJNZ R5,$ DJNZ R4,D1 DJNZ R3,DELAY RET TABLE: DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 0FEH,0FDH,0FBH,0F7H DB 0EFH,0DFH,0BFH,07FH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 07FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H, 0FFH,00H, 0FFH DB 01H END 7、C语言源程序 #include unsigned char code table=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x7f,0xbf,0xdf,0xef, 0xf7,0xfb,0xfd,0xfe, 0x00,0xff,0x00,0xff, 0x01; unsigned char i; void delay(void) unsigned char m,n,s; for(m=20;m0;m-) for(n=20;n0;n-) for(s=248;s0;s-); void main(void) while(1) if(tablei!=0x01) P1=tablei; i+; delay(); else i=0; 项目七 报警产生器一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。 2、电路原理图: 图7.13、程序设计内容: 信号产生的方法,500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次; 4、程序框图 图7.25、汇编源程序: FLAG BIT 00H ORG 00H START: JB P1.7,START JNB FLAG,NEXT MOV R2,#200 DV: CPL P1.0 LCALL DELY500 LCALL DELY500 DJNZ R2,DV CPL FLAG NEXT: MOV R2,#200 DV1: CPL P1.0 LCALL DELY500 DJNZ R2,DV1 CPL FLAG SJMP START DELY500: MOV R7,#250 LOOP: NOP DJNZ R7,LOOP RET END 6、C语言源程序: #include #include bit flag; unsigned char count; void dely500(void) unsigned char i; for(i=250;i0;i-) _nop_(); void main(void) while(1) if(P1_7=0) for(count=200;count0;count-) P1_0=P1_0; dely500(); for(count=200;count0;count-) P1_0=P1_0; dely500(); dely500(); 项目八 I/O并行口直接驱动LED显示一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务:如图13所示,利用AT89S51单片机的P0端口的P0.0P0.7连接到一个共阴数码管的ah的笔段上,数码管的公共端接地。在数码管上循环显示09数字,时间间隔0.2秒。 2、电路原理图:图8.13、程序设计内容: (1) LED数码显示原理 七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED数码管的ga七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见下表:“0” 3FH “8” 7FH “1” 06H “9” 6FH “2” 5BH “A” 77H “3” 4FH “b” 7CH “4” 66H “C” 39H “5” 6DH “d” 5EH “6” 7DH “E” 79H “7” 07H “F” 71H (2) 由于显示的数字09的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字09的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 4、程序框图 图8.25、汇编源程序 ORG 0 START: MOV R1,#00H NEXT: MOV A,R1 MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A LCALL DELAY INC R1 CJNE R1,#10,NEXT LJMP START DELAY: MOV R5,#20 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 6、C语言源程序 #include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char dispcount; void delay02s(void) unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); void main(void) while(1) for(dispcount=0;dispcount10;dispcount+) P0=tabledispcount; delay02s(); 项目九 按键识别方法之一一、实训目的与要求:1、认识Proteus软件;2、掌握用Proteus软件软件建立文件;3、掌握如何使用Proteus软件元件库;二、实训场地、设备、仪器、工具:安装有proteus和keil软件的微机。三、实训步骤:1、在proteus软件中画原理图;2、keil软件下编写源程序并编译形成可执行文件.hex;3、载源程序;4、仿真。四、实训内容:1、实验任务: 每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。 2、电路原理图:图9.13、程序设计方法: 其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如图3.8.2所示:图9.2从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论