当前位置:文档之家› 单片机 逻辑运算及位操作指令 软件实验2

单片机 逻辑运算及位操作指令 软件实验2

单片机  逻辑运算及位操作指令 软件实验2
单片机  逻辑运算及位操作指令 软件实验2

实验三逻辑运算及位操作指令编程设计

一、实验目的

(1)熟悉字节逻辑运算指令功能。

(2)熟悉位操作指令运算功能。

(3)从而更深入的掌握汇编语言程序设计。

(4)学会观察CPU窗口中BIT区的变化。

二、实验内容

1.字节逻辑运算程序

在片内RAM的FIRST和SECOND单元中各有一符号数X和Y,要求按下列条件算出Z,存入RESULT单元中(设运算结果仍为8位数)。

FIRST EQU 30H

SECOND EQU 31H

RESULT EQU 32H

Ⅰ当X 为正奇数的时候,取X=15H Y=56H

分类命令行命令结果备注PC指针

START MOV R0,FIRST C:0x0000 MOV A, R0

C:0x0002

JB ACC.7, NEG 判别跳转命令,符号位

不为一,执行下面的命

判别二进制码符

号位是否=1,若

=1则跳转到NEG

命令行,若不为

一则继续下面的

命令

C:0x0003

MOV B, #2 C:0x0006 DIV AB

C:0x0009

MOV A, B

C:0x000A JZ TEMP1 判别跳转命令,不为

零,执行下面的命令

判别A中值是否

是0,若是则跳转

到TEMP1命令行,

若不是,则进行

C:0x000C

X + Y X为正奇数

X∧Y X为正偶数

X∨Y X为负奇数

Z=

X∨Y X为负偶数

下面的命令

MOV A,R0 C:0x000E

ADD A, SECOND C:0x000F

SJMP RES 跳转到RES命令行跳转命令C:0x0011 RES MOV RESULT, A 结果为6BH C:0x002A SJMP $ C:0x002C Ⅱ当X是正偶数的时候,取(30H)=14H (31H)=25H

分类命令行命令结果备注PC指针

START MOV R0,FIRST C:0x0000 MOV A, R0 C:0x0002 JB ACC.7, NEG 判别跳转命令,符号位

不为一,执行下面的命

判别二进制码符

号位是否=1,若

=1则跳转到NEG

命令行,若不为

一则继续下面的

命令

C:0x0003

MOV B, #2 C:0x0006

DIV AB

C:0x0009 MOV A, B C:0x000A JZ TEMP1 判别跳转命令,为零,

执行TEMP1的命令

判别A中值是否

是0,若是则跳转

到TEMP1命令行,

若不是,则进行

下面的命令

C:0x000C

TEMP1 MOV A,R0 C:0x0013 ANL A, SECOND

C:0x0014 SJMP RES 跳转到RES命令行跳转命令C:0x0016

RES MOV RESULT, A 结果是04H C:0x002A SJMP $ C:0x002C Ⅲ当X为一个负奇数时,取(30H)=F5H (31H)=1AH

分类命令行命令结果备注PC指针START MOV R0,FIRST C:0x0000 MOV A, R0 C:0x0002

JB ACC.7, NEG 判别跳转命令,符号位

为一,跳转到NEG命令

行判别二进制码符

号位是否=1,若

=1则跳转到NEG

命令行,若不为

一则继续下面的

命令

C:0x0003

NEG CPL ACC.7 C:0x0018

MOV B,#2 C:0x001A DIV AB

C:0x001D

MOV A,B

C:0x001E

JZ TEMP2 判别跳转命令,不为

零,执行下面的命令判别A中值是否

是0,若是则跳转

到TEMP1命令行,

若不是,则进行

下面的命令

C:0x0020

MOV A,R0

C:0x0022 ORL A,SECOND C:0x0020

SJMP RES 跳转到RES命令行跳转命令C:0x0025 RES MOV RESULT, A 结果是04H C:0x002A SJMP $ C:0x002C Ⅳ当X为负偶数时,取(30H)=F4H (31H)=1AH

分类命令行命令结果备注PC指针

START MOV R0,FIRST

C:0x0000 MOV A, R0

C:0x0002

JB ACC.7, NEG 判别跳转命令,符号位

为一,跳转到NEG命令

判别二进制码符

号位是否=1,若

=1则跳转到NEG

命令行,若不为

一则继续下面的

命令

C:0x0003

NEG CPL ACC.7

C:0x0018

MOV B,#2 C:0x001A DIV AB

C:0x001D MOV A,B C:0x001E JZ TEMP2 判别跳转命令,为零,判别A中值是否C:0x0020

执行TEMP2的命令

是0,

若是则跳转到TEMP1命令行,若不是,则进行下面的命令 TEMP2

MOV A,R0

C:0x0027

XRL A,SECOND

C:0x0028

RES MOV RESULT, A

C:0x002A

SJMP $

C:0x002C

2.位操作程序

布尔电路图如下:

分类 命令行 命令结果

备注 PC 指针

X BIT 00H

Y BIT 01H Z BIT 02H F BIT 03H

