博文

【016】中断的应用中对断点的保护 [51](2006-08-22 20:37:00)

摘要:实验参考: 笨笨工作室-实验八、按键控制跑马灯(中断)。(查看)
实验板:   FB51A。(查看)

实验目的: <1> 掌握堆栈在中断程序中的作用。
     <2> 掌握让程序保护现场的方法。

实验现象: 二极管作左右跑马灯,当按下外部按键 K1 时, 8 个二极管全部闪烁 5 次后从 K1 按下之前的位置继续作跑马灯。 在应用中断时,若主程序在正常运行的过程中响应了中断就要转而去执行中断服务程序。那如何在执行完中断服务程序之后完全恢复原来的主程序呢?这就需要在执行中断服务程序之前将相关的状态保护起来,在中断完成后再将这些状态恢复,从而继续执行主程序。

51单片机中允许我们从内部 RAM 中指定一个空间专门保存这些断点处的状态,这个空间就是堆栈。并且还专门给了我们一个 8 位的堆栈指针,让我们用它来开辟堆栈空间。例如我们给堆栈指针赋值: mov sp, #70h ,就表示我们把内部数据 RAM 的地址为 70H 开始的单元设为堆栈。 MCS-51的片内存储器(RAM)共有256字节,高128字节是特殊功能寄存器,地址范围80H~FFH。这一部分可看作系统资源,不能随便利用。而剩下的低128字节区分如下:

──┬────────────┐
 7FHㄧ       用户RAM区        ㄧ
    ㄧ (数据缓冲区、堆栈区) ㄧ
 30Hㄧ        80 byte         ㄧ
──┼────────────┤
 2FHㄧ      可位寻址区        ㄧ
 20Hㄧ    &nb......

阅读全文(5200) | 评论:0

【015】中断方式按键 [51](2006-08-09 11:47:00)

摘要:实验参考: 笨笨工作室-实验七、中断方式按键。(查看)
实验板:   FB51A。(查看)

实验目的: <1> 掌握中断方式响应按键的原理。
     <2> 掌握中断服务程序的具体编写:如何进行键的识别,如何去抖动。

实验现象: 最右面的数码管初始显示0,每次按下外部按键K1执行加一,计数到9时重新回0。 单片机响应外部按键的方式有两种,一种是查询方式,一种是中断方式。

查询方式:单片机不断的查询是否有按键按下,如果有按键按下的话,就执行相应的程序,否则继续查询。

中断方式:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求。单片机停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作。

关于查询方式实现上述过程参见【013】查询方式按键。当单片机工作于查询方式的时,要不间断的对外部按键进行查询,其间单片机不能干其他的任何工作,CPU的大量时间可能会浪费在原地踏步的查询操作上。为进一步提高单片机的工作效率,这里采用中断方式。其过程为:单片机执行主体程序,如果有按键按下,向单片机发出中断请求,单片机就会停下现在正在处理的工作,转去执行中断处理程序,执行完后回来继续刚才的工作;如果没有按键按下,单片机就作自己的工作,不理睬外部键盘。

这里又涉及到了中断源的概念,中断源用于发出中断请求。MCS-51单片机的中断系统有5个中断请求源:2个外部中断请求INT0和INT1,2个片内定时/计数器T0和T1的计满溢出中断,还有一个是片内串行口中断请求TI或者RI。在本试验中,用外部中断INT1。

显示部分电路图:


键盘部分电路:
由图可以看到, 当任何一个按键按下的时候,P3.3引脚,即INT1上就会出现一个低电平,向单片机发出中断申请。如果单片机开放了外部中断,就响应中断请求,进入中断服务程序。单片机中断是否开放由特殊功能寄存器IE控制。在单片机内部256字节的数据RAM的高128字节(80h~ffh)是特殊功能寄存器区。PSW在这个区域,IE也在这个区域,叫做“中断允许寄存器”,专门负责程序是否响应中断的,IE的字节地址为A8H,可进行位寻址。各......

阅读全文(11695) | 评论:7

【014】外中断0响应实例 [51](2006-06-29 22:15:00)

