在讲指令系统前我们先来复习一下数制的概念。
1.十进制(decimal)
基数是10,它有10个数字符号,即0,l,2,3,4,5,6,7,8,9。其中最大数码是基数减1,即9,最小数码是0。
2.二进制(binary)
基数是2,它只有两个数字符号,即0和1。这就是说,如果在给定的数中,除0和1外还有其它数,例如 1012,它就决不会是一个二进制数。
3、十六进制(hexadecilnal)
基数是16,它有16个数字符号,除了十进制中的10个数可用外,还使用了6个英文字母。它的16个数字依次是0,l,2,3,4,5,6,7,8,9,a,b,c,d,e,f。其中a至f分别代表十进制数的10至15,最大的数字也是基数减1。
4、二进制数与十六进制数的相互转换。
(1)、二进制转换为十六进制:
整数部分,从低位开始,小数部分,从高位开始,每四位一组(不够四位的补0),转换为对应的十六进制数。
例:(1 0001 0011.1100 0111)2=(113.c7)h
(2)、十六进制转换为二进制:
将十六进制数的每一位分别转换为对应的四位二进制数。
例:(3e9d)h=(11 1110 1001 1101)b
例:( 2abe)h= 0010 1010 1011 1110b
以后我们在单片机编程方面采用十六进制,这个请大家注意了!
mcs-51系列单片机的指令系统共有111条指令,其中49条是单字节指令,45条是双字节指令,17条是三字节指令。
mcs-51的指令系统共有33个功能,用汇编编程时只需要42个助记符就能指明这33个功能操作。
1、 指令格式:mcs-51汇编语言指令格式与其他微机的指令格式一样,均由以下几部分组成:[标号:]操作码 [操作数][,操作数][;注释]
标号:又称为指令地址符号,地址的符号化,一般由1到6个字符组成,以字母开头的字母数字串,与操作码之间用冒号分开。
操作码:是由助记符表示的字符串,它规定了指令的操作功能。
操作数:是指参加操作的数据和数据的地址。
注释:是为该条指令作说明,以便于阅读。
注意:[ ]中表示为可选项。操作数可以为1、2、3个,也可以没有。
不同功能的指令,操作数作用不同,如:传送指令多数有两个操作数,写在左面的是目的操作数(表示操作结果存放的单元地址),写在右面的称为源操作数(指出操作数的来源)。操作码和操作数之间必须用空格分隔,操作数与操作数之间必须用逗号“,”分隔。带方括号项可有可无,称为可选项。操作码是指令的核心不可缺少。
2、 指令分类
mcs-51的111条指令分为下面5类:
(1) 数据传送类指令29条,分为片内ram,片外ram、程序存储器的传送指令,交换及堆栈操作指令。
(2) 算术运算类24条,分为加,带进位加,减,乘,除,加1,减1指令。
(3) 逻辑运算类24条,分为逻辑与、或、异或、移位指令。
(4) 控制程序转移类17条,分为无条件转移与调用,条件转移,空操作指令。
(5) 布尔变量操作类17条,分为数据传送、位与、位或,位转移指令。
3. 指令代码:
(1) 数据传送类
mov 传送数据
指令格式:mov a,#data;将立即数data送到累加器a中。
例:
mov p1,#11111110b;把立即数11111110b传送到p1口。
movx 片外数据存储器传送数据
指令格式:movx a,@dptr;将dptr指向的地址单元中的内容传送至a中。
例:mov dptr,#1000h;将地址1000h传送到数据指针dptr中。
movx a,@dptr;将dptr指向的地址单元(1110h)中的内容传送至a中。
movc 程序存储器传送数据
指令格式: movc a,@a+dptr;
例:mov a,#00h
mov dptr,#1000h;将地址1000h传送到数据指针dptr中。
movc a,@a+dptr;把累加器a的值和dptr的值相加得到值作为地址,把这个程序存储器的地址单元中的内容传送到a中。
(2) 算术运算指令
add 不带进位的加法类指令
指令格式:add a,#data;把立即数data和累加器a的内容相加得到的值存放到累加器a中。a+data→a
例:
setb c;让累加器c置1
mov a,#01h;a=01h
add a,#01h;a=02h
addc 带进位的加法类指令
指令格式:addc a,#data;把立即数data和累加器a的内容相加,再加上进位标志c得到的值存放到累加器a中。a+data+c→a
例:
setb c; 把累加器c置1
mov a,#01h ; a=01h
addc a,#01h; a+data+c→a ,a=03h
subb带借位的减法类指令
指令格式:subb a,#data;把累加器a的内容减去立即数data再减去进位标志c得到的值存放到累加器a中。a-data-c→a
例:
setb c; 让累加器c置1
mov a,#03h; a=03h
subb a,#01h; a=01h
inc加一指令
指令格式:inc a ;把a的内容加1再存储到a中。
例:
mov a,#01h;a=01h
inc a ;a=02h
dec 减1指令
指令格式:dec a ;把a的内容减1再存储到a中。
例:
mov a,#03h ;a=03h
dec a ;a=02h
(3) 逻辑运算指令
clr 清零指令
指令格式:clr a ;把a的内容清零再存储到a中,a=00h。
mov a,#00000001b;a=00000001b
clr a ;a=00000000b
cpl 按位取反
指令格式:cpl a ;把a的内容按位取反后再存储到a中。
例:
mov a,#00000001b;a=00000001b
cpl a ;a=11111110b
anl 按位取与
指令格式:anl a ;把a的内容按位取与后再存储到a中。
例:
mov a,#01000001b ; a=00000001b
anl a,#01001111b ; a=01000001b
orl 按位取或
指令格式:orl a ;把a的内容按位取或后再存储到a中。
例:
mov a,#00000001b ;a=00000001b
orl a,#10001111b ;a=10001111b
xrl 按位取异或,相同为0,不同为1。
指令格式:xrl a ;把a的内容按位取异或后再存储到a中。
例:
mov a,#00000001b;a=00000001b
xrl a,#00001111b ;a=00001110b
rl左移位指令
指令格式:rl a ;把a的内容按位左移后再存储到a中。
例:
mov a,#00000001b;a=00000001b
rl a ;a=00000010b
rl a ;a=00000100b
rl a;a=00001000b
rr右移位指令
指令格式:rr a ;把a的内容按位右移后再存储到a中。
例:
mov a,#00000001b ;a=10000000b
rr a ;a=01000000b
rr a ;a=00100000b
rr a ;a=00010000b
(4) 位操作指令
setb 置1指令,只能对位操作,不可以对字节操作。
指令格式:setb bit ;对位bit置1。
例:
setb p1.0 ;p1.0=1
clr 清零指令,可对位操作,也可对字节操作。
指令格式:clr bit ;对位bit置0。
setb c
mov a,#11110000b
clr c
clr a
cpl 取反,可对位操作,也可对字节操作。
指令格式:cpl bit ;对位bit取反。
setb c
mov a,#11110000b
cpl c
cpl a
(5) 控制及转移指令
ljmp 长跳转指令
指令格式: ljmp 标号;程序将跳转到标号处执行。
lcall长调用子程序指令,常与ret配合使用。
指令格式: lcall 标号;调用为标号的子程序去执行。
ret子程序返回指令。
djnz 条件转移类指令(自减一指令)
指令格式: loop:djnz r7,loop
执行分两步:
(1) 将r7的内容减一后再送到r7中。
(2) 判断r7是不是等于0
如果是等于0,顺序执行下面的程序。
如果不等于0,跳转到标号为loop的地方去执行。
例:
mov r7,#3;送循环次数。
clr a;对a清零。
loop:inc a;对a加1。
djnz r7,loop;先让r7自减1,后判断是否等于0。
;不等于0跳转,等于零往下执行。
end
运行上面的程序后累加器a的值是多少?
答案:a=03h
学完了指令系统现在我们来实战一下,一个单片机最小系统的制作
单片机最小系统制作
一、确定任务
开发单片机最小系统
二、任务分析:
该系统具有的功能:
(1)具有2位led数码管显示功能。
(2)具有八路发光二极管显示各种流水灯。
(3)可以完成各种奏乐,报警等发声音类实验。
(4)具有复位功能。
三、功能分析
(1)两位led数码管显示功能,我们可以利用单片机的p0口接两个数码管来现这个功能;
(2)八路发光二极管显示可以利用p1口接八个发光二极管实现这个功能;
(3)各种奏乐、报警等发声功能可以采用p2.0这个引脚接一蜂鸣器来实现。
(4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。
四、设计框图
五、硬件电路设计
根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。
六、元件清单的确定:
数码管:共阴极2只(分立)
电解电容:10uf的一只
30pf的电容2只
220欧的电阻9只
4.7k的电阻一只
1.2k的电阻一只
4.7k的排阻一只,
12mhz的晶振一只
有源5v蜂名器一只
at89s51单片机一片
常开按钮开关1只
紧锁座一只(方便芯取下来的,绿色的)
发光二极管(5mm红色)8只
万能板电路版15*17cm
s8550三极管一只
4.5v电池盒一只,导线若干。
七、硬件电路的焊接
按照原理图把上面的元件焊接好,详细步骤省略。
八、相关程序编写
针对上面的电路原理图,设计出本系统的详细功能:
(1)、第一个发光二极管点亮,同时数码管显示“1”。
(2)、第二个发光二极管点亮,同时数码管显示“2”。
(3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。
以上出现的是流水灯的效果
(4)、所有的发光二极管灭了,同时数码管现实“0”。
(5)、数码管显示“1”。
(6)、数码管显示“2、……”直到“9、a、b、c、d、e、f、y”。
(7)、蜂鸣器发出九声报警声后重复上面所有步骤。
(8)程序如下:
org 0000h;伪指令,定义下面的程序代码(机器代码)从地址为0000h的单元存放。
ljmp start;跳转到标号为start的地方去执行。
org 0030h;伪指令,定义下面的程序代码(机器代码)从地址为0030h的单元存放。
start:mov p1,#0feh ;点亮第一个发光二极管。
clr p2.7 ;送低电平到第一个数码管,开启数码管。
clr p2.6 ;送低电平到第二个数码管,开启数码管。
mov p0,#06h;让数码管显示“1” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0fdh;点亮第二个发光二极管。
mov p0,#5bh;让数码管显示“2” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0fbh;点亮第三个发光二极管。
mov p0,#4fh;让数码管显示“3” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0f7h;点亮第四个发光二极管。
mov p0,#66h;让数码管显示“4” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0efh;点亮第五个发光二极管。
mov p0,#6dh;让数码管显示“5” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0dfh;点亮第六个发光二极管。
mov p0,#7dh;让数码管显示“6” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#0bfh;点亮第七个发光二极管。
mov p0,#07h;让数码管显示“7” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#7fh;点亮第八个发光二极管。
mov p0,#7fh;让数码管显示“8” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p1,#00h;灭了所有的发光二极管。
mov p0,#3fh;让数码管显示“0” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#06h;让数码管显示“1” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#5bh;让数码管显示“2” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#4fh;让数码管显示“3” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#66h;让数码管显示“4” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#6dh;让数码管显示“5” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7dh;让数码管显示“6” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#07h;让数码管显示“7” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“8” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#6fh;让数码管显示“9” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“a” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“b” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“c” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“d” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“e” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“f” 。
lcall delay;调用延时子程序,起到延时的目的。
mov p0,#7fh;让数码管显示“y” 。
lcall delay;调用延时子程序,起到延时的目的。
mov r4,#9;送蜂鸣器的报警次数。
loop:setb p2.0;不发声
lcall delay;调用延时子程序,起到延时的目的。
clr p2.0;发声。
lcall delay;调用延时子程序,起到延时的目的。
djnz r4,loop;发声九次后向下执行。
setb p2.0;关闭发声
ljmp start;跳转到标号为start处执行,循环本程序。
delay:mov r7,#200;这是延时子程序。
d1:mov r6,#200
d2:mov r5,#200
d3:djnz r5,d3
djnz r6,d2
djnz r7,d1
ret;延时子程序返回指令。
end;结束伪指令。
九、利用keil c51 软件对上面的程序进行调试和编译,产生*.hex文件,以便用编程器写入单片机芯片中。
十、编程器的使用:用编程器把电脑里生成的*.hex文件写到芯片中。
十一、产品调试:通上4.5v(三节电池)的电源,可以调试本系统,如果没有错误就可以正常工作了。
职场人做饭老翻车?试试Leader冰箱,淡季依然正增长!
阅读与我,以英特尔教育为动力
ios不升级不能用!iphone老用户遭殃,惨遭抛弃
2021年十个值得关注的数据分析趋势
苹果13会升级运行内存吗
51单片机的数制和指令系统的讲解及制作一个单片机最小系统的概述
徐州一直线马达立体式车库投入使用
大数据为福州战“疫”指点迷津
工业互联网将促进我国制造业高质量发展
单相电动机和三相电动机的概念及接线方法
MEMS传感器保障汽车安全三大应用
华为云AI峰会揭示大模型实践难题
力合微PLBUS PLC电力线通信 助力智能照明产业发展
用充电站为电动汽车供电
萨科微slkor品牌的SL27517的介绍与应用
TYPE-C 转 LVDS 芯片及设计方案
赋能未来社区:数据中台智慧园区的全方位解决方案
阿里巴巴发布2019财年第三季度财报:营收破千亿,“平台效应”价值凸显
无源器件在汽车电子系统和新能源中的机遇
“超强煤矿大脑”智能视频(AI行为分析)应用