(00H)=1 (01H)=1 (02H)=1 BIT 伪命令表示位寻址,据教材表格赋值(20H)=AFH

START

MOV C, Z

C:0x0000 ANL C, /Y

C:0x0002 MOV F, C

C:0x0004 MOV C, Y

C:0x0006 ANL C, /Z

C:0x0008 ORL C, F 0 ORL O = 0 C:0x000A MOV F, C 将0赋给02H C:0x000C MOV C, X

C:0x000E ANL C, Y 1 ANL 1 = 1 C:0x0010 ORL C, /F 1 ORL 1 = 1 C:0x0012 MOV F, C

C:0x0014 SJMP $

C:0x0016

3.拆字程序

把外部数据存储器2000H单元的内容拆开,其高四位送2001H低四位,低四位送2002H 低四位,2001H、2002H高四位清零。需要检查2000H、2001H和2002H单元的内容。

赋初值:

分类命令行命令结果备注PC指针

START MOV DPTR,#2000H C:0x0000 MOVX A,@DPTR

C:0x0003

MOV B,A C:0x0004 SWAP A C:0x0006 ANL A,#0FH 屏蔽高四位C:0x0007 INC DPTR C:0x0009 MOVX @DPTR,A C:0x000A INC DPTR C:0x000B MOV A,B C:0x000C ANL A,#0FH 屏蔽高四位

C:0x000E

MOVX @DPTR,A C:0x0010 SJMP $ C:0x0011

最后结果

程序框图4.拼字程序

开始

结束

2000H内容送A

高低位交换,屏蔽高位

后送2001H

2000H内容送A

屏蔽高位后送2002H

把外部数据存储器2000H 、2001H 单元的低四位分别送2002H 高低四位。需要察看

2000H 、2001H 和2002H 单元内容。程序框图:

程序清单 赋初值 分类

命令行

命令结果

备注

PC 指针 START MOV DPTR,#2000H

C:0x0000 MOVX A,@DPTR

屏蔽高四位 C:0x0003

ANL A,#0FH

C:0x0004 SWAP A

C:0x0006 MOV B,A

C:0x0007 INC DPTR

C:0x0009

MOVX @DPTR,A

C:0x000A

ANL A,#0FH

C:0x000B

ORL A,B C:0x000D INC DPTR C:0x000F MOVX @DPTR,A

C:0x0010 SJMP $

C:0x0011

最后

结果

5.自选程序设计 三、 思考题

1.字节与位逻辑运算指令在编程上什么区别?应注意什么?

2001H 内容送A ,屏蔽高位 开 始

结 束

高低位交换,送B A 和B 或后送2002H

2000H 内容送A ,屏蔽高位

答:主要在寻址方式的不同使得命令使用不同。应当注意为逻辑运算的寻址方式是位寻址,改变的数是某一位的0或1。

2.若把两位十六进制数转换成对应的ASCII码,应如何编写程序?

答:注意高八位转化时首先要用SWAP指令,然后再判断转化。

3.采用其它方法设计第一个程序。

答:

4.如何用断点方式调试本程序?

答:在开始调试时用断点按钮和光标配合设定断点然后开始调试

8051单片机常用指令

3.2.1数据传送与交换类指令 共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为目的的操作数的指令;访问外部RAM的指令;读程序存储器的指 9.堆栈操作 3.2 分类指令 在介绍各条分类指令之前,将指令中的操作数及注释中的符号说明如下。Rn:当前指定的工作寄存器组中的Ro-R7(其中n=0,1,2,…,7)。 Ri:当前指定的工作寄存器组中的RO,R1(其中i=0,1)。 (Ri):Ri间址寻址指定的地址单元。 ((Ri)):Ri间址寻址指定地址单元中的内容。 dir:8位直接字节地址(在片内RAM和SFR存储空间中)。 #data8:8位立即数。 #datal6:16位立即数。 addrl6:16位地址值。 addrll:11位地址值。 bit:位地址(在位地址空间中)。 rel:相对偏移量(一字节补码数)。 下面介绍各条分类指令的主要功能和操作,详细的指令操作说明及机器码形式可见附录。 3.2.1数据传送与交换类指令

共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为目的的操作数的指令;访问外部RAM的指令;读程序存储器的指 令;数据交换指令以及准栈操作指令。

9.堆栈操作 PUSH dir ;SP十1-6P,(dir)一(SP) POP dir ;((SP))一dir,SP-1--P , 例1 SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP= 08H。 例2 SP=13H,(13H)= 1FH,指令POP 25H执行后,1FH压入25H地址单元,SP此时为12H。 综合例把片内RAM中50H地址单元中的内容与40H地址单元中的内容互换。方法一(直接地址传送法): MOV A ,50H

逻辑运算类指令

逻辑运算类指令 1.对累加器A的逻辑操作: CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果 相同。 CPL A ;将A中的值按位取反 RL A ;将A中的值逻辑左移 RLC A ;将A中的值加上进位位进行逻辑左移 RR A ;将A中的值进行逻辑右移 RRC A ;将A中的值加上进位位进行逻辑右移 SWAP A ;将A中的值高、低4位交换。 例:(A)=73H,则执行CPL A,这样进行: 73H化为二进制为01110011, 逐位取反即为10001100,也就是8CH。 RL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。 例:A中的值为68H,执行RL A。68H化为二进制为01101000,按上图 进行移动。01101000化为11010000,即D0H。 RLC A,是将(A)中的值带上进位位(C)进行移位。

