单片机中有一个不定时c 随时间变换的数值值,我想记录它变换的次数(每变换一次k加一),程序应该怎样写?求教

单片机原理及应用复习资料
&&&&单片机原理、接口及应用 51系列单片机内部结构如图1-1所示。 1.1.2 cpu cpu是单片机的核心部件。它由运算器和控制器等部件组成。 1. 运算器 运算器的功能是进行算术运算:加、减、乘、除、加1、减1、比较、bcd码 十进制调整等 逻辑运算:与、或、异或、求反、循环等逻辑操作 位操作:内部有布尔处理器,它以进位标志位c为位累加器,用来处理位操作。 可对位置 “1”、对位&&&&清零 、位判断等。 操作结果的状态信息送至状态寄存psw。 2.程序计数器pc 程序计数器pc是16位的寄存器,用来存放即将要执行的指令地址,可对64kb程 序存储器直接寻址。执行指令时,pc内容的低8位经p0口输出,高8位经p2口输出。 3.指令寄存器 指令寄存器中存放指令代码。cpu执行指令时,由程序存储器中读取的指令代 码送入指令存储器,经指令译码器译码后由定时与控制电路发出相应的控制信号, 完成指令功能。 1.2 存 储 器 mcs-51的储存器结构与常见的微型计算机的配置方法不同,它将程序存储器和 数据存储器分开,各有自己的寻址方式、控制信号和功能。 程序存储器用来存放程序和始终要保留的常数。 数据存储器存放程序运行中所需要的常数和变量。 从物理空间看,mcs-51有四个存储器地址空间: 片内数据存储器、片外数据存储器 片内程序存储器、片外程序存储器 mcs-51存储器物理结构见下图所示: 引脚 ea 的接法决定了程序储存器的0000~0fffh 4kb地址范围是在单片机片 内还是片外。 1.2.1 程序储存器 程序存储器用来存放编制好的始终保留的固定程序和表格常数。程序储存器以程 序计数器 pc 作为地址指针,通过16位地址总线,可寻址的地址空间为64kb。 在c51 片内,分别内置最低地址空间的4kb rom/eprom程序储存器 (内部程序储存器),而在8031片内,则无内部程序储存器,必须外部扩展 eprom。mcs-51单片机中64kb内、外程序储存器的地址是统一编排的。 8031单片机无内部程序存储器,地址从0000h~ffffh都是外部程序存储空间。 应 始终接地, 对于内部有rom的单片机(51、52系列) , 引脚接高电平,使程序从内部rom开 始执行。当pc值超出内部rom的容量时,会自动转向外部程序存储器空间。外 部程序存储器地址空间为1000h~ffffh。 访问程序存储器使用movc指令。 程序存储器中的几个特殊地址的使用: 地址 用途 0000h 复位操作后的程序入口 0003h 外部中断0服务程序入口 000bh 定时器0中断服务程序入口 0013h 外部中断1服务程序入口 001bh 定时器1中断服务程序入口 0023h 串行口中断服务程序入口 由于两入口地址之间的存储空间有限,因此在编程时,通常在这些入口地址 开始的两三个地址单元中,放入一条转移类指令,已使相应的程序转到指定的 程序存储器区域中执行。 1.2.2 外部数据存储器 用于存放随机读写的数据。 外部i/o口地址影像区。 mcs-51单片机的外部数据存储器和外部i/o口实行统一编址 ,并使用相同的 作选通控制信号,均使用 movx 指令访问。 mcs-51 单片机最多可扩展64kb外部数据存储器 1.2.3 内部数据储存器 内部数据存储器是使用最多的地址空间,存放随机读写的数据 通用寄存器区 堆栈区 运算操作数存放区 指令(算术运算、逻辑运算、位操作运算等)的操作数只能在此地址空间或功能 寄存器地址空间。 内部数据存储器的地址分配 51 系列单片机内部数据存储器地址范围为00~7fh。各区域地址见下表。 (1)地址 0~1fh的前32个单元称为寄存器区 用途:① 作通用寄存器r0~r7。 ② r0与r1可作间址寄存器使用。 使用时应注意: 32个单元的寄存器区分为四组,使用时只能选其中一组寄存器。 寄存器的选组由程序状态字psw的rs1和rs0位定。 rs1 rs0 选寄存器组0 0 0组 0 1 1组 1 0 2组 1 1 3组 初始化时或复位时,自动选中0组。 一旦选中一组,其它三组只能作为数据存储器使用,而不能作为寄存器使用。 设置多组寄存器可以方便保护现场。 (2)20h~2fh为位地址区 共16个单元,每单元有八个位,每位有一个位地址,共128位,位地址范围 为00h~7fh,该区既可位寻址,又可字节寻址。 如 mov 20h,c (这里c是cy进位标志位),该指令是将cy内容送20h位,如果cy= 1,位20h值为“1”。 (3)除选中的寄存组以外的存储器均可以作为通用ram区。 (4)堆栈区 8xx51单片机的堆栈设在内部ram区,深度不大于128字节,初始化时sp指向 07h。 注: 对51基本型单片机只有00h-7fh单元128字节的ram区。对52增强型的 单片机还有80h-ffh组成的高128字节ram区(共256字节ram )。 1.3特殊功能寄存器 mcs-51单片机共有21个字节的特殊功能寄存器用英文缩写sfr (special fuction register)表示。 1.用途: a 累加器、状态标志寄存器 单片机内部各部件专用的控制、状态寄存器 并行口、串行口影射寄存器 2.地址空间: 21个特殊功能器不连续的分布在80h~ffh 128个字节地址空间,见表1-2。 地址为x0h和x8h是可位寻址的寄存器,表1-2中用“*”表示。表1-2中还标注了各sfr的名称、字节地址、可寻址位的位地址和位名称。 21个特殊功能寄存器的名称及主要功能介绍如下, 详细的用法见后面各节 的内容。 a—累加器,自带有全零标志z,a=0则z=1;a≠0则z=0。该标志常用于程序分 支转移的判断条件。 b—寄存器,常用于乘除法运算(见第2章)。 psw—程序状态字。主要起着标志寄存器的作用,其8位定义见表1-3。其中 cy:进/借位标志 反映最高位的进位借位情况,加法为进位、减 cy=1,有进/借位 ; cy=0,无进/借位。 ac:辅助进/借位标志 反映高半字节与低半字节之间的进/借位, ac=1有进/借位; ac=0无进/借位 。 fo:用户标志位。可由用户设定其含义。 rs1,rs0:工作寄存器组选择位。法为借位。ov:溢出标志 反映补码运算的运算结果有无溢出 有溢出 ov=1,无溢出ov=0。 -:无效位。 p:奇偶标志 运算结果有奇个“1”,p=1;运算结果有偶个“1”,p=0。 影响标志位的指令及其影响方式见第2章。 sp—堆栈指针。8xx51单片机的堆栈设在片内ram, 对堆栈的操作包括压入(push)和弹出(pop)两种方式,并且遵循后进先出的 原则,但在堆栈生成的方向上,与8086正好相反8xx51单片机的堆栈操作遵循 先加后压,先弹后减的顺序,按字节进行操作。此外还有如下寄存器,它们将在后面章节介绍: ip——中断优先级控制寄存器。 ie——中断允许控制寄存器。 tmod——定时器/计数器方式控制寄存器。 tcon——定时器/计数器控制寄存器。 th0,tl0——定时器/计数器0。 th1,th1——定时器/计数器1。 scon——串行端口控制寄存器。 sbuf——串行数据缓冲器。 pcon——电源控制寄存器。 注: 在52子系列中,高128字节ram和sfr的地址是重叠的,究竟访问哪一块可 通过不同的寻址方式加以区分,访问高128字节ram采用寄存器间址,访问sfr 则只能采用直接寻址,访问低128字节ram时,两种寻址均可采用。 1.4时钟电路与复位电路内部振荡方式: 在引脚 xtal1和 xtal2外接晶体振荡器(简称晶振)如图1-3所示。 由于单片机内部有一个高增益运算放大器,当外接晶振后,就构成了自激振荡 器并产生振荡时钟脉冲。 1.4.2 基本时序单位 单片机的时序单位有: 。 状态周期:振荡频率经单片机内的二分频器分频后提供给片内cpu的时钟周期。因 此,一个状态周期包含2个振荡周期。 机器周期(mc):1个机器周期由6个状态周期及12个振荡周期组成。是计算机执行 一种基本操作的时间单位。rom;8751为eprom;89c51内部为flash eeprom)。 128字节ram数据存储器。 两个16位定时器/计数器。 可寻址64kb外部数据存储器和64kb外部程序存 储器空间的控制电路。 32条可编程的i/o线(四个8位并行i/o端口)。 一个可编程全双工串行口。 具有两个优先级嵌套中断结构的五个中断源。 ★ 掌握51系列单片机各存储空间的地址分配,使用特点及数据操作方法。现将此 内容归纳于教材表1-5中,此表是编程和硬件扩展的基础,相当重要,务必要熟 记和掌握。 mcs-51单片机的编程语言可以是汇编语言也可以是高级语言(如c语言),高级语 言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目标程序 简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级 语言还是汇编语言, 源程序都要转换成目标程序 (机器语言) 单片机才能执行。 目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换 程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜 单就可以完成上述的各步,如wave、 keil ,wave集成软件的使用见附录。4种时序单位中,振荡周期和机器周期是单片机内计算其他时间值(例如,波 特率、定时器的定时时间等)的基本时序单位。 例:单片机外接晶振频率12mhz时的各种时序单位: 振荡周期=1/fosc=1/12mhz=0.0833us 状态周期=2/fosc=2/12mhz=0.167us 机器周期=12/fosc=12/12mhz=1us 指令周期=(1~4)机器周期=1~4us 上电后,由于电容充电,使 rst持续一段高电平时间。当单片 机已在运行过程中时,按下复位键 也能使 rst持续一段时间的高电平,从而实现上电且开关复位的操作。通常选择 c=10f ,r=10k。 单片机的复位操作是使sfr寄存器进入初始化,不改变片内ram区中的内容。 几个主要特殊功能寄存器复位状态归纳如下: pc=0000h 程序计数器为零表明单片机复位后程序从0000h地址单元开始执 行。 a=00h 表明累加器已被清零。 psw=00h 表明选寄存器0组为工作寄存器组。 sp=07h 表明堆栈指针指向片内ram 07h单元,根据堆栈操作的先加后 压法则,第一个被压入的数据被写入08h单元中。 p0~p3=ffh 于输出。 表明已向各端口线写入1,各端口既可 用于输入又可用汇编的方法:汇编的方法有两种1.手工汇编:人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。2.机器汇编:用计算机中的汇编程序对用户源程序进行汇编。用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令 指定。记住一些特殊功能寄存器复位后的主要状态,对于熟悉单片机操作, 减短应用程序中的初始化部分是十分必要的。 其它的特殊功能寄存器复位后的状态见教材表1-4。 1.5 引脚功能 各个引脚的功能说明如下: vss:接地端。 vcc:电源端,接+5v。 xtal1,xtal2: 接外部晶体或外部时钟。 rst/vpd:①复位信号输入。 ②接备用电源,当vcc掉电后,在低功耗条件下保持内部ram中的数据。 ale/prog: ①ale 地址锁存允许。 ale输出脉冲的频率为振荡频率的1/6。 ②prog 对8751单片机片内 eprom 编程时,编程脉冲由该引脚引入。 psen:程序存储器允许。输出读外部程序存储器的选通信号。 ea/vpp: ① ea =0,单片机只访问外部程序存储器。 ea =1,单片机访问内部程序存储器。 ②在8751单片机片内eprom编程期间,此引脚引入21v编程电源vpp。 在增强型的52系列单片机中,p1.0、p1.1除为端口线外,还为定时/计数器2的 外部引脚 t2和t2ex。 p0.0~p0.7:p0口,数据/低八位地址复用总线端口。 p1.0~p1.7:p1口,静态通用端口。 p2.0~p2.7:p2口,高八位地址总线端口。 p3.0~p3.7:p3口,双功能静态端口。1.6 小单片机是集cpu、存储器、i/o接 口于一体的大规模集成电路芯片。mcs-51系列单片机是目前市场上应用最广泛的 单片机机型。 本章重点是单片机的内部结构和存储器结构 51系列单片机内部包含: 一个8位的cpu。 4kb程序存储器rom(视不同产品型号不同:8031内部无rom;8051内部为掩模式1)确定程序中每条汇编语言指令的指令机器码 2)确定每条指令在存储器中的存放地址 3)提供错误信息 4)提供目标执行文件(*.obj/*.hex)和列表文件(*.lst) 二.伪指令 常用伪指令及功能: 1.起始指令 org nn 功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始 地址,连续存放在程序存储器中。 指令地址 机器码 源程序 org h 78 30 main: mov r0,#30h 2002h e6 mov a,@r0 … 3. 字定义 标号:dw (字常数或表达式) 作用: 指示在程序存储器中以标号为起始地址 的单元里存放的数为字数据(即16位的二进制数),例如: gh :dw 1234h,5678h,08 5. 等值指令 标号 equ(数值表达式) 表示equ两边的量等值,用于为标号或标识符赋值。 例如: x1 equ 2000h x2 equ 0fh … main: mov dptr,#x1 ; dptr=2000h a,#x2 ; a=a+0fh 6. 位定义 标号 bit [位地址] 作用: 同equ指令,不过定义的是位操作地址。 例如 aic bit p1.1。 汇编语言程序设计步骤 一.确定方案和计算方法add 二.了解应用系统的硬件配置、性能指标 三.建立系统数学模型,确定控制算法和操作步骤 四.合理分配存储器单元和了解i/o接口地址 常用程序结构 顺序程序、分支程序、 循环程序、子程序 顺序程序设计 例3-1 编程将外部数据存储器的000eh和000fh单元的内容相换。 org 0000h mov p2, #0h mov r0, #0eh mov r1, #0fh movx a, @r0 mov 20h, a movx a, @r1 xch a, 20h movx @r1, a mov a, 20h movx @r0, a sjmp $ end;送地址高八位至p2口 ;r0= 0r1=a=(000eh) ;(20h)=(000eh) ;a=(000fh) ; a=(000eh),(20h)=(000fh);交换后的数送各单元0 next: push acc movc a,@a+dptr cjne a,b,agan pop acc rl a 分支表内偏移量 mov dptr,#jpt jmp @a+dptr agan: pop acc inc a cjne a,#5,next sjmp $ 按键编码程序结束 jpt: ajmp pr0 ajmp pr1 ajmp pr2 ajmp pr3 ajmp pr4 tab: db 3ah,47h,65h,70h,8bh end;a=键码表的编码 ;将b中值和键码表的值比较 ;如相等,序号乘2得 ;置分支表首址 ;不相等比较下一个 ;序号加1 ;键码查完还没有b中 ;分支转移表;键码表3.3 顺序程序设计 顺序程序(简单程序),程序走向只有一条路径 例3-3 分解压缩式bcd码,使其成为非压缩式bcd码。 org 0000h mov r0,#40h ;设指针 mov a,@r0 ;取一个字节 mov r2,a ;暂存 anl a,#0fh ;清0高半字节 inc r0 mov @r0,a ;保存数据个位 例2 用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出 的重量以10kg为1个计价单位g , g已存入40h单元。计价方法 为50kg以内按3元, 50kg以上 分段计价: 50kg按3元计价 ,超过部分按2元计价。 由此列出算式:例 3-9 设计一个延时10ms的延时子程序,已知单片机使用的晶振为6mhz。 分析 : 延时时间与两个因素有关:晶振频率和循环次数。由于晶振采用6mhz, 一个机器周期是2μs,用单循环可以实现1ms延时,外循环10次即可达10ms延 时。 内循环如何实现1ms延时呢,程序中可先以未知数mt代替,从附录a查 每条指令机器周期计算程序的执行时间。1. 利用转移地址表实现转移 例3-7 根据r3的内容转向对应的程序,r3的内容为0~n,处理程序的入口符号地 址分别为pr0~prn (n&128)。 分析:将pr0—prn入口地址列在表格中,每一项占两个单元,prn在表中的偏移量 为2n,因此将r3的内容乘2即得prn在表中的偏移地址,从偏移地址2n和2n+1 两个单元分别取出prn的高八位地址和低八位地址送dptr寄存器,用jmp @a+dptr指令(a先清零)即转移到prn入口执行。 org 0000h mov a,r3 ;r3→a add a,a*2 mov dptr,#tab push acc movc a,@a+取地址表中高字节 mov b,暂存于b inc dpl pop acc movc a,@a+取地址表中低字节 mov dpl,a mov dph,dptr为表中地址a=0 jmp @a+转移 tab:dw pr0,pr1,pr2,…..,转移地址表 end 2. 利用转移指令表实现转移 例3-8 设有五个按键 0、1、2、3、4其编码分别为3ah、47h、65h、70h、 8bh,要求根据按下的键转向不同的处理程序,分别为pr0 、pr1 //pr2、pr3、 pr4,设按键的编码已在b寄存器中,编出程序。 ajmp pr0的机器码为2110h, pr1入口地址为0220h ajmp pr1的机器码为4120h, 转移指令表jpt的内容如下所示。设b=65h,键值为2: org 0000h mov dptr,#tab mov a,#0org 0020h mov r0,#0ah ;外循环10次 dl2: mov r1,#mt ;内循环mt次 dl1: nop nop ;空操作指令 djnz r1,dl1 djnz r0,dl2 ret 例3-10 编写多字节数×10程序。 内部ram以20h为首址的一片单元中存放着一个多字节符号数, 字节数存 放在r7中,存放方式为低位字节在低地址,高位字节在高地址,要求乘10后的积仍 存放在这一片单元中。 分析 用r1作该多字节的 地址指针,部分积的低位仍 存放于本单元,部分积的高 位存放于r2,以便和下一 位的部分积的低位相加。 以r7作字节数计数。 编程如下:org 0000h clr c ;清进位位c mov r1,#20h ;r1指示地址 mov r2,#00h ;存积的高八位寄存器r2清0 s10:mov a, @r1 ;取一字节送a mov b,#0ah ;10送b push psw mul ab ;字节乘10 pop psw addc a,r2 ;上次积高八位加本次积低八位 mov @r1,a ;送原存储单元 mov r2,b ;积的高八位送r2 inc r1 ;指向下一字节 djnz r7,s10 ;未乘完去sh10,否则向下执行 mov @r1,b ;存最高字节积的高位 sjmp $例如 1223650989 比较大小;置键码表首址 ;表的起始位的偏移量为mcs-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑 运算.这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要 多花运算时间。 例3-17 编写一程序,以实现图3-4中的逻辑运算电路. 程序如下: start:mov c,p2.2 orl c,tf0 anl c,p1.1 mov f0,c mov c,ie1 orl c,/25h anl c,f0 anl c,/26h mov p1.3,c sjmp $ 例3-18 设累加器a的各位acc.0~acc.7分别记为x0~x7, 编制程序用软件实现下 式: y=x0x1x2+x0 x1 x2+x0x1x2x3+x4 x5 x6x7 acc.0 acc.1 acc.2 acc.3 acc.4 acc.5 acc.6 acc.7x0 x1 x2 x3 x4 x5 x6 x7bit bit bit bit bit bit bit bitmov 33h,a mov a,#0 addc a,#0 mov 34h,a sjmp $ 子程序: org 0030h sqr:inc a movc a,@a+pc ret tab: db 00h,01h,04h db 09h 16h,25h, db 36h,49h64h,81h end 3.8 小 结 1、程序设计的关键在于指令熟悉和算法(思路)正确、清晰,对复杂的程序应先画出 流程图。只有多做练习多上机调试,熟能生巧,才能编出高质量的程序。 2、伪指令是非执行指令,提供汇编程序以汇编信息,应正确使用。 3、本章应掌握顺序程序、分支程序、循环程序、子程序等各类程序的设计方法, 并能熟练应用查表技术简化程序的设计。 po口—1.作为输入/输出口。 2.作为地址/数据总线 ,接外围芯片时po口分时输出低 8 位地址与数据 信号。 p1口—1.作为输入/输出口。 2.在增强型(52系列)和isp型(在系统编程型)中有如下功能:org 0000h mov c,x0 anl c,x1 anl c,x2 mov 00h,x0x1x2 mov c,x0 anl c,/x1 mov 01h,x0x1 anl c,/x2 orl c,00h mov 00h,c mov c,x2 anl c,01h anl c,x3 ;x0x1x2x3 orl c,/00h mov 00h,c mov c,x7 anl c,/x6 anl c,/x5 anl c,/x4 ; x4 x5 x6 x7 orl c,00 最终结果 y→c sjmp $ 子程序是构成单片机应用程序必不可少的部分,通过acall和lcall 两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。 子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子 程序,是程序设计的重要技巧之一。 子程序必须以ret指令结尾. 在调用子程序时,有以下几点应注意:4.1.1.2 端口的内部结构 四个端口的一位结构见图5.1,同一个端口的各位具有相同的结构。由图可 见,四个端口的 结构有相同之处:po作i/o口使用 cpu发控制电平“0”封锁与门,使t1管截止,同时使mux开关同下面的触点接 通,使锁存器的 q 与t2栅极接通。 当cpu向端口输出数据时,写脉冲加在锁存器的 cl上、内部总线的数据经 反相, 再经t2管反相, po口的这一位引脚上出现正好和内部总线同相的数据。 由于输出驱动级是漏极开路电路(因t1截止),在作i/o口使用时应外接10k 的上拉电阻。
当输入操作时,端口中两个三态缓冲器用于读操作。缓冲器2用于读端口引 脚的数据。当执行端口读指令时,读引脚脉冲打开三态缓冲器2,于是端口引 脚数据经三态缓冲器2送到内部总线。缓冲器1用于读取锁存器q端的数据。当 执行“读-修改-写”指令(即读端口信息,在片内加以运算修改后,再输出到该端 口的某些指令如:anl po,a指令),即是读的锁存器q的数据。1)保护现场。 如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些 寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆 栈保护, 调用完后再从堆栈中弹出以便加以恢复。 如果有较多的寄存器要保护, 应使主、子程序使用不同的寄存器组。 2)设置入口参数和出口参数。 用之前主程序要按子程序的要求设置好地址单元或存储器 (称为入口参 数),以便子程序从指定的地址单元或存储器获得输入数据; 子程序经运算或处理后的结果存放到指定的地址单元或寄存器 (称为出 口参数) 主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果, , 只有这样,才能完成子程序和主程序间的数据的正确传递。 3)子程序中可包括对另外子程序的调用,称为子程序嵌套。 主程序: org 0000h mov sp,#3fh mov a,31h lcall sqr mov r1,a mov a,32h lcall sqr add a,r1 da a这是为了避免错读引脚的电平信号,例如用一根口线去驱动一个晶体管基 极,当向口线写“1”,晶体管导通,导通的pn结会把引脚的电平拉低,如读引脚 数据,则会读为0 ,而实际上原口线的数据为1。因而采用读锁存器q的值而避 免了错读。究竟是读引脚还是读 锁存器,cpu内部会自行判断是发读引脚脉冲 还是读锁存器脉冲,读者不必在意。 应注意 ,当作输入端口使用时,应先对该口写入“1”使场效应管t2截止,再进 行读入操作,以防场效应管处于导通状态,使引脚箝位到零,而引起误读。 当po口作地址/数据线使用时,cpu及内部控制信号为“1”, 转换开关mux打向 上面的触点, 使反相器的输出端和t2管栅极接通,输出的地址或数据信号通 过与门驱动t1管,同时通过反相器驱动t2管完成信息传送,数据输入时,通过 缓冲器进入内部总线。当扩展片外存贮器时,mux开关打向右,p2口作高八位地址线输出高八位地址信 号。 其mux的的倒向是受cpu内部控制的。 应当注意:当p2口的几位作地址线使用时,剩下的p2口线不能作i /o口线使用。;取求a方 ;取 求b方 ; 求和 ;调整归纳四个并行口使用的注意事项如下: 1.如果单片机内部有程序存贮器,不需要扩展外部存贮器和i/o接口,单片机的四 个口均可作i/o口使用。 2.四个口在作输入口使用时,均应先对其写“1”,以避免误读。 3.p0口作i/o口使用时应外接10k的上拉电阻,其它口则可不必。 4.p2可某几根线作地址使用时,剩下的线不能作i/o口线使用。 5.p3口的某些口线作第二功能时,剩下的口线可以单独作i/o口线使用。 4.1.2 编程举例 下面举例说明端口的输入、输出功能,其他功能的应用实例在后面章 节说明。 例4-1.设计一电路,监视某开关k,用发光二极管led显示开关状态, 如果开关合上,led 亮、 开关打开,led熄灭。 分析:设计电路如图5. 2如示。 开关接在p1.1口线,led接p1.0口线,当开关断开时,p1.1为+5v, 对应数字量为“1”,开 关合上时p1.1电平为0v,对应数字量为“0”,这样就可以 用jb指令对开关状态进行检测 。极和共阴极的字形码是不同的 ,其字形码见下表。led数码管每段需10~20ma 的驱动电流,可用ttl或cmos器件驱动。 字形码的控制输出可采用硬件译码方式, 如采用bcd 7段译码/驱动器74ls48、 74ls49、cd4511(共阴极)或74ls46、74ls47、cd4513 (其阳极)也可用软件查表方式输出。编程如下: clr p1.0 ;使发光二极管灭 aga:setb p1.1 ;先对p1口写入“1” jb p1.1,lig ;开关开,转lig setb p1.0 ;开关合上,二极管亮 sjmp aga lig: clr p1.0 ;开关开,二极管灭 sjmp aga2.led数码管的接口 数码管的接口有静态接口和动态接口。 静态接口为固定显示方式, 无闪烁, 其电路可采用一个并行口接一个数据管, 数码管的公共端按共阴或共阳分别接地或vcc。这种接法占用接口多,如果po 口和p2口要用作数据线和地址线,仅用单片机的并行口就只能接二个数码管。 也可以用串行接口的方法接多个数码管, 使之静态显示. 动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高 时,利用人眼的暂留特性 ,看不出闪烁显示现象,这种显示需要一个接口完 成字形码的输出(字形选择),另一接口完 成各数码管的轮流点亮(数位选择)。 例4-2.在下图中p1.4~p1.7接四个发光二极管led,p1.0~p1.3接四个开关, 编程将开关的状态反映到发光二极管上。 上述程序中每次读开关之前, 输入位都先置“1”, 保证了开关状态的正确读入。 编程如下: org 0000h abc: mov p1, #0高四位灭,低四位送“1” mov a, p1 ;读p1口引脚开关状态至低四位开关状态转换到高四位 anl a, #0f0保留高四位 mov p1,从p1口输出循环 例3.用p1.0输出1khz和500hz的音频信号驱动扬声器, 作报警信号, 要求1khz 信号响100ms ,500hz信号响200ms,交替进行,p1.7接一开关进行控制,当开 关合上响报警信号,当开关断开告警信号停止,编出程序。 分析:500hz信号周期为2ms,信号电平为每1ms变反1次。1khz的信号周期为 1ms,信号电平 每500s变反1次,编一个延时500s子程序,延时1ms只需调用 2次。 用r2控制音响时间长短, a作音响频率的交换控制的标志。 a=ff时产生1khz 信号,a=0时产生500hz信号。例如图5是接有五个共阴极数码管的动态显示接口电路,用74ls373接成 直通的方式作驱动 电路,阴极用非门74ls04反相门驱动,字形选择由p1口提 供,位选择由p3口控制。 当p3.0~p3.4轮流输出1时,五个数码管轮流显示。p1.7接开关,当开 关打向位置“1”时, 显示“12345”字样,当开关打向“2”时,显示“hello”字样, 程序清单如下:用汇编语言编程 org 0000h
mov p3,#0 ;清显示 test:setb p1.7 jb p1.7,dir1 ;检测开关 mov dptr,#tab 1 ; 开关置于1,‘12345’字形表头地址 sjmp dir dir1: mov dptr,#tab2 ; 开关置于2,“hello”字形表头 dir: mov r0,#0 ;r0存字形表偏移量 mov r1,#01 ;r1置数码表位选代码 next:mov a,r0 movc a,@a+ 查字形码表1 mov p1,a ;送p1口输出 mov a,r1 mov p3,a ;输出位选码 acall day ;延时 inc r0 ;指向下一位字形 rl a ;指向下一位 mov r1,a cjne r1,#20h,五个 数码管显示完 sjmp test day:mov r6,#20 ; 延时20ms子程序 dl2: mov r7,#7dh dl1: nop nop 4.1.3.2用并行口设计键盘电路 键盘是计算机系统中不可缺少的输入设备, 当按键少时可接成线性键 盘(如图5.3中的按键 ),当按键较多时,这样的接法占用口线较多。将按键接 成矩阵的形式,可以节省口线,例如两个接口可按8*8的形式接64个按键。每 个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵 的行线和列线分别通过两并行接口和cpu通信。每个按键的状态同样需变成数 字量“0”和“1”,开关的一端通过电阻接vcc(列)、而接地是通过程序输出数字“0” 实现的。 键盘处理程序的任务是: 确定有无键按下; 判哪一个键按下, 键的功能是什么; 还要消除按键在闭合或断开时的抖动。 两个并行口中,一个输出扫描码, 使按键逐行动态接地(称行扫描),另一 个并行口输入按键状态(称回馈信号,键盘的列值), 由行扫描值和回馈信号 共同形成键编码而识别按键、通过软件查表,查出该键的功能。也可由硬件编 码器完成键的编码。 下图中,用8xx51的并行口p1接4×4矩阵键盘,以p1.0~p1.3作输出线,以 p1.4~p1.7作输入线,键盘扫描程序的流程如图5.7所示。org clr
beg: jb0000h a ;a作1khz,500hz 转换控制p1.7, $ ;检测p1.7的开关状态 mov r2, #200 ;开关闭合报警,r2控制音响时间 dv: cpl p1.0 cjne a, #0ffh, n1 ;a≠ffh,延时500s
acall d500 ;a= 延时1ms p1.0变反 n1: acall d500 djnz r2,dv
cpl a sjmp beg d500: mov r7, #250 ;延时500 s子程序 djnz r7, $ ret end 4.1.3 用并行口设计led数码显示器和键盘电路 键盘和显示器是单片机应用系统中常用的输入输出装置。led数码显示器是 常用的显示器之一,下面介绍用单片机并行口设计led数码显示电路和键盘电 路的方法。 4.1.3.1用并行口设计led显示电路 1. led显示器及其原理 led有着显示亮度高,响应速度快的特点,最常用的是七段式led显示器,又 称数码管。 七段led显示器内部由七个条形发光二极管和一个小圆点发光 二极管组成,根据各管的亮暗组合成字符。常见led的管脚排列见图4(a)。其 中com为公共点,根据内部发光二极管的接线 形式,可分成共阴极型图4(b)和 共阳极型图4(c)。led数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不能发 亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,显然共阳 为5 μs,即定时5 μs 。 对键盘的程序流程图5.7说明如下: 当p1.0~p1.3输出0时,如无键按下,p1.4~p1.7的输入值均为“1”,如 果其中有一个不是 “1”,说明有键按下,再使p1.0~p1.3逐个输出零(行扫描), 检查p1.4~p1.7的输入值有 无零, 从而查出是哪行哪列的键按下。 在判按键时, 按键有抖动, 可采用延时后再重读以跳 过抖动时段(也可用r-s触发器闩锁电路 硬件消抖,但这样电路复杂,在矩阵键盘中不采用)。 程序清单如下: org 0000h test: mov p1,#0f0h 2. 计数工作方式 设置为计数工作方式时,通过引脚t0(p3.4)和t1(p3.5)对外部脉冲信 号计数。 ★ 当输入脉冲信号产生由1至0的下降沿时,定时器的值加1, 在每个机器周期 cpu采样t0和t1的输入电平。若前一个机器周期采样值为高,下一个机器周期 采样值为低,则计数器加 1。 ★ 由于检测一个1至0的跳变需要二个机器周期, 故最高计数频率为振荡频率的 二十四分之一。 ★ 虽然对输入信号的占空比无特殊要求, 但为了确保某个电平在变化之前至少 被采样一次,要求电平保持时间至少是一个完整的机器周期。★; p1.0~p1.3输出0, p1.4~p1.7 输出1,作输入位 mov a,p1 ;读键盘,检测有无键按下 anl a,#0f0h ; 屏蔽p1.0~p1.3, 检测p1.4~p1.是否全为1 cjne a, #0f0h,have ; p1.4~p1.7不全为1, 有键按下 sjmp test ;p1.4~p1.7全为1, 无键按下,重检测键盘 have: mov a,#0fe ;有键按下,逐行扫描键盘, 置扫描初值 aread: mov a,p1 ;再读键盘 anl a,#0f0h ; 屏蔽p1.0~p1.3,保留p1.4~ p1.7(列码) mov r2,a ;暂存列码 mov a, b anl a,#0fh ;取行扫描码 orl a,r2 ;行码、列码合并为键编码 yes1: mov b,a ;键编码存于b ljmp sam38 ;转键分析处理程序(见例3-8) … 例如图5-6中的“a”键, 当行扫描值sccode=feh=b, 读入列值到p1口和f0h 相与即保 留高四位读入值,屏蔽了低四位,再和0fh相或得 recole=dfh=b. sccode+ recode=b,所以“a”键的编码21h,此值是a的键码,同样 可得“5” 键编码为b即44h,由此可将每个按键的编码排出来,通过查 表程序转不同的按键处 理程序。此程序部分请读者自行编出。该程序同样可 用汇编语言编出。 4.1.4 并行接口小结 1. 四个并行口均可作为输入输出接口使用,但又有各自的特点。因po口是数据 线和低八位的 地址线,因此不用它作输入/输出接口,而是用它传输数据和低 八位的地址信息,除非在不 接其他外围芯片的情况下才作i/o接口使用,此时 由于内部漏极开路,需外接上拉电阻。四个口的使用特点是本章的重点。 3. 在应用设计中应理解,计算机内由数字电路组成只存在两种ttl电平,高电平 3.5~5v和低 电平0v,对应着的数字为“1”和“0”。 外设的状态要通过电路转换成高、低电平,计算机才能识别(如开关电路)。
计算机输出数据“1”即输出3.5v~5v, 输出数据“0”即输出0v, 根据外设需要的 电平要求 输出“1”或“0”数据,这就是程序控制外设的本质。 4.2.2.2 中断控制的有关寄存器 (3)中断优先级管理寄存器ip mcs_51系列单片机的中断结构如图所示。 4.2.2 中断响应过程 4.2.3 中断的程序设计 5.2 串行接口 ★ 51系列单片机片内有二个十六位定时/计数器: 定时器0(t0)和定时器1(t1)。 ★ 两个定时器都有定时或事件计数的功能,可用于定时控制、延时、对外部事 件计数和检测等场合 ★ 定时/计数器实际上是16位加1计数器。 t0由2个8位持殊功能寄存器th0和tl0构成, t1由2个8位持殊功能寄存器th1和tl1构成。 ★每个定时器都可由软件设置为定时工作方式或 计数工作方式。 ★t0和t1受特殊功能寄存器tmod和tcon控制。 1. 定时工作方式 ★ 设置为定时工作方式时, 定时器计数的脉冲是由51单片机片内振荡器经12分频 后产生的。 ★每经过一个机器周期定时器(t0或t1)的数值加1直至计数满产生溢出。 如:当8051采用12mhz晶体时,每个机器周期为1μs,计5 个机器周期即★ gate:门控信号 gate=0,trx=1时即可启动定时器工作 ; gate=1,intx=1才可启动定时器工作。 ★ c/t:定时器/计数器选择位 c/t=1,为计数器方式; c/t=0,为定时器方式。 ★ m1 m0 工作模式选择位 m1m0=00 工作方式0(13位方式)。 m1m0=01 工作方式1(16位方式)。 m1m0=10 工作方式2(8位自动再装入方式)。 m1m0=11 工作方式3(t0为2个8位方式)。★tf0:t0溢出中断请求标志。 tf0=1,t0有溢出中断请求。 tf0=0,t0无溢出中断请求。 ★tr0:t0运行控制位。 tr0=1,启动t0工作。 tr0=0,停止t0工作。 ★ 定时、计数溢出否可查询tf0是否置位,如果开中断则产生溢出中断。 org 0000h main:clr p1.7 setb p1.0 mov tmod,#61h mov th1,#0fbh mov tl1,#0fbh setb tr1 loop1:cpl p1.7loop2:mov th0,#3ch mov tl0,#0b0h setb tr0 loop3: jbc tf0,loop4 sjmp loop3 loop4:cpl p1.0 jbc tf1,loop1 ajmp loop2 end 方法2:t0每隔100ms中断一次,利用软件对t0的中断次数进行计数,中断10次即 实现了1秒的定时。 org 000bh ;t0中断服务程序入口 ajmp ip0 org 0030h ;主程序开始 main:clr p1.7 ;t0定时100ms mov tmod,#01h mov th0,#3ch mov tl0,#0b0h setb et0 setb ea mov r4,#0ah;中断10次计数 setb tr0 sjmp $ ;等待中断 ip0:djnz r4,ret0; mov r4,#0ah cpl p1.7 ret0:mov th0,#3ch mov tl0,#0b0h setb tr0 reti 例5-3 有p3.4引脚(t0)输入一低频信号(其小于0.5khz),要求p3.4每发生 一次负跳变时, p1.0输出一个500us同步负脉冲,同时p1.1输出一个1ms的同步 正脉冲。已知晶振频率为6mhz。mov th0,#06h mov tl0,#06h setb p1.1 clr p1.0 setb tr0 del2: jbc tf0, resp2 ajmp del2 resp: setb p1.0 del3: jbc tf0,resp3 ajmp del3 resp3: clr p1.1 clr tr0 ajmp begin;重置定时初值 p1.1置1 ; p1.0清0 ; 启动定时计数器 ;检测第一次500us到否 ;p1.0恢复1 ;检测第二次500us到否 ; p1.1复0 ;门控位的应用 门控位gate为1时,trx=1,intx=1才能启动定时器。利用这个特性可 以测量外部输入脉冲的宽度。 例7-4 利用t0门控位测试 int0引脚上出现的正脉冲宽度,已知晶振频率为 12mhz,将所测得值最高位 存入片内71h单元,低位存入70h单元。 解:设外部脉冲 由(p3.2)输入,t0工作于定时方式 1 (16位计数),gate设为1。测试时,应在int0 低电平时,设置tr0为1(16位 计数);当int0 变为高电平时,就启动计数; 再次变低时,停止计数。此计 数值与机器周期的乘积即为被测正脉冲的宽度。因fosc=12mhz,机器周期为 1us,测试过程如下。 5.1.4.4 源程序如下: mov tmod,#09 设t0为方式1 mov tl0,#00h ;设计初值取最大值 mov th0,#00h mov r0,#70h jb p3.2, $ ;等p3.2(int0 )变低 setb tr0 ;启动t0准备工作 jnb p3.2, $ ;等待p3.2(int0 ) jb p3.2,$ ; 等待p3.2(int0 ) clr tr0 ;停止计数 mov @r0,tl0 ;存放结果 inc r0 mov @r0,th0 sjmp $ 读者不难编出c语言程序。这种方案被测脉冲的宽度最大为65535个机 器周期。由于靠软件启动和停止计数,有一定的测量误差。其可能的最大误差 与指令的执行时间有关。 此例中,在读取定时器的计数之前,已把它停住。但在某些情况下, 不希望在读计数值时打断定时的过程,由于我们不可能在同一时刻读取thx和 tlx的内容。读取一个时恰好另一个产生溢出,在这种情况下,读取的计数值 有可能是错的。可以解决错读的方法是: 先读thx后读tlx,若两次读得的thx没有发生变化,则可确定读到的内容是正确的。 若前后两次读到的thx有变化,则再重复上述过程,重复读到的内容就应该是正确 的了。下面是按此思路编写的程序段,读到的th0 和tl0放在r1和r0内: rp:mov a,th0; mov r0,tl0; cjne a,th0,rp; mov r1,a 5.1.5 小 定时计数器应用非常广泛,如定时采样、时间测量、产生音响、作脉冲 源、制作日历时钟、测量波形的频率和占空比、检测电机转速等。因此应很好 掌握。 ★ 51系列单片机既有两个16位的定时计数器,有四种不同的工作方式,归纳 于下表: 5 .2. 1 概 述 单片机应用与数据采集或工业控制时,往往作为前端机安装在工业现场, 远离主机,现场数据采用串行通信方式发往主机进行处理,以降低通信成本,提高 通信可靠性。如下图所示。 ★串行通信的分类:同步串行通信和异步串行通信 一、异步通信: 通信的双方应该有一个约定,什么时候开始发送,什么时候发送完毕; 接收方收到的信息是否正确等,这就是通信协议。 异步串行通信一帧数据格式:一个起始位 “0”,表示字符的开始,然后是5~8位数据即该字符的代码,规 定低位在前,高位在后,接 下来是奇偶校验位(可省略),最后以停止位“1”表示 字符的结束。 优点:硬件结构简单。 缺点:传输速度慢。三、单工、半双工、全双工通信方式 1.实现数据格式化 因为cpu发出的数据是并行数据,接口电路应实现不同串行通信方式下的 数据格式化任务, 如自动生成起止方式的帧数据格式(异步方式)或在待传送的数据 块前加上同步字符等。 51系列单片机内有一个全双工的异步通信接口,通过对串行接口写控制字可以选 择其数据格 式,同时内部有波特率发生器,提供可选的波特率,可完成双机通信 或多机通信。 (一)通信线的连接 通信速率和通信距离这两个方面是相互制约的,降低通信速率,可以提高通信距 离. 不同的通信距离,串行通信电路有不同的连接方法。(二)串行通信接口总线标准 (三)rs-232c mcs—51之间的双机通信 5.2.2 单片机串行口的结构与工作原理 5.2.3 串行控制寄存器scon 用以存 放串行口的控制和状态信息。8xx51串行口正是通过对上述 专用寄存器的设置、检测与读取 来管理串行通信的。 特 殊功能寄存器pcon的最高位smod为串行口波特率的倍增控制位。 波特率发生器 可以有两种选择: 1. 定时器t1作波特率发生器,改变计数初值就可以改变串行通信的速率,称为可 变波特率。 2. 以内部时钟的分频器作波特率发生器,因内部时钟频率一定,称为固定波特率 5.2.5 串行口的应用编程 串行口的波特率有两种方式:– –固定波特率 可变波特率注意:使用可变波特率时,先确定 ti 的计数初值,并对 ti 进行初始化。串行通信的编程方式:– –查询方式:查c 是否为“1”。 中断方式:如果预先开了中断,当ti、ri 为“1”,会自动产生中断。注意:两种方式中当发送或接受数据后都要注意清 ti 或 ri 。5.2.5.1 查询方式 查询方式发送流程图和接收流程图见下页 5.2.5.2 中断方式 中断方式的初始化编程同查询方式,不同的是要开中断,即置位ea和es, 编写中断服务程序。 汇编语言编程 mov tmod mov th1, #0cch mov tl1, #0 设定波特率 setb tr1 mov scon, #50h abc: clr ti mov p1, #0 led灭 延时 mov a, #offh mov sbuf, 发送数据ffh jnb ri, $ ;ri = 1等待 mcs51系列单片机的特点就是体积小,功能全,系统结构紧凑,硬件 设计灵活。对于简单 的应用,最小系统即能满足要求。 所谓最小系统是指在最少的外部电路条件下,形成一个可独立工作的 单片机应用系统。一片89c51,或者一片8031外接一片 eprom就构成了一个 单片机最小系统。 在很多复杂的应用情况下,单片机内的ram ,rom 和 i/o接口数量 有限,不够使用,这种情况下就需要进行扩展。因此单片机的系统扩 展主要 是指外接数据存贮器、程序存贮器或i/o接口等,以满足应用系统的需要。 6.1单片机系统总线和系统扩展方法 单片机是通过地址总线,数据总线和控制总线与外部交换信息的。 mcs-51单片机的总线接口信号见图 由图可见: 1)由于po分时传送地址/数据信息,在接口电路中,通常配置地址锁存器, 有ale信号锁存低8位地址ao~a7,以分离地址和数据信息。 2)p2口传送高8位地址a8~a15。 3 ) psen为程序存储器的控制信号,是在取指令 码时或执行movc指令时变为有效。 rd、wr为 数据存储器和i/o口的读、写控制 信号。是执行movx指令时变为有效。 6.2 6.2.1 eprom的扩展 根据以上取指时序的要求,8xx51单片机扩展程序存储器2732的电路 图见图 6.2.2 eeprom的扩展 6.3 数据存储器的扩展 在ale的上升沿, 外部程序存储器的指令读入后就开始了对片外ram的读过 把 程。 ale高电平期间,在p0处于高阻三态后,根据指令 间址提供的地址,p2口输出外部ram的高8位地址a15~a8 ,p0端口输出低8位 地址a7~a0 ;在ale下跳沿,p0输出的低8位地址被锁存在锁存器中,随后p0 又进入高阻三态,rd信号有效后,被选中的ram的数据出现在数据总线上, p0 处于输入状态,cpu从p0 读入外部ram的数据 。 7.1 并行i/o接口的扩展 mcs-51单片机共有4个8位并行i/o口, 在外部扩展时, p0和p2口做为总线使用, 因而提供给用户的 i /o口就只有p1或p3口的部分口线所接的外设较多时, 就 必须扩展i/o接口。 mcs-51单片机扩展的i/o口和外部数据存储器统一编址、采用相同的控制信号、 相同的寻址方式和相同的指令。 扩展i/o所用的芯片有通用可编程芯片 ( 如, 8255等)和ttl, cmos锁 存器,缓冲器(如273, 377, 244, 245等),用户可根据系统对输入输出的要求适当选 择芯片。 图9-24为8xx51 扩展一个输入接口244 和一个输出接口273 的电路. 244的选通信号由rd和p2.0相或产生,当执行读该片的指令时, rd和p2.0有效, 打开 244控制门, 从而把数据通过244读入8xx51。 273的选通信号由wr和p2.0相或产生,通过执行对该片的写指令,wr 和p2.0有效,使8xx51的数据往273输出。 8xx51内部有rom/eprom, 不用扩展外部程序存储器, 所以p0口作 为双向数据线连在的数据端。 273、 244有相同的地址feffh(实际上只要保证p2.0=0,其他地址位无关紧要) , 然而由于使用不同的控制信号rd或wr ,它们地址相同却不会发生数据传送冲 突。 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 07ffh 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 37ffh 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 1 1 1 1 1 1 1 1 1 1 2fffh 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 1 1 为可编程并行接口芯片,它有3个8位数据口:a口,b口,c口(其中c口可作为 两个四位口),一个控制口,口地址由a1,a0决定。图中8255的三个数据口地址分 别为h,控制口地址为1803h。 8255有三种工作方式:方式0(基本方式), 方式1(选通方式 ,此时c口高四位为 a口的联络线,低四位为b口联络线) , 方式2(双向方式,仅a口有)。 8255的方式控制字格式为: 例7-1 将8255a口输入的数据从b口输出,c口不用,均采用方式0 。 mov dptr, #1803h mov a, #dptr指向控制口 ;设定a口方式0输 入,b口方式0输出 程序存储器的扩展movx @dptr, a mov dptr, #1800h movx a, @dptr 加器 inc dptr movx @dptr, a sjmp $;写入控制口 ;dptr指向a口 ;从a口输入数据 到a累 ;dptr指向b口 ;a的内容从b口输出7.2 中断扩展 标准的8051单片机只有两个外部中断输入端。而当系统的外部中断源大于或 等于3个时, 则考虑通过中断扩展获得更多的外部中断端口。 中断扩展的基本思 想就是,通过系统的标准外部中断端口(一级中断)的复用来扩展若干个二级 中断。当有扩展的中断请求输入时,系统响应后首先进入复用的一级中断服务 程序,在中断服务程序的开始处,读入二级中断向量,依据不同的中断向量来 区别不同的中断请求源,然后执行对应的中断服务程序代码。常见的中断扩展 有编码器线和与两种方式。前者适合中断源较多的情况,后者电路简单,但只 适合中断源扩展较少的情况。编码器方式的扩展电路如图7.6所示。在图7.6中,使用一片优先编码器74148,扩展了8个中断源。编码器产生 8-3线的中断向量码的同时, 通过gs产生复用的中断请求信号输入至单片机的外部 中断输入口int0或int1。中断向量码由p1口或中断向量数据端口(需另加三态数 据缓冲器)在进入中断后读入。148优先编码器优先级别从in7到in0依次变低,向 量码分别为111、110、…、000。 一般扩展中断不需要8路,只需要4路左右。此时可以用线与方式扩展 完成,其电路如图7.7所示。 在图7.7中,直接使用二极管的“线与”操作来实现中断输入的判别。当 int0到int3的某个扩展中断源有中断请求时, 因二极管的“线与”功能, 使得int 为低电平,从而引起系统中断。进入中断后,通过查询p1.0到p1.3便可知道应 该执行哪一部分中断服务程序。假设int接至51单片机的脚,对应的中断服务 程序的框架结构为: org 0013h jmp intserv …… intserv: … … ;现场保护 jnb p1.0,int0是中断int0请求,则执行int0对应的中断服务程序 jnb p1.1,int1是中断int1请求,则执行int1对应的中断服务程序jnb p1.2,int2是中断int2请求,则执行int2对应的中断服务程序 jnb p1.3,int3是中断int3请求,则执行int3对应的中断服务程序 int0serv: … … ; int0的中断服务程序 jmp retu int1serv: … … ; int1的中断服务程序 jmp retu int2serv: … … ; int2的中断服务程序 jmp retu int3serv: … … ; int3的中断服务程序 retu: …… ;恢复现场 reti 7.3定时器的扩展 8254 是8253 的改进型,具有3个独立的功能完全相同的16位计数器,每个计数器 都有6种工作方式,这6种工作方式可以由控制字设定,因而能以6种不同的工作方 式满足不同的接口要求。cpu还可以随时更改他们的方式和计数值,并读取他们的 计数状态。 7.3.1 8254的结构和引脚 8254的外部引脚如图7-8所示。其内部主要由数据总线缓冲器、读写逻辑、控 制字寄存器和计数器等4个部分构成。 1) 数据总线缓冲器 数据总线缓冲器是三态、双向、8位的缓冲器。用于系统数据总线和8254 的接口,写控制字到8254的控制寄存器、写计数初值到指定的计数器、读取 某个计数器的计数的现行值等,均是通过缓冲区输出输入实现和cpu的互传。 2) 读/写控制逻辑 接收系统总线的5个输入信号,控制操作。其中rd、wr 读、写控制信号 操控制8254读、写操作。 cs-片选信号,低电平有效,芯片使能 a1、a0计数器通道选择。a1a0的取值00、01和10时分别选择计数器0、计 数器1和计数器2,当a1a0=11时选择控制寄存器。 cs、rd、wr、a1、a0组合起来所完成的选择和操作功能如下表7.3所 示。 表7.3 8254内部寄存器读/写操作表 3) 计数器 计数器0、计数器1和计数器2有着相同的结构,见图7-9 写入计数器的初始值保存在计数初值寄存器中,由clk脉冲的一个上升沿或 一个下降沿将其装入减1计数器。减1计数器在clk脉冲(gate允许)作用下进行递 减计数,直至计数值为0,输出out信号。输出寄存器的值跟随减1计数器变化,仅 当写入锁存控制字时, 它锁存减1计数器的当前计数值(减1计数器可继续计数), cpu 读取后,它自动解除锁存状态,又跟随减1计数器变化。所以在计数过程中,cpu 随时可以用指令读取任一计数器的当前计数值,这一操作对计数没有影响。每个计 数器对输入的clk脉冲可按二进制减计数也可按十进制减计数。 8254可作为计数器,也可作为定时器,若输入的clk是频率精确的时钟 脉冲,计数器可作为定时器。此时定时时间=计数初值×tclk 在计数过程中, 计数器受门控信号gate的控制。计数器的输入clk与输 出out以及门控信号gate之间的关系,取决于计数器的工作方式。 4)控制和状态寄存器 当a1a0=11时选择控制或状态寄存器。控制寄存器存放计数器的工作方 式控制字和对输出寄存器发的锁存命令;状态寄存器存放8254当前的工作状 态,三个控制字共用一个口地址,通过标识位区别是什么控制字和写入哪个计 数器。 7.3.2 8254的工作方式控制字和读回命令字 8254的控制字有两个:工作方式控制字和读回命令字。两个控制字共用一个地 址, 由标识位来区分, 通过指令完成控制字的写入。 工作方式控制字其格式见表7.4。 当欲读出计数器当前计数值或计数器状态时,应先发读命令字至控制寄存器, 使计数器的当前计数值或计数器状态锁存在输出寄存器中, 再从工作的计数器读计 数值。 读回命令字见表7. 5 7.3.3 8254的状态字 8254的状态字端口地址和控制字端口地址相同,不过状态字使用读指令。状态字格 式如表7.6所示。 7.3.4 8254的应用举例 7.3.4.1 8254的初始化编程 1.根据要求确定工作方式,将控制字填写进控制寄存器。 2.确定计数初值: 计数方式:计数初值=要计的脉冲个数。 定时方式:计数初值=t/tclk=fclk/f 其中t为定时时间,(频率f=1/t) 3. 计数初值按工作方式控制字中rw1、 rw0、 bcd位的要求写进所使用的计数 器通道。 7.3.4.2 8254的工作编程 8254的工作编程主要完成计数初值的改变和当前计数器值及状态的读取 两个任务。改变计数初值的操作比较简单,写入相应的计数器端口即可。而读 当前计数值和当前状态相对复杂,通常有3种方法,简介如下。3、在软件设计中,外围i/o接口使用movx指令完成输入或输出,使用可编程型i/ o接口芯片时要先写控制字,且要注意控制字要写入控制口,数据的输入输出 使用数据口。 在掌握了单片机的总线结构和连接方法,查阅到各钟芯片的功能、结构和引脚、 控制字格式后,各种芯片和单片机连接是轻而易举的, 也就具备了嵌入式系统的 设计能力。 计算机通过执行程序完成人们指定的任务,程序由一条一条指令构成,能为cpu 识别并执行的指令的集合就是该cpu的指令系统。 mcs-51单片机汇编语言指令格式: 操作符 目的操作数,源操作数指令中的常用符号 rn: n=(0~7),表示当前工作寄存器r0~r7中的一个 ri: i=(0、1),代表r0和r1寄存器中的一个,用作间接寻址寄存器 dir : 8 位直接字节地址(片内 ram 和 sfr ) #data: 8位立即数,即8位常数。可以为2进制(b)、10进制、 16进制(h)、 符(‘ ’) #data16: 表示16位立即数,即16位常数,取值范围为#0000h~#0ffffh addr16 : 表示16位地址 addr11 : 表示11位地址 rel : 相对偏移量(为一字节补码)用于相对转移指令中 bit :位地址,在位地址空间中。 $: 表示当前指令的地址。 2.1 寻址方式 1、立即寻址 指令中直接给出操作数的寻址方式。在51系列单片机的指令系统中,立即数 用一个前面加 “#“号的8位数(#data, 如#30h)或16位数(#data16, 如#2052h)表示。 立即寻址中的数,称为立即数。 例如指令:mov a,#30h字2、直接寻址 操作数的地址直接出现在指令中。 寻址对象: ①内部数据存贮器:使用它的地址。 ②特殊功能寄存器:既可使用它的地址,也可以 直接使用寄存器名。 3、寄存器寻址 操作数存放在寄存器中。 寻址对象:a,b,dptr,r0~r7 。 b 仅在乘除法指令中为寄存器寻址,在其他指令中为直接寻址。 a 可以寄存器寻址又可以直接寻址,直接寻址时写作acc 例如:mov a,r0 ;r0→a,a、r0均为寄 存器寻址,机器码e8 mul ab ;a*b→ba,a、b为寄 存器寻址,机器码a4
直接读计数器。由于计数器在实时变化,读出的值不稳定。若要稳定,可停 止计数,但这会影响计数器的工作。 用方式控制字锁存住指定计数器的当前值,然后再读。这既不影响计数,读 出值又稳定。 用读回命令字进行操作,又可分为三种情况:– – –如果仅锁存状态信息,则对相应的计数器端口进行一次读操作就可读 回。 如果仅锁存当前计数值, 同时若计数初值为16位, 则要依次读回当前计 数值的低8位和高8位。 如果同时锁存状态信息和当前计数值, 则先读回状态信息, 后读回当前 计数值。16位计数初值的情况同前。mov b,r0例7-2 读8254的计数器0的当前计数值,并存入r7、r6寄存器中。 mov dptr,#8003h mov a,#1101000b ;读计数器0的读回控制字送控制口 movx @dptr,a movx dptr,#8000h ;指向计数器0 movx a,@dptr ;读低8位 mov r6,a movx a,@dptr ;读高8位 mov r7,a 7.4 小 结 单片机应用系统的设计中i/ o接口和中断源的扩展。 1、i/ o接口扩展有两类:通用型和可编程型,在硬件连接中,无论哪种芯片,都 要将单片机的wr (写)或rd(读)连接上,以此作为输出或输入的选通控制,对于 通用型输入接口,应使用使用rd,而对于通用型输出接口,应使用使用wr, 对于可编程型,芯片本身有上wr和rd信号,使其和单片机的wr和rd对应连 接就可以了 2、地址译码的方法和存贮器地址译码方法相同,可以是线选法,部分译码或全译 码。也可将片选端可接地,视外接芯片的多少决定,原则是外接i/o接口和外 接ram不能有相同的地址;外接i/o接口之间不能有相同的地址。push acc;r0→b,r0为寄存器寻 址,b为直接寻址 机器码 88f0,其中 f0为b的 字节地址(见表1-2) ;a的内容压入堆栈 机器码c0e04、寄存器间址 操作数存放在以寄存器内容为地址的单元中。 例如: mov r0,#20h mov @r0,a ;a→(20h) 地址的内部ram movx a,@r1 ;外部ram(地址为p2 r1 ) 的 内容→a movx @dptr,a ;a→以dptr内容为地址的 外部ram 5、变址寻址 以dptr或pc寄存器内容为基地址,和a的内容为相加形成操作数的地址。其 中累加器a内容是可变的。 例如: movc a, @a+dptr 6、相对寻址 相对寻址是将程序计数器pc的当前值与指令第二字节给出的偏移量相加, 从而形成转移的目标地址。 例如:jz 61h 与“0”异或值不变:与“1”异或值变反。 逻辑指令常用于对数据位进行加工。 7、位寻址 对片内ram中20h~2fh中的128个位地址及sfr中的可位寻址的位地 址寻址。 例如: mov c,20h;20h位的内容送cy标志 位,c称为位累加器。 mov a,20h ;字节寻址,将内部 ram中20h单元中的 内容送给累加器a。 以上两条指令均为寻址,究竟是位寻址还是字节寻址,根据两操作数 类型一致的原则,由另一个操作数决定。 3. 十进制调整指令 计算机完成二进制加法其和也为二进制,如果是十进制相加(即bcd码 相加)想得到十进制的结果,就必须进行十进制调整(即bcd 码调整)。 调整指令: da a ;将a中二进制相加和调整成bcd码 调整方法:和低4位大于9或有半进位则低4位加6; 和的高4位大于9或有进位,则高4位加6。 指令根据相加和及标志自行进行判断,因此该指令应紧跟在加指令之后, 至少在加指令和该指令之间不能有影响标志的指令。 da a指令只对一个字节和调整,如为多字节相加必须进行多次调整。此 指令不能对减法结果进行调整。 例 完成56+17的编程。 mov a,#56h ;a存放bcd码56h mov b,#17h ;b存放bcd码17h add a, b ;a=6dh da a ;a=73h sjmp $ 指令对标志位的影响有如下规律: 1) 凡是对a 操作指令(包括传送指令)都将a中1个的奇偶反映到psw的p标志 位上。即a中奇数个“1”,p=1;偶数个“1”,p=0。 2) 传送指令、加 1、减 1 指令、逻辑运算指令不影响cy、 ov、ac 标志位。 3) 加减运算指令影响标志位,乘除指令使cy=0,当乘积大于255,或除数为0时, ov置1。 4) 对进位位cy(指令中用c表示)进行操作的指令和大环移指令,显然会影响 cy。 具体指令对标志位的影响可参阅附录a。 标志位的状态是控制转移指令的条件,因此指令对标志位的影响应该记住。例 r1=20h,(20h)=55h, 指令mov a,@r1执行后,a=55h。 例 (40h)=30h,指令 mov r7,40h 执行后,r7=30h。 例 mov r7,#40h 执行后,r7=40h。 movx指令举例 例: 实现片外数据存储器数据传送 (2000h)→(2100h)。 使用p2口和8位寄存器ri间址: mov p2,#20h ;高位地址 mov r0,#00 ;低位地址 movx a,@r0;读片外ram mov p2,#21h ;改变高位地址 movx @r0,a;写片外ram 查表指令movc 注:①只能从程序存储器读取数据到a累加器。 ②只能使用变址间接寻址方式 多用于查常数表程序,直接求取常数表中的函数值 1)dptr为基址寄存器 movc a,@a+dptr ;a←(a+dptr) 查表范围为 64kb 程序存储器任意空间。 例 查表法求 y=x2。设 x(0≤x≤15)在片内 ram 20h单元,要求将查表求 y, 存入片内 ram 21h单元 1)用dptr作基址寄存器 org 0100h squ: mov dptr,#tab ;确定表首地址 mov a,20h ;取 x movc a,@a+dptr ;查表求 y=x2 mov 21h,a ;保存y ret ;子程序结束 … ;其它程序段2)用pc作基址寄存器 指令地址2.4 控制转移指令 这一类指令的功能是改变指令的执行顺序, 转到指令指示的新的pc地址执 行。 mcs-51单片机的控制转移指令有以下类型: 无条件转移:无需判断,执行该指令就转移到目的地址。 条件转移: 需判断标志位是否满足条件, 满足条件转移到目的地址, 否则顺序执行。 绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移。 相对转移:转移的目的地址用相对于当前pc的偏差(偏移量)指示,通常为条件转 移。 长转移或长调用:目的地址距当前pc 64kb地址范围内。 短转移或短调用:目的地址距当前pc 2kb地址范围。 1.长调用 lcall addrl16 ;addr16→pc0~15 说明: (1)该指令功能是 ①保护断点, 即当前pc (本指令的下一条指令的首地 址) 压入堆栈。 ②子程序的入口地址 addr16 送pc,转子程序执行。 (2) 本指令为64kb地址范围内的调子程序指令, 子程序可在64kb地址空间的任一 处。 (3)本指令的机器码为三字节 12 addr16。源程序h h h 010bh 3.堆栈操作指令 例:设 a=02,b=56h,执行下列指令序列后,sp = a =
2.2.2 交换指令 实现片内ram区的数据双向传送 1. 字节交换指令 xch a,rn ;a←→rn xch a,@ri ;a←→(ri) xch a,n ;a ←→(n) 2. 半字节交换指令 例 将片内ram 2ah和 2bh单元中的ascii码转换成压缩式bcd码存入 20h单元org 0100h ;程序起始地址 squ: mov a,20h;取x add a,#3 ;修正偏移量 movc a,@a+pc ;查表求y=x2 mov 21h,a ;存结果 ret ;子程序结束 tab: db 00,01,04 ;平方表 db 09,…,2252.短调用 acall addr11 ;addr11→pc0~10 说明: (1)该指令的功能是 ①保护断点,即当前pc压入堆栈。 ② addrl11→pc0~10,而pc11~15保持原值不变。 (2)本指令为2kb地址范围的调子程序指令,子程序入口距当前pc不得超过2kb 地址范围。 (3)本指令的机器码为二字节,设addr11的各位是a10a9a8…a2a1a0,则acall指 令机器码a10a9aa6a5a4a3a2a1a0,其中10001是acall指令的操作码。算术类指令的操作意义非常明确,不一一赘述, 注意减指令只有带借位减,因此在多字节减法中, 最低字节作减法时,注意先清cy。 逻辑运算是按位进行的,两数运算的运算法则是: 与:有“0”则“0”; 或:有“1”则“1” 异或:同为“0” , 异为“1”;例 子程序调用指令acall在 程序存储器中的首地址为0100h, 子程序入口地址 为0205h。试确定能否使用acall指令实现调用如果能使用,确定该指令的 机器码。 解: 因为acall指令首地址在0100h,而acall是 2字节指令,所以下一条指 令的首地址在0102h。0102h和0250h在同一2kb地址范围内,故可用acall 调用。调用入口地址为0250h,acall指令的机器码形式为: h。根据程序可知 a=10+9+8+7+6+5+4+3+2+1=55=37h 例 编写程序,要求读p1 端口上的信息,若不为55h,则程序等待,直到p1端口为 55h时,程序才往下顺序执行。 程序: mov a,#55h ;a=55h cjne a,p1,$ ;p1≠55h,则程序循环执行本指令 … 在实际编程中,转移的目的地址不管是addr11、addr16、还是rel ,均是一符号地 址表示的(如sjmp abc,ajmp loop…),转移的类型是通过指令的操作 符来决定的。3.子程序返回指令 ret ;从调用子程序返回。 功能:从栈顶弹出断点到pc。 reti ; 从中断服务程序返回。 功能:从栈顶弹出断点到pc,并恢复中断优先级状态触发器。2.4.2 转移指令 1. 无条件转移指令 (1)短转移 ajmp addr11 ;addr11→pc0~10 说明: ①转移范围:本指令为2kb地址范围内的转移指令。对转移目的地址的要求与 acall指令对子程序入口地址的要求相同。 ②机器码形式:本指令为2字节指令。设addr11的各位是a10a9a8…a2a1a0,则指令的 机器码为a10a9aa6a5a4a3a2a1a0。(2)长转移 ljmp addr16 ;addr16→pc0~15 说明: ①本指令为64kb程序存储空间的全范围转移指令。转移地址可为16位地址中的任 意值。 ②本指令为3字节指令02 addr16。 (3)间接转移 jmp @a+dptr ;a+dptr→pc 例 a=02h,dptr=2000h,指令jmp @a+dptr执行后,pc=2002h。也就是 说,程序转移到2002h地址单元去执行。 现有一段程序如下: mov dptr,#table jmp @a+dptr table:ajmp proc0 ajmp proc1 ajmp proc2 ajmp proc2 根据jmp @a+dptr指令的操作可知, 当a=00h时,程序转入到地址 proc0 处执行; 当a=02h时,转到proc1处执行…… 可见这是一段多路转移程序,进入的路数由a确定。因为ajmp指令是2字节指 令,所以 a 必须为偶数。 以上均为绝对转移指令,下面介绍相对转移指令。 (4)无条件相对转移 sjmp rel 例3.相对偏移量rel的求法 在相对转移中,用偏移量 rel 和转移指令所处的 地址值来计算转移的目的地址,rel 是 1 字节补码. 在填机器码时,需计算rel,下面介绍计算rel 的方法。 设 本条转移指令的首地址为as——源地址, 指令字节数为bn——2字节或3字节, 要转移的目标地址为ad——目的地址, 当前pc= as+ bn 因为在执行本条指令时,pc 已经指向了下一条指令,见下图: ad 0100 mn: ……. ….... as 0125 bf 05 rel 当前pc 0128 当前pc= as +bn=8 例 cjne r7,#06,mnmcs-51单片机指令系统中,没有停机指令,通常用短转移指令sjmp $ ($为本 条指令的首地址)来实现动态停机的操作,试写出这条指令中机器码。 解: 查附录a ,sjmp rel 的指令码为80rel 据题意 本条指令的首地址 as=$, 转移的目的地址是本条指令地址,即ad=$ 该指令为两字节,即bn=2, rel= (ad-as-bn)补= ($-$-2)补=(-2)补=feh 所以sjmp $指令的机器码是80feh。 例 计算下面程序中cjne指令的偏移量。 loop:mov a,p1 cjne a,#55h,loop 解: 由于mov a,p1是2字节指令,故cjne指令的首 地址是loop+2。又因为cjne是3字节指令,于是 有:ad=loop ,as=loop+2, bn=3 rel=[loop-(loop+2)-3]补=[-5]补=fbh 所以cjne a,#55h,loop的指令码为b455fbh。 2.4.3 空操作指令 nop 机器码 00 该指令经取指,译码后不进行任何操作(空操作)而转到下一条指令, 常用于生产一个机器周期的延时,或上机修改程序时作填充指令,以方便增减 指令。;pc+rel→pc, 即as+2+rel→pc,机器码为80 rel说明: as为源地址(本指令的首地址),该指令为2字节指令,执行本指令时 当前pc=as+2,rel 为转移的偏移量,转移可以向前转(目的地址小于源 地址),也可以向后转(目的地址大于源地址),因此偏移量rel 是 1 字节有 符号数,用补码表示(-128~+127),所以指令转移范围在离源地址as的- 126~+129字节之间。 2. 条件转移指令 (1)累加器为零(非零)转移 jz rel ;a=0 则转移(as+2+rel→pc) jnz rel ;a≠0 程序顺序执行,机器码为60rel说明: ① cjne指令都是3字节指令,作减操作,不回送结果,影响cy标志。 ② 若第一操作数大于或等于第二 操作数,则标志cy=0。若第一操作数小于第二 操作数,则cy=1。 这几条指令除实现两操作数相等与否的判断外,利用对cy的判断,还可完成两数 大小的比较。例 将a累加器的低四为取反四次、高四位不变。每变换一次,从p1输出。 方法一 加 1 计数: mov r0,#0 ;计数初值送0 ll:xrl a,#0fh ;高4位不变,低四位取反 inc r0 ;次数加1 mov p1,a ;从p1输出 cjne r0,#04,ll ;不满四次循环 ret 方法二 减1计数: mov r0,#04计数初值送4 ll: xrl a,#0fh mov p1,a djnz r0,ll ;次数减1不等于0循环 ret 例 在内部ram的40h地址单元中,有1字节符号数,编写求其绝对值后放回原单 元的程序。 程序如下: mov a,40h anl a,#80h jnz neg ;为负数转移 sjmp $ ;为正数,绝对值=原数,不 改变原单元内容 neg:mov a,40h ;为负数求补,得其绝对值 cpl a试说明以下一段程序运行后a中的结果。 mov 23h,#0ah clr a loop:add a,23h djnz 23h,loop sjmp $ inc a mov 40h,a sjmp $ 有符号数在计算机中以补码形式存放, 例如-5, 存放在内部ram中为 fbh,求补后得5, 即|-5|=5。 2.5 位操作指令 mcs-51单片机的特色之一就是具有丰富的位处理功能,以进位标志cy为位累加器 c,使得开关量控制系统的设计变得十分方便。 在程序中位地址的表达有多种方式: 1)用直接位地址表示,如d4h。 2)用“·”操作符号表示,如psw.4,或d0h.4 3)用位名称表示,如rs1。 4)用用户自定义名表示。如abc bit d4h,其中abc定义为d4h位的位名, bit为位定义伪指令。以上各例均表示psw.4的rs1位。 位操作类指令的对象是c和直接位地址,由于c是位累加器,所以位的逻 辑运算指令目的操作数只能是c,这就是位操作指令的特点。下面将位操作的 17条指令介绍如下。 1.位清零 clr clr 2.位置 1 setb setb 3.位取反 cpl c cpl bit 4.位与 anl c,bit anl c,/bit 5.位或 orl c,bit orl c,/bit 6. 位传送 mov c,bit mov bit,c 7. 位转移 位转移根据位的值决定转移,均为相对转移指令,设as为下面各指令 的首地址。cy=1,则转移(as+2+rel→pc),否则程 序顺序执行cy=0,则转移(as+2+rel→pc),否则程 序顺序执行 jb bit,(bit)=1,则转移(as+3+rel→pc),否则程 序顺序执行 jnb bit,(bit)=0,则转移(as+3+rel→pc),否则 程序顺序执行 jbc bit,(bit)=1,则转移(as+3+rel→pc),且该 位清零;否则程序顺序执行 ;cy∨(bit)→cy ;cy∨(bit)→cy ;cy ∧(bit)→cy ;cy∧(bit)→cy c bit ;1→cy ; 1→bit c bit ;0→cy ;0→bit小 结 (1)51系列单片机指令系统的特点是不同的存储空间寻址方式不同,适用的指令 不同,必须进行区分。 (2)指令是程序设计的基础,应重点掌握传送指令、算术运算指令、逻辑运算指 令、控制转移指令和位操作指令,掌握指令的功能,操作的对象和结果,对标 志位的影响,应要求熟记。 0.1.1 微机的系统结构cpu是计算机的控制核心,它的功能是执行指令,完成算数运算、逻辑运算, 并对整机进行控制。 存储器用于存储程序和数据。 输入/输出接口(又称i/o接口)是cpu和外设之间相连的逻辑电路,外设必 须通过接口才能和cpu相连。不同的外设所用接口不同。每个i/o接口也有一个 地址,cpu通过对不同的i/o接口进行操作来完成对外设的操作。 存储器、i/o接口和cpu之间通过总线相连。 用于传送程序或数据的总线称为数据总线;地址总线用于传送地址,以识别 不同的存储单元或i/o接口;控制总线用于控制数据总线上数据流送的方向、 对象等。 0.1.2 微机的基本工作原理 存储程序、执行程序是微机的工作原理,取指令,译码,执行是微机的基本 工作过程。 单片机是微型计算机的一种,是将计算机主机(cpu、存储器和i/o接口)集 成在一小块硅片上的微机,又称微控制器。它专为工业测量与设计而设计,具 有三高优势(集成度高、可靠性高、性价比高),他的特点是小而全(体积小, 功能全),主要应用于工业检测与控制、计算机外设、智能仪器、仪表、通信 设备、家用电器等,特别适合于嵌入式微型机应用系统。 0.1.3 微机的主要技术指标 微型计算机主要有如下一些技术指标: 字长:cpu并行处理数据位,由此定为8位机、16位机、32位机等。 存储容量:存储器单元数,例如256b、8kb、1mb等(1b即一个字节,也就是一 个8位二进制数,是计算机数据的基本单位)。 运算速度:cpu处理速度,它和内部的工艺结构以及外接的时钟频率有关。 时钟频率:在cpu极限频率以下,时钟频率越高,执行指令速度越快,对单片机 而言,有6mhz、12mhz、24mhz等。 0.2.1 计算机中的数 计算机中的数字电路具有两种不同的稳定状态且能相互转换, 即“0”和“1”两种 状态。 计算机处理的一切信息均用二进制数表示, 但是二进制数书写起来太长, 所以微型计算机中的二进制数都采用十六进制来缩写。 十六进制数用0~9、 a~ f等16个数码表示十进制数0~15。 为了区别十进制数、 二进制数及十六进制数3种数制, 在数的后面加一个字母 以进行区别。用b(binary)表示二进制数制;d(decimal)或不带字母表示十 进制数制;h(hexadecimal)表示十六进制数制。 表0-1 不同进位记数制对照表 二进制数和十六进制数间的相互转换 将二进制数从右(最低位)向左每4位为1组分组,若最后一组不足4位,则 在其左边添加0,以凑成4位,每组用1位十六进制数表示。如: 1b→1 11b→ 00 0111b=1fc7h 十六进制数转换位二进制数,只需用4位二进制数代替1位十六进制数即可。 如:3ab9h=11 1001b 十六进制数和十进制数间的相互转换 将十六进制数按权展开相加,如: 1f3dh=163×1+162×15+161×3+160×13 =6×15+16×3+1×13 =+48+13=7997 十进制整数转换为十六进制数可用出16取余法, 即用16不断地去除待转换的十进制 数,直至商等于0为止。将所得的各次余数,依倒叙排列,即可得到所转换的十六 进制数。如将38947转换为十六进制数,其方法及算式如下: 即h 0.2.2 计算机中数的几个概念 1.机器数与真值 机器数:机器中数的表示形式,它将数的正、负符号和数值部分一起进行二进制编 码,其位数通常为8的整数倍。 真值:机器数所代表的实际数值的正负和大小,是人们习惯表示的数。 2。数的单位 位(bit):一个二进制数中的1位,其值不是1便是0。 字节(byte):一个字节,就是一个8位的二进制数。 字(word):两个字节,就是一个16位的二进制数。; cy →cy ; bit → bit;(bit)→cy→bit例 用位操作指令实现 x=x0⊕x1,设x0为p1.0, x1为p1.1, x为acc.0。
解(1):因位操作指令中无异或指令,依据x=x0⊕x1=x0x1+x0x1用与、或指 令完成,编程如下 : x bit acc.0 x0 bit p1.0 x1 bit p1.1 ;位定义 mov c,x0 anl c, /x1 ;c=x0∧x1 mov 20h,暂存于20h 单元 mov c,x1 anl c,/x0 ;c=x0∧x1 orl c,20h ;c=x0x1+x0x1 mov x,c sjmp $ 解(2):根据异或规则,一个数与“0”异或,该数值不变;与“1”异或,该数值变反, 编程如下: mov c,x0 jnb x1, x1=0,x=c=x0 cpl c ncex:mov x,x1=1,x=c=x0 sjmp $ 双字:两个字,即四个字节,一个32位二进制数。 只有8位、16位或32位机器数的最高位才是符号位。 0.2.3 计算机中的有符号数的表示 有符号数有原码、反码和补码三种表示法。 1.原码 数值部分用其绝对值,正数的符号位用“0”表示,负数的符号位用“1”表示。如: x1=+5=+b [x1]原=b x2=-5=-b [x2]原=b 符号位 8位原码数的范围为ffh~7fh(-127~127)。原码数00h和80h的数值部分相 同、 符号位相反, 它们分别为+0和-0。 16位原码数的数值范围为ffffh~7fffh (-3)。原码数0000h和8000h的数值部分相同、符号位相反,它们 分别为+0和-0。 原码表示简单易懂,而且与真值的转换方便。但若是两个异号数相加,或两个 同号数相减,就要做减法。为了把减运算转换为加运算,从而简化计算机的结 构,就引进了反码和补码。 (2)反码 正数的反码与原码相同;负数反码:符号位不 变,数值部分按位取反。 例 求8位反码机器数: x1= +4 [x1]原= b [x1]反= b=04h x2= -4 [x2]原= b [x2]反= b = fbh (3)补码 正数的补码与原码相同;负数补码为其反码加1。 例:求 8位补码机器数: x1=+4: [x1]原=[x1]反=[x1]补= h x2= - 4: [x2]原 =
[x2]补 = [x2] 反+1= 1111100=fch 8位补码数的数值范围为-128~127 (80h~7fh) 16位补码数的数值范围为8000h~ 。 7fffh(-3)。字节80h和字8000h的真值分别是-128(-80h)和 -3h)。补码数80h和8000h的最高位既代表了符号为负,又代表了数值为1。 快速求法:将负数原码的最前面的1和最后一个1之间的每一位取反。例如 x=-4: [x]原 =
[x]补 = =fch取反 ② 两数互补是针对一定的“模”而言,“模”即计数系统的过量程回零值,例如时 钟以12为模(12点也称0点),4和8互补,一位十进制数3和7互补(因为3+7 =10,个位回零,模为101=10),两位十进制数35和65互补(因为35+67= 100,十进制数两位回零,模为102=100),而对于8位二进制数,模为28= b=100h,同理16位二进制数, 模为216=10000h由此得出求补的通用 方法:一个数的补数=模-该数,这里补数是对任意的数而言,包括正、负 数。而补码是针对符号机器数而言。 设有原码机器数x, x&0, [x]补=[x]原 当 x&0, [x]补= 模-|x| 例如对于八位二进制数: x1=+4: [x1]补= h; x2= - 4: [x2]补 = 100h-4=fch 对于16二进制位数: x2=+4: [x2]补= 0004h; x2= -4: [x2]补 = 10000h-4=fffch 几点说明: ① 根据两数互为补的原理,对补码求补码就可以得到其原码,将原码的符号位变 为正、负号,即是它的真值 例如求补码数fah的真值 。因为fah为负数求补码 [fah]补=86h=-6 例如求补码数78h的真值 。因为78h为正数求补码 [78h]补=78h=+120 ② 一个用补码表示的机器数,若最高位为0,则其余几位即为此数的绝对值;若最 高位为1,其余几位不是此数的绝对值,必须把该数求补(按位取反(包括符号 位)加1),才得到它的绝对值。如:x=-15 [-15]补=f1h=b 求补得= ③ 当数采用补码表示时,就可以把减法转换为加法。 例1:64-10=64+(-10)=54 [64]补=40h=b [10]补=0ah=b [-10]补=b 做减法运算过程: 用补码相加过程 结果相同,其真值为36h(=54)。由于数的八位限制,最高位的进位是自然丢失的 (再计算机中。进位被存放在进位标志cy中的。)用补码表示后,减法均可以用 补码相加完成。因此,在微机中,凡是符号数一律是用补码表示的。用加法器完成 加、减运算,用加法器和移位寄存器完成乘、除运算,简化计算机硬件结构。 例2: 34-68=34+(-68)=-34 34=22h=b 68=44h=b [-68]补=b做减运算过程:用补码相加过程:结果相同。因为符号位为1,对其求补,得其真值:-b,即为-34(-22h)。 由上面两个例子还可以看出, 1)用补码相加完成两数相减,相减若无借位,化为补码相加就会有进位;相减若有 借位,化作补码相加就不会有进位。 2)补码运算后的结果为补码,需再次求补才能得到运算结果的真值。 0.2.4 进位和溢出 例3 105+50=155 105=69h 50=32h 若把结果视为无符号数,为155,结果是正确的。若将此结果视为符号数,其 符号位为1,结果为-101,这显然是错误的。其原因是和数155大于8位符号数所能 表示的补码数的最大值127,使数值部分占据了符号位的位置,产生了溢出,从而 导致结果错误。又如: -105-50=-155 cy=1 两个负数相加,和应为负数,而结果b却为正数,这显然是错误的。其原 因是和数-155小于8位符号数所能表示的补码数的最小值-128,也产生了溢出。 结论:当两个补码数相加结果超出补码表示范围,就会产生溢出,导致结果错误。 计算机中设立了溢出标志位ov,通过最高位的进位(符号位的进位)cy和次高位 进位(低位向符号位的进位)cy-1异或产生。 例4 74+74=4ah+4ah
01 1 0 0 1 0 1 0
cy cy-1=0 1=1…..有溢出 ov=1 cy cy-1 无进位 cy=0 由上两例中,例3的 ov=1、cy=1,例4中ov=1、cy=0,可见溢出和进 位并非有必然的联系,这是由于两者产生的原因是不同的,两者判断的方法也 是是不同的。重述如下: 溢出ov:两个补码数相加结果超出补码表示范围而产生,ov= cy cy-1 进位cy: 当运算结果超出计算机位数的限制(8位、16位),会产生进 位,它是由最高位计算产生的,在加法中表现为进位,在减法中表现为借位。 0.2.5 bcd码 生活中人们习惯于十进制数,计算机只能识别二进制数,为了将十进制数变 为二进制数,出现了bcd码,即二进制代码表示的十进制数。故名思意,它即 是逢十进一,又是一组二进制代码。用4位二进制数编码表示1位十进制数称为 压缩的bcd码, 8位二进制数可以放2个十进制数位。 也可以用8位二进制数表示 1个十进制数位,这种bcd码称为非压缩的bcd码。十进制数和bcd码的对照 表见表0-2 表0-2 bcd编码表 例:求十进制数876的bcd码 压缩的bcd码 : [876]bcd = 10b=876h 非压缩的bcd码: [876]bcd=10b=080706h 又如,十进制数1994的压缩的bcd码=的非压缩的bcd码=.2.6 bcd码的运算 bcd码运算应该得到bcd码结果,由于计算机是按二进制运算,结果不 为bcd码,因此要进行十进制调整。调整方法为:当计算结果有非bcd码或产 生进位/借位时,加法进行 +6、减法进行 -6 调整运算。 例:计算bcd码 78+69= h + 69h + 10 0001 e1h………不调整,结果为二进制 +
+ 66h………调整, 高4位产生非bcd码+6,和低4位有半 进位+6 1 7 调整结果:147 (带进位一起)为十进制结果 例:计算bcd码 38-29= h -
- 29h fh -
- 06 低4位有半借位-6调整 高4位未产生非 bcd且无借位不调整
结果:9 在计算机中,有专门的调整指令完成调整操作。 0.2.7 ascii码 表1-3 常用字符的ascii码) 美国标准信息交换码ascii码,用8位二进制编码表示字符,用于计算机与计算 机、计算机与外设之间传递信息,每一个符号都有对应的ascii码,常用数字和字 母ascii码如表1-4所列,在程序中,字符可用ascii码表示,也可以用加引号的字 符表示,例如字符4,可以用34h表示,也可以用’4’表示,此时,它只有符号的意义, 而无数量的概念。 0.3 小 结 1.了解计算机的系统结构,明确单片机是微机的一种。 2.计算机的基本数制是二进制,所有的信息都是以二进制数的形式存放,为方便 阅读,以十六进制表示,对于二、十、十六几种进制之间的转换要求十分熟练。 3.计算机中的有符号数一律以补码表示,补码、原码。真值之间的转换要求十分 熟练。 4.计算机中的计算一律为二进制运算,符号位也参与运算,运算中会产生进位和 溢出,应明确概念,掌握判断方法 5. 编码是用一组特定的数码表示一定的字符, 计算机常用的编码有bcd码和ascii 码,应记住常用的字符编码。 特别提出的是,计算机只识别0 和1,是有符号 数还是无符号数、是补码还是原码、是bcd码、ascii码还是一般的二进制数 计算机是不能识别的,完全是人的认定,人根据不同的认定作不同的分析和处 理。例如ffh 作为无符号,它代表255,作为有符号原码,它代表-127,作为 有符号补码,它代表-1;又如32h,视作ascii码它是字符‘2’, 视作bcd码,它 是十进制数32,视作二进制数它是50…这就是根据不同的认定作不同的分析, 编程作不同的处理, 认定是bcd码, 如: 运算后加调整指令, 如果认定不是bcd 码,而是一般的二进制数,运算后不加调整指令。 &&&&
15:22:38 15:07:27 14:23:47 11:49:53 10:53:31 09:44:34 08:30:00 08:24:03 07:54:46 07:41:26

我要回帖

更多关于 单片机定时器 的文章

 

随机推荐