摘要:实验参考: 《单片机轻松入门》(周坚)
实验板:   FB51A。(查看)
方法: 通过按键模拟外部中断的产生信号,用P0.0口接的LED作为中断响应。
实验现象:键按下时,P0.0口的LED亮灭交替。 电路如下: 在程序中,将中断0设置为下降沿触发:


       org   0000h
       ajmp  start
       org   0003h     ; 外部中断地址入口
       ljmp  int_0     ; 转到真正的处理程序
       org   30h
start: mov  sp, #5fh   ; 初始化堆栈
       mov  p0, #0ffh  ; 灯全灭
       mov  p3, #0ffh  ; P3口置高电平
       setb IT0        ; 下降沿触发
       setb EA         ; 开总中断
       setb EX0    ......

阅读全文(4429) | 评论:2

【013】查询方式按键 [51](2006-06-25 00:57:00)

摘要:实验参考: 笨笨工作室-实验六、查询方式按键。(查看)
实验板:   FB51A。(查看)

实验目的: <1> 掌握读取外部按键时候应该注意的事项,掌握查询方式响应按键的方法。
     <2> 掌握读取按键去抖动的方法。
      <3> 掌握判直接寻址位转移指令jb,jnb的用法。

实验现象: 最右面的数码管初始显示0,每次按下外部按键K1执行加一,计数到9时重新回0。 单片机响应外部按键的方式有两种,一种是查询方式,一种是中断方式。

查询方式:单片机不断的查询是否有按键按下,如果有按键按下的话,就执行相应的程序,否则继续查询。

中断方式:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求。单片机停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作。

本实验是用查询方式完成, 只用到一个键K1,每次按下,使第一位数码管加1显示,计数到9里重新回0。显示部分电路及查表显示方法参考:【005】数码管显示数字 和 【006】多位数码管动态显示。原理图如下:
由原理图知:当按键k1按下的时候,对应P1.0输入低电平。因此,我们要查询k1是否按下,只要检测到p1.0是低电平即可。 在查询键是否按下时,要注意按键的去抖动问题,关于键的消抖,见 【012】按键消抖 。 按上述方法编写程序:

        org   0000h
start:  mov   p0, #48h       ; 段码-显示0
        mov   p2, #01h       ; 位码-选通第一位数码管 main:   mov   r7, #0ffh  ......

阅读全文(5524) | 评论:4

【012】按键消抖(2006-06-23 19:29:00)

摘要:参考: 《单片机原理及接口技术》(李朝青) 按键电路:常用的非编码键盘,每个键都是一个常开开关电路。


按键消抖:

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。

<1> 硬件消抖:在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。

图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。

<2> 软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。......

阅读全文(7224) | 评论:0

【011】单片机开发中应掌握的原则(2006-05-28 16:59:00)

摘要:选自《单片机语言C51应用实战集锦(修订版)》(范风强)     在学习新的开发软件时,一定要先看帮助手册,买书要全面。多实践、焊电路板、编写以及调试,如只用软件模拟,与真正的实践还是有距离的。 一、总的原则     从技术的角度来看,单片机开发分为软件、硬件两部分。许多厂商在仿真机、编程器之后力推开发板,其目的就是要让开发者在开发过程中尽量少做硬件的工作,甚至不需要做硬件开发工作。这些板通常力求全面,功能很多,设计者把所有的功能都做上,用户要用什么功能就有相应的电路板。在进行开发时,总的原则是:     <1> 定位准确。应用目标锁定在什么层次、什么类型,需要哪些功能,不需要做的就不必花钱去做。     <2> 经过实践检验。所采用的技术必须是经过实践检验的成熟技术,这一点很重要。     <3> 简单性原则。如果所做的就是开关量控制,不涉及模拟量,就不必采用模拟量技术。如果能够用单片机实现的技术,就不要用外围电路去实现。尽量做到小型、简单、可靠、廉价。     <4> 使用单片机C语言编程。C语言是简洁、高效、而又最贴近硬件的高级编程语言。20世纪90年代初单片机C语言就已成熟为专业水平的高级语言,不应再有顾虑。当前厂商在推出新的单片机产品时纷纷配套C语言编译器。     <5> 如有可能,使用中、高档的单片机仿真工具。 二、软件原则     <1> 提高C语言编程代码的效率     用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译后对应的汇编语言的语句行数,这样就可以很明确地知道效率。在今后编程的时候,使用编译效率最高的语句。
    各厂家的C编译器都会一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言写的同样功能的程......

阅读全文(3605) | 评论:0