例:A中的值为68H,C中的值为1,则执行RLC A 1 01101000后,结果是0 11010001,也就是C进位位的值变成了0,而(A) 则变成了D1H。 RR A和RRC A就不多谈了,请大家参考上面两个例子自行练习吧。 SWAP A,是将A中的值的高、低4位进行交换。 例:(A)=39H,则执行SWAP A之后,A中的值就是93H。怎么正好 是这么前后交换呢?因为这是一个16进制数,每1个16进位数字代表4 个二进位。注意,如果是这样的:(A)=39,后面没H,执行SWAP A 之后,可不是(A)=93。要将它化成二进制再算:39化为二进制是10111,也就是0001,0111高4位是0001,低4位是0111,交换后是01110001,也 就是71H,即113。 练习,已知(A)=39H,执行下列指令后写出每步的结果 CPL A RL A CLR C RRC A SETB C

51单片机位操作

C51单片机位操作方法 [日期:2010-10-21 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻) C51对位的操控能力是非常强大的。从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。这也是在各个领域中都可以看到C的重要原因。在这一节中将详细讲解C51中的位操作及其应用。 1、位运算符 C51提供了几种位操作符,如下表所示: 运算符含义运算符含义 &按位与~取反 |按位或<<左移 ^按位异或>>右移 1)“按位与”运算符(&) 参加运算的两个数据,按二进位进行“与”运算。原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1; 如下例: a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1 那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的 二进制数来进行与运算。 a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7 在实际的应用中与操作经常被用于实现特定的功能: 1.清零 “按位与”通常被用来使变量中的某一位清零。如下例: a=0xfe; //a=0b 11111110 a=a&0x55; //使变量a的第1位、第3位、第5位、第7位清零a= 0b 01010100 2.检测位 要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。 a=0xf5; //a=0b 11110101 result=a&0x08; //检测a的第三位,result=0 3.保留变量的某一位 要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。 a=0x55; //a=0b 01010101 a=a&0x0f; //将高四位清零,而保留低四位a=0x05

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

51单片机实验程序

3 3 3 用查表方式编写y=x1 +x2 +x3 。(x 为0~9 的整数) #include void main() { int code a[10]={0,1,8,27,64,125,216,343,512,729}; //将0~9 对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255 或-128~+127 之间的话就用char ,而现在的值明显超过这个范围,用int 较合适。int 的范围是0~65535 或-32768~32767 。 int y,x1,x2,x3; //此处定义根据习惯,也可写成char x1,x2,x3 但是变量y 一定要用int 来定义。 x1=2; x2=4; x3=9; //x1,x2,x3 三个的值是自定的,只要是0~9 当中的数值皆可,也可重复。 y=a[x1]+a[x2]+a[x3]; while(1); //单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。 } //结果的查询在Keilvision 软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch 的框架内双击“double-click or F2 to add”文字输入y 后按回车,右侧会显示其16 进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10 进制数。 1、有10 个8 位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的 数据(1 的个数为偶数)都要存到内RAM50H 开始的数据区中。试编写有关程序。 #include void main() { int a[10]={0,1,5,20,24,54,64,88,101,105}; // 将所要处理的值存入RAM 中,这些可以根据个人随意设定,但建议不要超过0~255 的范围。 char i; // 定义一个变量 char *q=0x50; // 定义一个指针*q 指向内部0x50 这个地址。 for(i=9;i>=0;i--) //9~0 循环,共十次,也可以用for(i=0;i<10;i++) { ACC=a[i]; //将a[i] 的值赋给累加器ACC if (P==0) //PSW0 位上的奇偶校验位,如果累加器ACC 内数值1 的个数为偶数那么P 为0,若为奇数,P 为1。这里的P 是大写的。 { *q=a[i]; q++; // 每赋一个值,指针挪一个位置指向下一个。 } } while(1); //同实验一,程序不能停。 }

51单片机基础知识 (问答题)

