AT89C51实验报告.docx
《AT89C51实验报告.docx》由会员分享,可在线阅读,更多相关《AT89C51实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
AT89C51实验报告
实验一MCS-51指令系统实验——数据排序
一、实验目的
熟悉MCS-51指令系统,掌握程序设计方法;加深对内部存储器读写的认识;熟悉仿真开发环境,学会源程序的编写、汇编/编译、调试;熟悉单片机硬件实验系统以及良好的实验习惯培养等;学会检查结果的正确性。
二、实验内容
将程序存储器的一个列表中的10个单字节无符号数据传送到内部RAM,然后用冒泡法对其按从小到大的次序重新排列,并送到外部RAM以8000H开始的地址单元内。
三、实验说明
有序的数列更有利于查找。
本程序用的是“冒泡排序”法,算法是将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在数列的最后面。
再进行下一轮比较,找出第二大数据,直到全部数据有序。
四、程序流程图
五、调试程序
;第一步:
将程序存储器的一个列表中的10个单字节无符号数据传送到内部RAM40H~49H单元中。
ORG0000H
LJMPSTART1
ORG0030H
START1:
MOVR0,#40H;设置R0为内部RAM首地址
MOVR1,#10;设Rl为计数器
MOVDPTR,#TAB1
LOOP1:
CLRA;累加器清零
MOVCA,@A+DPTR;外部数据送累加器A中
MOV@R0,A;送内部RAM
INCR0;调整内部RAM指针,指向下一个数据
INCDPTR;调整外部RAM指针
DJNZR1,LOOP1;未完继续
;第二步:
排序。
把片内RAM40H~49H单元中的10个无符号数逐一比较,并按从小到大的顺序依次排列在这片单元中。
START2:
CLRF0;清除交换标志位F0
MOVR3,#9;10个数据循环次数
MOVR0,#40H;数据存放区首址
MOVA,@R0;取前数
L2:
INCR0
MOVR2,A;保存前数
SUBBA,@R0;前数减后数
MOVA,R2;恢复前数
JCL1;顺序则继续比较
SETBF0;逆序则建立标志位
XCHA,@R0;前数与后数交换
DECR0;指向前数单元
XCHA,@R0
INCR0;仍指向后数单元
L1:
MOVA,@R0;取下一个数
DJNZR3,L2;依次重复比较
JBF0,START2;交换后重新比较
;第三步:
将内部数据RAM中40H~49H单元的内容传送到外部数据存储器以8000H开始的连续单元中去。
;40H~49H共计10个单元,需传送10次数据。
将Rl作为循环计数器。
具体程序如下。
START3:
MOVR0,#40H;设置R0为内部RAM首地址
MOVDPTR,#8000H;设置外部RAM首地址
MOVR1,#10;设Rl为计数器
LOOP:
MOVA,@R0;取内部RAM数
MOVX@DPTR,A;送外部RAM
INCR0;调整内部RAM指针,指向下一个数据
INCDPTR;调整外部RAM指针
DJNZR1,LOOP;未完继续
SJMP$;暂停
TAB1:
DB09H,04H,02H,08H,00H;数0-9表
DB00H,06H,07H,07H,0FH
END
六、收获与体会
第一次用汇编语言在伟福6000环境下运行,感觉和VC6.0稍有不同,伟福6000调试界面非常丰富,有片内RAM——DATE;片外RAM——XDATE;代码寄存器——CODE;特殊功能寄存器——SFR;
并且可以单步调试,自己所编的程序一目了然;伟福6000果然是好东西;
冒泡法存在的不足及改进方法:
第一,在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志单元flag,将其设置为OFF,表示被排序的表示是一个无序的表。
在每一排序开始时,检查此标志,若此标志为0,则结束排序;否则进行排序;
第二,当排序的数据比较多时排序的时间会明显延长。
改进方法:
快速排序:
具体做法:
任意选取某一记录(通常取第一个记录),比较其关键字与所有记录的关键字,并将关键字比它小的记录全部放在它的前面,将比它大的记录均存放在它的后面,这样,经过一次排序之后,可将所有记录以该记录所在的分界点分为两部分,然后分别对这两部分进行快速排序,直至排序完。
实验二I/O口输入输出实验
一、实验目的
学习P1口作为输出/输入方式使用的方法;掌握延时子程序的编写和使用;
二、实验内容
(1)P1口做输出口,接8个发光二极管,编写程序,使发光二极管循环点亮。
(2)P1.0~P1.3口做输入口,接4位拨码开关;P1.4~P1.7做输出口,接4个发光二极管。
编写程序读取P1口低四位的开关量输入状态,输出到P1口的高四位,由二极管指示出来。
三、实验流程图
(1)P1口循环点灯程序框图
(2)P1口输入输出程序框图
四、调试程序
(1)、P1口循环点灯程序
ORG0000H
LJMPSTART
ORG0030H
START:
MOVA,#01H;位初值
LOOP:
MOVP1,A;输出
LCALLDELAY;延时
RLA;左移下一位
LJMPLOOP
DELAY:
MOVR5,#20;延时子程序,延时0.2秒
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
(2)、P1口输入输出程序
ORG0000H
LJMPSTART
ORG0030H
START:
MOVA,P1
ANLA,#0FH;P1用作输入口时,必须置1,否则读入的数可能出错
;可用半字节交换指令SWAPA再赋值给P1
RRA;P1.0~P1.3口做输入口,接4位拨码开关
RRA;P1.4~P1.7做输出口,接4个发光二极管
RRA
RRA
ORLA,#0FH;P1用作输入口时,必须置1,否则读入的数可能出错
MOVP1,A
SJMPSTART
END
五、收获与体会
这次试验做的是I/O口的输入输出,这个实验以以小见大的手法,将单片机的功能表现的淋漓尽致;只要我可以使它一个灯亮,我就可以控制全部外围设备;这样的感觉太爽了;果真是其乐无穷,“给我一个支点,我可以撬动整个地球”;
P1口是准双向口。
它作为输出口时与一般的双向口使用方法相同。
由准双向口结构可知当P1口用为输入口时,必须先对它置“1”。
若不先对它置“1”,读入的数据是不正确的。
实验三定时器/计数器实验
一、实验目的
了解MCS-51单片机中定时器/计数器的基本结构、工作原理和工作方式,掌握工作在定时器和计数器两种方式下的编程方法。
二、实验内容
(1)定时器实验:
在使用6MHz晶振的条件下,用定时器1产生10ms定时,由P1.0口输出周期为2s的方波信号,并通过发光二极管指示P1.0的输出波形。
(2)定时器实验(选作):
在使用6MHz晶振的条件下,用端口输出不同频率的脉冲(不同频率的脉冲用定时器实现),控制蜂鸣器发出“DoReMiFaSolLaSiDo”不同音调(这些音调的频率可以参考书中P142的表6-3)
(3)计数器实验:
按计数器模式和方式2工作,对P3.4(T0)引脚进行计数。
将其数值按二进制数在P1口驱动LED灯上显示出来。
三、实验说明
1、关于内部计数器的编程主要是定时常数的设置和有关控制寄存器的设置。
内部计数器在单片机中主要有定时器和计数器两个功能。
本实验使用的是定时器。
2、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
TMOD用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
3、内部计数器用作定时器时,是对机器周期计数。
每个机器周期的长度是12个振荡器周期。
因为实验系统的晶振是6MHZ,本程序工作于方式2,即8位自动重装方式定时器,定时器100us中断一次,所以定时常数的设置可按以下方法计算:
机器周期=12÷6MHZ=2uS
(256-定时常数)×2uS=100us
定时常数=206.然后对100us中断次数计数10000次,就是1秒钟.
4、在例程的中断服务程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。
四、实验流程图
主程序框图定时中断子程序框图
五、调试程序
(1)、定时器实验
中断方式
ORG0000H
RESET:
LJMPMAIN
ORG001BH
LJMPIT1P
ORG0100H
MAIN:
MOVSP,#60H;定义堆栈区
MOVB,#100
MOVTMOD,#10H;定时方式1
MOVTL1,#78H;用定时器1产生10ms定时(初值)
MOVTH1,#0ECH;用定时器1产生10ms定时(初值)
SETBTR1;运行控制
SETBET1;允许中断
SETBEA
HERE:
SJMPHERE
IT1P:
MOVTL1,#78H;重新负初值
MOVTH1,#0ECH
DJNZB,LOOP
CPLP1.0;P1.0口输出周期为2s的方波信号
MOVB,#64H;P1.0口输出周期为2s的方波信号
LOOP:
RETI
END
(2)查询方式
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVB,#64H
MOVTMOD,#10H
MOVTL1,#78H;用定时器1产生10ms定时
MOVTH1,#0ECH;用定时器1产生10ms定
SETBTR1
LOOP0:
JBCTF1,LOOP1
AJMPLOOP0
LOOP1:
MOVTL1,#78H;用定时器1产生10ms定时
MOVTH1,#0ECH
DJNZB,LOOP0
CPLP1.0;P1.0口输出周期为2s的方波信号
LJMPMAIN
SJMP$
END
(2)定时器实验(选作)
;蜂鸣器发出"DoReMiFaSolLaSiDo"不同音调
ORG0000H
LJMPMAIN
ORG001BH
LJMPINT1
ORG0030H
MAIN:
MOVSP,#30H
MOVTMOD,#10H;设T1工作方式1
MOVIE,#88H;允许中断
LOOP1:
MOV40H,#00H;简谱码指针清0
LOOP2:
MOVA,40H
MOVDPTR,#TABLE1
MOVCA,@A+DPTR;取简谱码
MOVR1,A
JZFINISH;简谱码是00H,转移
ANLA,#0FH
MOVR2,A
MOVA,R1
SWAPA
ANLA,#0FH
JNZSING;唱名码不是00H,转移
CLRTR1;唱名码是00H,则不发音
SJMPWY;
SING:
DECA;唱名码减1
MOV50H,A
RLA
MOVDPTR,#TABLE2;取唱名码高8位
MOVCA,@A+DPTR
MOVTH1,A
MOV51H,A
MOVA,50H
RLA
INCA
MOVCA,@A+DPTR;取唱名法低8位
MOVTL1,A
MOV52H,A
SETBTR1
WY:
LCALLDELAY;调用基本单位时间(1/4拍)
INC40H
SJMPLOOP2;取下一个简谱码
FINISH:
CLRTR1
SJMPLOOP1;重复播放
ORG0100H;基本单位时间子程序
DELAY:
MOVR4,#200
LP1:
MOVR5,#232
DJNZR5,$
DJNZR4,LP1
DJNZR2,DELAY;节拍数未到,转移
RET
ORG0150H
INT1:
PUSHACC
PUSHPSW
MOVTL1,52H;重置定时器初值
MOVTH1,51H
CPLP1.0
POPPSW
POPACC
RETI
ORG0200H
TABLE1:
DB42H,53H,62H,73H,84H;简谱码表;高4位唱名码;低4位节拍码
DB93H,0A4H,43H
DB00H
ORG0250H
TABLE2:
DW0FD82H,0FDC8H,0FE06H;唱名码表
DW0FE22H,0FE56H,0FE85H
DW0FE9AH,0FEB2H,0FEE4H
DW0FE03H,0FE11H,0FE2BH
DW0FF42H,0FF4DH,0FF61H
END
(3)计数器实验
ORG0000H
LJMPMAIN
ORG0040H
MAIN:
MOVTMOD,#06H
MOVTL0,#00H
MOVTH0,#00H
SETBTR0
LOOP:
MOVA,TL0
MOVP1,A
AJMPLOOP
END
六、收获与体会
外部事件计数脉冲由P3.4引入定时器T0。
单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。
这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。
同时这就决定了输入波形的频率不能超过机器周期频率。
定时器:
在所规定的时间点完成某种操作,多采用系统时钟。
计数器:
在某种操作完成到指定程度时去执行另一种操作。
应用十分广泛,电磁继电器、计数器等。
实验四外部中断实验
一、实验目的
学习外部中断技术的基本使用方法;学习中断处理程序的编程方法。
二、实验内容
通过按键产生单脉冲作为中断源,触发外部中断,在中断处理程序中对输出信号进行反转,由P1.0口输出信号,使发光二极管点亮或熄灭。
三、实验电路及连线
连线
连接孔1
连接孔2
1
P1.0
L0
2
单脉冲输出
INT0
四、实验说明
中断服务程序的关键是:
1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。
2.必须在中断程序中设定是否允许中断重入,即设置EXO位。
本例中使用了INTO中断,一般中断程序进入时应保护PSW,ACC以及中断程序使用但非其专用的寄存器。
本例的中断程序保护了PSW,ACC等三个寄存器并且在退出前恢复了这三个寄存器。
另外中断程序中涉及到关键数据的设置时应关中断,即设置时不允许重入。
本例中没有涉及这种情况。
INTO(P32)端接单次脉冲发生器。
P1.0接LED灯,以查看信号反转.
五、实验流程图
主程序框图外部中断子程序框图
六、调试程序
ORG0000H
LJMPMAIN
ORG0003H
LJMPINTP
ORG0050H
MAIN:
SETBEA
SETBEX0
SETBIT0
SJMP$
ORG0080H
INTP:
CLREA
CPLP1.0
SETBEA
RETI
END
七、收获与体会
中断服务程序的关键是:
1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。
2.必须在中断程序中设定是否允许中断重入,即设置EXO位。
定时器/计数器控制寄存器TCON、
串行口控制寄存器SCON、
中断允许寄存器IE、
中断优先级寄存器IP
工作方式控制寄存器TMOD、
电源控制寄存器PCON
实验五串行通信实验
一、实验目的
(1)了解MCS-51单片机串行口(UART)的结构、PC机串行通信的基本要求、串行通信的原理和数据交换过程,掌握单片机与单片机间以及单片机与PC机间进行串行通信的编程方法。
(2)掌握存储器扩展接口电路的设计方法;掌握单片机内部RAM和外部RAM之间数据传送的特点。
二、实验内容
单片机之间串行通信实验:
甲机将存储在片外RAM的一组立即数(00H~0FH)通过串口发送到乙机,乙机接收到后保存到片外RAM中,串口采用工作方式1,波特率为4800。
晶阵为6MH
三、实验电路
甲方乙方
连线
连接孔1
连接孔2
1
甲方TXD
乙方RXD
2
甲方RXD
乙方TXD
3
甲方GND
乙方GND
4
KEY/LED_CS
CS0
四、实验说明
1、8051的RXD、TXD接线柱在POD51仿真板上。
2、通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。
五、实验框图
六、调试程序
;甲机发送
ORG0000H;甲机发送程序
LJMPMAINA
ORG0023H
AJMPSA;串口中断
ORG0100H
MAINA:
MOVSP,#60H;设置堆栈指针
MOVSCON,#40H;设置串行方式1
MOVTMOD,#20H;使用定时器T1的方式2
MOVTL1,#0FDH;设置波特率为4800
MOVTH1,0FDH
MOVPCON,#00H;电源控制
SETBTR1;TCON控制
SETBEA;IE控制
SETBES
MOVDPTR,#0030H;取片外RAM的一组立即数首地址
MOVR0,#00H;设计数初值为0
MOVXA,@DPTR;取发送数据
MOVSBUF,A;启动串行口
SJMP$;等待中断
SA:
CLRTI;清发送中断标志
CJNER0,#0FH,LOOPA
CLRES;接收完关串行口中断
AJMPENDA
LOOPA:
INCR0;计数指针加1
INCDPTR;地址指针加1
MOVXA,@DPTR;取发送数据
MOVSBUF,A;启动串行口
ENDA:
RETI;中断返回
END
;乙机接受
ORG0000H;乙机接受程序
LJMPMAINB
ORG0023H
AJMPSB;串口中断
ORG0100H
MAINB:
MOVSP,#60H;设置堆栈指针
MOVSCON,#50H;设置串行方式1,允许串行接收位
MOVTMOD,#20H;使用定时器T1的方式2
MOVTL1,#0FDH;设置波特率为4800
MOVTH1,0FDH
MOVPCON,#00H;电源控制
SETBTR1;TCON控制
SETBEA;IE控制
SETBES
MOVDPTR,#0030H;数据缓冲区首地址
MOVR0,#00H;设计数初值为0
SJMP$;等待中断
SB:
CLRRI;清接收中断标志
MOVA,SBUF;取接收的数据
MOVX@DPTR,A;接收的数据送缓存区
CJNER0,#0FH,LOOPB;判别是否接收完
CLRES;接收完关串行口中断
AJMPENDB
LOOPB:
INCR0;计数指针加1
INCDPTR;地址指针加1
ENDB:
RETI;中断返回
END
七、收获与体会
串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。
一般完成这种功能的电路,我们称为串行接口电路。
若想与标准的RS232设备通信,就要做电平转换,输出时要将TTL电平换成RS232电平,输入时要将RS232电平换成TTL电平。
可以将仿真板上的RXD、TXD信号接到实验板上的“用户串口接线”的相应RXD和TXD端,经过电平转换,通过“用户串口”接到外部的RS232设备。
可以用实验仪上的逻辑分析仪采样串口通信的波形
可以说它是物联网中不可或缺的一部分;
实验六数码管显示实验
一、实验目的
了解数码管动态显示的原理;了解用总线方式控制数码管显示。
二、实验内容
编写程序,使数码管显示当前日期(年-月-日)。
说明:
本实验仪提供了6位8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。
此处X是由KEY/LEDCS决定,参见地址译码。
做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LEDCS接到CS0上,则段码地址为08004H,位码地址为08002H。
三、实验线路及连线
连线
连接孔1
连接孔2
1
KEY/LED_CS
CS0
四、实验说明
本实验仪提供了6位8段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。
此处X是由KEY/LEDCS决定,参见地址译码。
做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LEDCS接到CS0上,则段码地址为08004H,位码地址为08002H。
七段数码管的字型代码表如下表:
a
fb
g
ec
d
。
dp
显示字形
g
f
e
d
c
b
a
段码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
1
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
A
1
1
1
0
1
1
1
77h
b
1
1
1
1
1
0
0
7ch
C
0