51单片机仿真实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机仿真实例

l示例6—扫描与判断—(单端口)位扫描与字节(多端口)扫描

这是一个常用程序段—子程序—标准程序,

通过端口扫描而获得输入数据或控制输出数据,达到节

省位或字节的目的—节约硬件资源。

关于扫描,可以从位及其取反实现流水灯着手来理解。

可以通过移位实现流水灯—扫描。可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。可以通过循环跳转实现流水灯—扫描。扫描注意入比出查—获得输入要比

较数据、发送输出要检查出口

扫描获取端口字节

扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表

扫描输出字符字节,通过延时可以变换字符以便造成数

字进位效果

ORG 0000H

START:

dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00h

mov 30h,#2 ;存入数据mov 31h,#0

mov 32h,#1

mov 33h,#0

mov 34h,#7

mov 35h,#1

mov r0,#dbuf

mov r1,#temp

mov r2,#6;六位显示器

mov dptr,#segtab ;段码表首地址dp00:mov a,@r0

;取要显示的数据

movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存

inc r1

inc r0

djnz r2,dp00

disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次

mov r2,#01h;从第一位开始

dp01:mov a,@r0

mov p2,a;段码输出

mov a,r2 ;取位码

mov p1,a;位码输出

acall delay;调用延时

mov a,r2

rl a

mov r2,a

inc r0

djnz r1,dp01

sjmp disp0

segtab:db 0C0H,0F9H,0A4H,0B0H,99H,92H;共阳极管

db 82H,0F8H,80H,90H,88H,88H,83H

delay:mov r4,#29h;延时子程序

aa1:mov r5,0ffh

aa:djnz r5,aa

djnz r4,aa1

ret

end

************************************************* ***********************

还可以用其他程序形式进行扫描,像循环、递增或递减判断程序等。扫描技术可以用于点阵显示,液晶板(LCD)显示。这些都需要字符编码、显示延时、扫描端口以充分利用资源(节约资源)。

l实例1—关于动态显示—LED闪烁

ORG 0000H

START:

MOVA,#0FFH;字节传送

MOVP3,A;字节传送

MOVP1,A

MOV C, 0A0H;位传送

JNB0A0H,GUAN;判断位电平低为真,则转移;直接地址

位为0转移

MOVP1,#00H;P1口先赋#0FFH,再赋#00H,则产生闪烁RET

GUAN :

MOVP3,#00H;P3口先赋#0FFH,再赋#00H,则产生闪烁,也可以使用取反指令

RET;可以产生闪烁效果

END

其他方法(如:延时子程序)也可以实现动态显示。

l实例2—单个LED灯-单个按键的仿真

ORG0000H;这是伪指令,机器并不执行,用于程序的交流。指令执行的起始地址,十进制用D表示,十六进制

用H表示,二进制用B表示。一个字节(8位机、16位机、32位机、64位机)一次执行。也可以按位来执行,也就是一个bit。

ORG00000000B与ORG0000H作用相同。注意8位(bit)

一个字节。16位的处理器需要用0000 0000H表示。16

或32位以上,使用操作系统(Wince、Linux等)更有效,可以利用大量的、底层的、专业化、标准化的面向控制

的库函数(如:API等)。

START:;这是伪指令,机器并不执行。只是为了汇编语

言讲故事的可理解性

MAIN:

;伪指令,主程序,用于区别子程序

PC→MOVA,#00H;将立即数00000000B(常数0D)

传送给累加器ACC(专用寄存器,可用于存放计算结果等)。要通过累加器A和其它存储地址进行数据交换。注意PC是自动移位(自动+1)到下一个语句的地址。使用该语句实质上是让PC具有初始位置。

PC→MOVP1,A;将累加器中的数(常数0D)传送给端

口P1(P1口8位全部置0,低电平,P1端口各位处于关闭状态,LED灯处于系统响应的准备状态),按字节传送数据。特别记忆:PC→表示指针所指地址,并会自

动加1。

PC→MOVC,0A0H;检测P2.0口的状态,将P2.0口的状态(由按键状态决定)传送给位累加器C,位累加器C 的地址是PSW(程序状态字寄存器)的进位标志位

CY(D7H\PSW.7)。P2.0口可以是开或关,也就是置1或0,高电平或低电平),按字节传送数据。要通过位累加器C 和其它存储地址进行数据交换。该语句也可以写成:MOVC,P2.0,比较字节数据传送MOVA,#00H或MOVA,P1。PC→MOVP1.0,C;等价于MOV90H,C;将位累加器C 地址中的值传送给P1.0口(90H是其直接地址),也就

是将P2.0口的状态(由直接地址0A0H状态决定)传送给直接地址90H,P1.0口

相关文档
最新文档