1、单片机的机器周期、状态周期、振荡周期和指令周期之间是什么关系? 答:一个机器周期恒等于6个状态周期或12个振荡周期,即1M=6S=12P。 2、存储器中有几个保留特殊功能的单元用做入口地址?作用是什么? 答:MCS-51系列单片机的存储器中有6个保留特殊功能单元; 作用:0000H为复位入口、0003H为外部中断0入口、000BH为T0溢出中断入口、0013H为外部中断1入口、001BH为T1溢出中断入口、0023H为串行接口中断入口。 3、开机复位后,CPU使用是的哪组工作寄存器?它们的地址是什么?CPU如何确定和改变当前工 作寄存器组? 答:开机复位后,CPU使用的是第0组工作寄存器。 它们的地址是00H~07H。CPU通过对程序状态字PSW中RS1、RS0的设置来确定和改变当前工作寄存器组。如:RS1、RS0为00则指向第0组;为01则指向第1组;为10则指向第2组;为11则指向第3组。 4、MCS-51的时钟周期、机器周期、指令周期的如何分配的?当振荡频率为8MHz时,一个单片 机时钟周期为多少微秒? 答:MCS-51的时钟周期是最小的定时单位,也称为振荡周期或节拍。一个机器周期包含12个时钟周期或节拍。不同的指令其指令周期一般是不同的,可包含有1~4个机器周期。 当振荡频率为8MHz时,一个单片机时钟周期为0.125μs 。 5、EA/V 引脚有何功用?8031的引脚应如何处理?为什么? PP 答:EA/V PP是双功能引脚: (1)EA接高电平时,在低4KB程序地址空间(0000H~0FFFH),CPU执行片内程序存储器的指令,当程序地址超出低4KB空间(1000H~FFFFH)时,CPU将自动执行片外程序存储器的指令。 (2)EA接低电平时,CPU只能执行外部程序存储器的指令。 8031单片机内部无ROM,必须外接程序存储器。因此,8031的EA引脚必须接低电平。 在对8751单片机内部的EPROM编程时,此引脚V PP外接+12V电压,用于固化EPROM程序。 6、单片机对中断优先级的处理原则是什么? 答:⑴低级不能打断高级,高级能够打断低级; ⑵一个中断以被响应,同级的被禁止; ⑶同级,按查询顺序,INT0→T0→INT1→T1→串行接口。 7、MCS-51的外部中断的触发方式有哪两种?他们对触发脉冲或电平有什么要求? 答:有电平触发和脉冲触发。

单片机-实验二-分支程序设计实验

实验二实验报告 ·

将00-99的十进制数据转换成二进制进行开关量的输入,L0灯亮 将100的十进制转换为01100010的二进制开关量进行输入,L1灯亮

将101-127的十进制转换为二进制进行开关量的输入,L2灯亮 完整的接线图

实验操作 1、正确连接实验板子和电脑,将点源接入,数据线连接到电脑的USB接口,在电脑端运行 软件,取消勾选模拟器,按照实验装置的名称正确的选择响应的系统。 2、在软件内部按照输入分支程序结构。 3、打开点源开关。 4、调整输入的各个断口的开关量,着重关注在二进制数01100010附近的变化. 5、整理实验器材。 思考题1 写出分支程序设计的要点 分支结构也成为选择结构。在程序中每个分支均为一个程序段。为分支需要,程序设计时不要忘记给程序段的起始地址赋予一个地址标号,以供选择分支使用。 这次实验使用的是一个多分支程序结构,可以通过一系列的JC\JNC\JB\JNB的判断,进行逐级分支。并且可以使用CJNE进行实现。 80C51中没有专门的多分支转移指令,可以使用的变址转移指令“JMP @A+DPTR”,但是这样的指令需要数据表格配合。 思考题2 8051单片机有几个并行口,写出各并行口的特点 8051单片机有4个并行I/O口,分别为P0\P1\P2\P3,以实现数据的并行输入与输出。 这4个并行口均是8为双向口线,各占8个引脚,在P3口线上有着引脚复用,均有第二功能信号,这些第二功能信号都是重要的控制信号,在实际使用中总是先按需要优先选用第二功能,剩下的不用的再当作口线使用。 并行可以有效的提高单片机的工作效率。 思考题3 实验中遇到的苦难 在这个实验中和实验一显著不同的是我们需要重新认识硬件与软件的配合,一些数据线的链接,点源的通断都是我们学习的要点,我们也第一次接触到了输入口和输出口相互之间的区别。 这个实验我们一定要将十进制的思维转换过来转换为二进制的思维,在机器语言中只有开关量的通断,而这个题目也是很好的应用了开关量的通断完成了这个实验。 学会了分支判断方式的编程

位及位操作指令

位及位操作指令 通过前面那些流水灯的例子,我们已经习惯了“位”一位就是一盏灯的亮和灭,而我们学的指令却全都是用“字节”来介绍的:字节的移动、加法、减法、逻辑运算、移位等等。用字节来处理一些数学问题,比如说:控制冰箱的温度、电视的音量等等很直观,可以直接用数值来表在。可是如果用它来控制一些开关的打开和合上,灯的亮和灭,就有些不直接了,记得我们上次课上的流水灯的例子吗? 我们知道送往P1口的数值后并不能马上知道哪个灯亮和来灭,而是要化成二进 制才知道。工业中有很多场合需要处理这类开关输出,继电器吸合,用字节来处 理就显示有些麻烦,所以在8031单片机中特意引入一个位处理机制。 1.位寻址区 在8031中,有一部份RAM和一部份SFR是具有位寻址功能的,也就是说这些RAM的每一个位都有自已的地址,可以直接用这个地址来对此进行操作。