【010】单片机中编程的方法和技巧(2006-05-26 21:12:00)

摘要:选自《单片机原理及及接口技术(简明修订版)》(李朝青)
一、模块化的程序设计方法 1. 程序功能模块化的优点     实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示、打印等。采用模块化的程序设计方法,有下术优点:

    <> 单个模块结构的程序功能单一,易于编写、调试和修改;
    <> 便于分工,从而可使多个程序员同时进行程序的编写和调试,加快软件研制进度;
    <> 程序可读性好,便于功能扩充和版本升级;
    <> 对程序的修改可局部进行,其他部分可以保持不变;
    <> 对于使用频繁的子程序可以建立子程序库,便于多个模块调用。 2. 划分模块的原则     在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,把一些专用的子任务交由下一级即第二级子模块完成,这时也需要弄清楚它们之间的相互关系。按这种方法一直细分成易于理解和实现的小模块为止。
    模块的划分有很大的灵活性,但也不能随意划分。划分时应遵循下述原则:     <1> 每个模块应具有独立的功能,能产生一个明确的结果,这就是单模块的功能高内聚性。
    <2> 模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换(传递)方式、交换量的多少及交换的频繁程度。
    <3> 模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,信息交换太频繁......

阅读全文(4053) | 评论:3

【009】一位数码管循环计数 [51](2006-05-02 17:28:00)

摘要:实验目的:1位数码管从0到9循环计数,间隔1s。
实验板: FB51A(查看)。 该实验用到实验板的资源电路图如下: 其中P0口是段码,低电平有效。P2口是位码,高电平有效。P2.0口控制第1个数码管,一直到P2.7口控制第8个。该板的段码表如下:

┌─────┬────────────────┬────┐
ㄧ          ㄧ P0.*:  7  6  5  4  3  2  1  0  ㄧ P0口值 ㄧ
ㄧ 十进制数 ㄧ  段 :  d dp  e  c  g  b  f  a  ㄧ 即段码 ㄧ
├─────┼────────────────┼────┤
ㄧ    0     ㄧ        0  1  0  0  1  0  0  0  ㄧ  48H   ㄧ
ㄧ    1     ㄧ        1  1  1  0  1  0  1  1  ㄧ  ebH   ㄧ
ㄧ    2     ㄧ        0  1  0  1  0  0  1  0  ㄧ  52H   ㄧ
ㄧ    3     ㄧ        0  1  1  0  0  0  1  0  ㄧ &n......

阅读全文(4674) | 评论:9

【008】Proteus 第一次亲密接触(2006-04-26 20:56:00)

摘要:关于Proteus, 查看简介。
实验方案用的是【004】流水灯实验。(查看)

用Proteus搭建的电路图如下:
所用汇编程序如下:

       org    0000h
       mov   a,#0feh
loop:  mov   p0,a
       lcall delay
       rl    a
       ajmp  loop

delay: mov   r7,#100       ;djnz为二周期指令,机器周期为振荡周期的12倍.所以延时时间为:
temp1: mov   r6,#02h       ;100×2×255×2×12×(1/12) =100ms,
temp2: mov   r5,#0ffh
       djnz  r5,$
       djnz  r6,temp2
       djnz  r7,temp1
       ret
end

用Keil编译,将生成的HEX文件载入电路中的MCU,仿真结果如下(红为高电平,蓝为低电平):
★ 关注Proteus有一段时间了,今天......

阅读全文(5531) | 评论:0

【007】Proteus 简介(2006-04-24 20:31:00)

摘要:    Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,您不需要别的,Proteus为您建立了完备的电子设计开发环境!尤其重要的是Proteus Lite可以完全免费,也可以花微不足道的费用注册达到更好的效果;功能最强的Proteus专业版也非常便宜,人人用得起,对高校还有更多优惠。     Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于15年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“The Route to PCB CAD”。Proteus 产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。     其功能模块:—个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真; ARES PCB设计.     PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型. >> 支持许多通用的微控制器,如PIC,AVR,HC11以及8051.
>> 交互的装置模型包括:LED和LCD显示,RS232终端,通用键盘,
>> 强大的调试工具,包括寄存器和存储器,断点和单步模式
>> IAR C-SPY 和Keil uVision2等开发工具的源层调试
>>......

阅读全文(8483) | 评论:1