图1 内部RAM的20H-2FH这16个字节,就是8031的位寻址区。看图1。可见这里面的每一个RAM中的每个位我们都可能直接用位地址来找到它们,而不必用字节地址,然后再用逻辑指令的方式。 2.可以位寻址的特殊功能寄存器 8031中有一些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除,如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON (定时器/计数器控制寄存器)、P0-P3(I/O端口锁存器)。以上的一些SFR我们还不熟,等我们讲解相关内容时再作详细解释。 3.位操作指令 MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集。在进行位处理时,CY(就是我们前面讲的进位位)称“位累加器”。有自已的位RAM,也就是我们刚讲的内部RAM 的20H-2FH这16个字节单元即128个位单元,还有自已的位I/O空间(即P0.0…..P0.7,P1.0…….P1.7,P2.0……..P2.7,P3.0……..P3.7)。当然在物理

51单片机指令

3.2 分类指令 在介绍各条分类指令之前,将指令中的操作数及注释中的符号说明如下。 Rn:当前指定的工作寄存器组中的Ro-R7(其中n=0,1,2,…,7)。 Ri:当前指定的工作寄存器组中的RO,R1(其中i=0,1)。 (Ri):Ri间址寻址指定的地址单元。 ((Ri)):Ri间址寻址指定地址单元中的内容。 dir:8位直接字节地址(在片内RAM和SFR存储空间中)。 #data8:8位立即数。 #datal6:16位立即数。 addrl6:16位地址值。 addrll:11位地址值。 bit:位地址(在位地址空间中)。 rel:相对偏移量(一字节补码数)。 下面介绍各条分类指令的主要功能和操作,详细的指令操作说明及机器码形式可见附录。 3.2.1数据传送与交换类指令 共有28条指令,包括以A,Rn,DPTR,直接地址单元,间接地址单元为目的的操作数的指令;访问外部RAM的指令;读程序存储器的指

令;数据交换指令以及准栈操作指令。 9.堆栈操作 PUSH dir ;SP十1-6P,(dir)一(SP)

POP dir ;((SP))一dir,SP-1--P , 例1 SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP= 08H。 例2 SP=13H,(13H)= 1FH,指令POP 25H执行后,1FH压入25H地址单元,SP此时为12H。 综合例 把片内RAM中50H地址单元中的内容与40H地址单元中的内容互换。方法一(直接地址传送法): MOV A ,50H 数据传送与交换类指令是各类指令中数量最多、使用最频繁的一类指令,编程时应能十分熟练地灵活运用

最新51单片机的基本端口操作

51单片机的基本端口 操作

第一章51单片机的基本端口操作 主要对单片机最简系统在实际应用中的使用方法,从简单到复杂地实现单片机最简系统的基本功能。 “点亮最简单的单片机系统”从单片机原理上介绍单片机的基本组成和最简单系统的典型电路,以及有关单片机 C51编程方法和例程。 “更加明亮的小灯”从功能上介绍如何使LED发光稳定,从原理上介绍单片机I/O口的电气特性和使用方法。 “定时亮灭的小灯”介绍如何使LED灯定时亮、灭,从单片机原理上介绍定时器的使用和编程方法。 “小灯亮灭的人工控制”从功能上介绍如何通过按键控制LED灯的亮灭,从单片机原理上介绍单片机中断的使用和编程方法。 先复习下Keil 51的操作。 1.1点亮最简单的单片机系统 常用MCS-51系列单片机引脚功能说明

提问:什么是单片机系统、 提问:单片机中晶振有什么作用? 回答:单片机访问一次存储器的时间,称之为一个及其周期, 是一个时间基准。一个机器周期包括12 个时钟周期。如果一个单片机选择了12MHz 晶振,它的时钟周期是 1/12us ,它的一个机器周期是 12X (1/12us ),也就是 1us 。 若是12MHz 的晶振,当单片机中定时 /计数器的数值加 1时,实际经过的时间就是 1us 。 提示:晶振电路,复位电路

基本电路图: 发光二极管导通压降通常为1.7V-1.9V; 为什么要接电阻? 电路原理及器件选择? 89C51:单片机,控制发光二极管亮灭 OSC:晶振,在本例中选择12MHz的立式晶振C3,C2:晶振电路的起振电容,容值为22pF

L1:发光二极管 R1:限流电阻,阻值为1k欧 地址分配和连接? P1.0:与发光二极管电路相连,控制LED发光二极管阴极的电平高低 RESET:复位引脚 X1,X2:单片机的晶振引脚 程序设计: 延时程序:我们先不使用单片机的定时器,而是直接采用软件的延时程序定时控制发光二极管的亮灭。在12M晶振时,一个指令周期为1us,那么1M次就是1s。 程序代码: #include sbit gate=P1^0; //位定义 void main(void) { unsigned int i,j; while(1) { for(i=1000;i>0;i--) //双重循环,延时约1s

北京交通大学单片机实验程序报告

单片机实验程序

实验二8155并行I/O口扩展和动态扫描程序编制 1.实验目的 (1)掌握8155并行I/O芯片扩展和使用方法 (2)掌握数码管动态扫描汇编语言的编制方法 2.预习要点 (1)8155芯片基础知识 (2)51单片机的总线时序、地址译码的原理 (3)数码管动态扫描显示方法 3.实验设备 计算机、单片机实验箱。 4.实验内容 基本要求: 通过实验板的上的8155(U16)显示电路(在电路板上已经固定连接字形和字位控制线的8155部分),并通过跳线确定8155的地址,在8个LED数码管上依次动态显示数字1~8。 扩展要求: 假定30H~33H的存储单元内容为4个字节16进制数,请依序将他们显示在8个LED数码管上 根据程序要求做如下程序流程图: 主程序流程图:

显示子程序流程框图: 基本要求编程如下: ORG 0000H

AJMP MAIN ORG 0050H MAIN: MOV SP,#60H ;压栈 MOV DPTR, #4100H MOV A,#0FH ;方式控制字0FH送A MOVX @DPTR, A ;8155初始化 MOV 70H,#01H ;设置显示缓冲区 MOV 71H,#02H MOV 72H,#03H MOV 73H,#04H MOV 74H,#05H MOV 75H,#06H MOV 76H,#07H MOV 77H,#08H LOOP: ACALL DISPLAY ;循环调用显示子程序AJMP LOOP DISPLAY: MOV R0,#70H ;显示缓冲区首地址送R0 MOV R3,#0FEH ;字位控制初值送R3

51单片机汇编指令集

1)数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; (2)算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; (3)逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; (4)控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移; DJNZ (Decrement Jump if Not Zero)减1后不为0则转移; JZ (Jump if Zero)结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移;

单片机指令英文全称

51单片机汇编指令集(指令集带英文翻译) 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX(Move External RAM)对外部RAM的数据传送; XCH(Exchange)字节交换; XCHD(Exchange low-order Digit)低半字节交换; PUSH(Push onto Stack)入栈; POP (Pop from Stack)出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC(Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap)低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移; DJNZ (Decrement Jump if Not Zero)减1后不为0则转移; JZ (Jump if Zero)结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移; JC (Jump if the Carry flag is set)有进位则转移;

单片机实验二

单片机实验报告(二) 姓名:赵苑珺 学号:090250129

实验三程序设计(二) 一、实验目的 1、了解汇编语言程序设计与调试的过程; 2、掌握循环程序、查表程序和子程序的特点及设计。 二、实验内容 1、循环程序的设计、输入、调试和运行; 2、查表程序的设计、输入、调试和运行; 3、子程序的设计、输入、调试和运行。 三、实验步骤 1、排序程序:将N 个数从小到大排列起来。 设R0 的内容为数据区的首地址,R7 的内容为数据的字节数。参考程序为:MOV R0,#30H ;将序列首地址存入R0中 MOV R7,#10 ;将序列长度存入R7中 SS: MOV A,R7 MOV R2,A MOV 60H,R0 ;将序列首地址存入60H NN: DEC R2 ;循环程序,控制排序次数 MOV A,R2 MOV R3,A MOV R0,60H L1: MOV A,@R0 ;将序列第一个数存入A中 INC R0 ;R0加1,指向第二个位置 CLR C ;清除进位标志位C,为比较两数大小做准备 SUBB A,@R0 ;第一个数减去第二个数 JC MM ;判断C的状态,1(代表数1小于数2)跳至MM,0(代表数 1大于数2)继续执行 MOV A,@R0 ;将第二个数存入累加器A中 DEC R0 ;R0指向第一个位置 XCH A,@R0 ;将A中的数(数1)与R0指向的数(数2)交换 INC R0 ;R0减一,指向位置一 MOV @R0,A ;将A中的数2存到位置一内 SETB F0 ;置位用户标志位,表示有交换 MM: DJNZ R3,L1 ;R3减一不为零则跳至L1,否则继续执行程序 MOV A,R2 CJNE R2,#01H,L2 ;判断R2中的数是否已经减为1,是跳至JJ,否跳至L2 SJMP JJ L2: JB F0,NN ;判断F0状态,若为1(有交换)则跳至NN,否则继续进行JJ: MOV R0,60H ;将序列首地址存入R0 END

80C51单片机的复位标志位的实现

80C51单片机的复位标志位的实现 设置复位标志位便于区分不同原因引发的复位,作为一种新技术被越来越多的新型单片机所采纳。例如Philips公司的P87LPC700和 P89LPC900系列、Freescale公司(原Motorola半导体部)的MC68HC05系列和MC68HC08系列、Sunplus公司的 SPMC65系列、Microchip公司的PIC系列等,内部都设计了专门用于记录各种复位标志的状态寄存器。 MC68HC08系列有一个复位状态寄存器,负责记录6种复位标志位:上电复位、引脚复位、看门狗复位、非法指令复位、非法地址复位和欠压复位。SPMC65系列有一个系统控制寄存器,负责记录5种复位标志位:上电复位、外部复位、看门狗复位、非法地址复位和欠压复位。51兼容的P89LPC900系列有一个复位源寄存器,负责记录6种复位标志位:欠压复位、上电复位、外部复位、看门狗复位、软件复位和UART收到间隔字符复位(主要作为进入ISP监控程序的途径之一)。就连初学者很常用的 AT89S51/52和P89C52X2,也在其电源控制寄存器PCON中增设了一个上电标志位POF。 1 复位标志位的设置方法 传统的80C51单片机没有设计复位标志位的记录功能,这应该说是一种遗憾,那么能否通过一定的技术手段来弥补这个缺憾呢?这里给广大80C51单片机用户提供一种启示和引导。 实现复位标志位的记录肯定需要一定的硬件电路支持,而这种电路的设计不存在固定模式。

应用了一个4输入端“与非”门G1和一个按钮开关SW1,还占用了80C51的5条I/O引脚P1.0~P1.4以及一个外部中断源 INT0,并且预先通过初始化软件设置INT0为唯一的高级中断源,下降沿触发方式有效,开放总中断使能位EA。平时G1因各输入端都维持在高电平上,因而其输出端也保持高电平。电路中利用了一个海量电容器C1作为储存能量的器件,扮演着备用电池的角色。由于二极管D1的存在,在主电源断电期间,C1仅为单片机供电,应该让这时的80C51进入耗能最低的停机状态(PD模式)。 在图1电路的基础上配合必要的用户软件,就可以在7种不同复位源引起复位之后保存6个标志位来记录7种复位标志,以下分别进行讲解。可以事先在RAM的位寻址区间分配一个字节,例如20H 单元,用于记录6个复位标志位。 假设该寄存器定名为SRFR(System Reset Flag Register),字节地址为20H,8位当中仅利用了6位,bit5~bit0分别记录人工复位、欠压复位、看门狗复位、非法地址复位、软硬件复位和软件复位。 ① MRST:人工复位。当复位按钮SW1被按下时引发INT0中断;在中断服务程序中检测输入引脚P1.4的状态。如果P1.4=0,则置位MRST,记录下曾经发生了一次人工复位操作。然后进行一次主动的复位操作,方法是从输出脚P1.0输出一个低电平给MAX813L的输入引脚MR,经 MAX813L延时后从输出端RESET送出高电平复位信号给80C51,令其进行一次硬件复位操作。

单片机实验程序

一 #include #include #define uchar unsigned char sbit H1=P3^6; sbit H2=P3^7; sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff}; tab2[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3b,0x37,0x2f,0x1f}; tab3[]={0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; tab4[]={0x1f,0x2f,0x37,0x3b,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f}; void Delay1s() //@11.0592MHz { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=250;k>0;k--) } void delay20ms() { unsigned char i,j; for(i=100;i>0;i--) for(j=60;j>0;j--); } void flick() { uchar d; while(d<=2) { P2=0x00; P3=0xc3; Delay1s(); P2=0xff; P3=0xff; Delay1s(); d++; } } void main() { uchar b,y,n; flick();

51单片机的16位和8位的运算不准

51单片机的16位乘以8位乘法运算可能会出现问题: 例如2927 * 17 = 49759; 但是在51中2927 * 17 和2927 * 1.7 * 10的结果并不同,后者是对的。 /******************************************************************** * 文件名:A_SHUMA.c * 创建人:zhongbaohua,2012年6月10日 天津工业大学电气工程与自动化学院 * 版本号:1.0 ********************************************************************* **/ #include #include #define uchar unsigned char #define uint unsigned int /****本地变量定义**************************************/ sbit duan = P2^2; uchar code d_table[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x 71,0x00}; // 0, 1. 2, 3, 4, 5, 6, 7, 8, 9, uchar code w_table[4] = {0xfe,0xfd,0xfb,0xf7}; unsigned int disbuff[4] = {0}; unsigned long int diatance = 0; /************本地变函数定声名**************************************/ void delay_ms(uint del); void display(uchar w,uchar d); void Display(); /************本地main函数******************************************/ void Main(void) { unsigned int i = 0; duan = 1; P0 = 0x00; delay_ms(1); duan = 0; while(1) {

单片机实验二 中断程序

实验二:中断 一、实验要求 实验目的:学会使用uVision 4和Proteus软件进行单片机汇编语言和C语言程序设计与开发;了解和掌握MCS-51单片机的中段组成、中断控制工作原理、中断处理过程、外部中断的中断触发方式,掌握中断功能的编程方法。 实验内容:单片机的P1.0引脚接LED指示灯D0;P3.2接按键开关K作为中断源可每次案件都会触发INT0中断;在INT0中断服务程序中将P1.0端口的信号取反,是LED指示灯D0在点亮和熄灭两种状态间切换,产生LED指示灯由按键K控制的效果。 二、实验原理 中断服务程序的设计主要包括两部分:初始化程序和中断服务程序。 初始化程序主要完成为响应中断而进行的初始化工作。这些工作主要有:中断源的设置、中断服务程序中有关工作单元的初始化和中断控制的设置等。 中断源的设置与硬件设计有关,各中断请求标志由存储器TCON和SCON中有关标志位来表示,所以中断源的初试化工作主等要有初试化各中断请求标志和请求外部中断信号的类型。 中断服务程序通常由现场保护、总段处理和恢复现场三个部分组成。MSC-51单片机所做的断电保护工作是很有限的,只保护了一个端点地址。所以如果在主程序中用到如A、PSW、DPTR和R0~R7等寄存器,而在中观程序中又要用他们,这就要保证回到主程序后,这些寄存器还要回复到未执行中断前的内容。在运行中断处理程序前,将中断处理程序中用到的寄存器内容先保存起来,这就是所谓的“现场保护”。好糊A、PSW、DPTR等内容,通常可用压入堆栈命令(PUSH)指令,对保护R0~R7等寄存器可用改变工作寄存器区的方法。 中断处理结束后,将中断处理程序中用到的寄存器内容恢复到中断前的内容,即“恢复现场”。恢复现场要与保护现场操作配合使用。 三、程序设计 1、程序流程图

51单片机堆栈操作指令举例说明

什么是堆栈?MCS-51单片机的堆栈怎样设置的? 答:程序设计时,往往需要一个后进先出的RAM区,以保存CPU的现场。这种后进先出的缓冲区,就称为堆栈。 MCS-51单片的堆栈原则上设在内部RAM的任意区域内。但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。51单片机堆栈操作指令举例说明 时间:2009-03-02 18:46来源:未知作者:牛牛点击:149次 这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP 所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。 堆栈操作指令有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。推入指令的执行过程是,首先将SP中的值加1,然后把SP 中的值当作地址,将direct中的值送进以 堆栈操作指令有两条: PUSH direct POP direct 第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。推入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。例: MOV SP,#5FH MOV A,#100 MOV B,#20 PUSH ACC

51单片机为什么是8位机呢

51单片机属于8位机 1、处理能力的概念。 51单片机属于8位机,8位是个什么意思呢?就是CPU处理的数据是8位的。位数的高低体现了CPU处理能力的强弱。4位的处理器已经基本淘汰了,8位的处理器占据了低端单片机的大部分市场,32位处理器是现在兴起的嵌入式系统的主流配置,我们常用的电脑大多都是32位,64位的处理器也有,但是市场份额比较少,价格也较高。所以我们学习的51单片机属于比较低级的单片机,会逐渐被新兴的嵌入式处理器所淘汰,但是51单片机成本低,学习资源最丰富,上手容易,对于初学者来说是很理想的用于学习的单片机。 2、存储器问题。 51单片机有两类存储器,一类是程序存储器ROM,它断电以后数据不丢失,但是必须用编程器擦除和写入程序;另一类是数据存储器RAM,它断电以后数据会丢失,但是可以用程序改写内容。以AT89C51为例,因为它有16条地址线(P0和P2),所以它可以访问64K存储器空间(2的16次方是65535),它的ROM和RAM都是分内外的,外部存储器都需要扩展,扩展方法参见教材。但是ROM和RAM 的内外执行方式不同,ROM的内外切换要用EA脚(31脚)的电平选择,而RAM 的切换可以直接用不同指令MOV和MOVX分开同时访问。例如AT89C51有4K内部ROM,64K外部ROM,如果EA=1,则从内部ROM开始执行,当超出4K之后,跳转到片外4K以上的空间运行;如果EA=0,则完全在外部ROM中运行,内部ROM不再起作用。什么意思呢?就是要么运行内部4KROM要么运行外部4KROM,内外ROM 的前4K不能同时运行,必须用EA切换。所以一般在没有外部ROM的情况下,EA 必须接电源正极,否则程序不能运行。我曾经因为EA悬空造成程序无法运行,苦苦思索一周才找到原因,期间因为盲目测试导致3块AT89C51损坏,教训十分惨痛,望后来者吸取教训。RAM就不同了,AT89C51有128B内部RAM,可以扩展64K外部RAM,这两个部分的RAM可以同时被访问,注意选择不同指令即可,访问内部用MOV,访问外部用MOVX,外部RAM扩展方法参见教材。ROM的种类除了常见的PROM(可编程ROM),还有MASK ROM、FLASH ROM 和EEPROM等种类。MASK ROM是掩模存储器,掩模的意思就是工厂把程序直接做在芯片上了,适于不需要反复修改的大批量产品生产,成本非常低,但是用户不能更改程序,8051里就是这种ROM。我最初接触单片机的时候,去电子市场买8051,结果商家真的卖给我了一块,回家一看,里面全都是程序,根本无法修改,现在回想起来,自己简直是个傻瓜,哪有买掩模ROM的单片机做学习和开发的?!商家也不告诉我已经烧好的程序可以干什么,害的我只能拿它当8031使了!这个教训真是好笑,希望大家一定要搞明白ROM的种类区分。PROM有OTP(一次性编程)和允许反复擦写(用紫外线照射擦除)两种,87C51系列就是OTP的ROM;就现在的形势看,ROM有普及FLASH之势,那些用紫外线擦除的垃圾看来是要被淘汰了。FLASH ROM可以电擦写,但必须整块擦除,写入速度快,擦写次数在1000到10万次之间(视不同类型芯片而定),事实上89C51系列的ROM就是FLASH ROM,U盘内的ROM也是,一种NAND FLASH现在广泛用于嵌入式系统中,它的存储容量大,成本低,可以实现固态硬盘的功能;EEPROM是电可擦写存储器,它是按

相关主题
文本预览
相关文档 最新文档