单片机全书汇编Word下载.docx
- 文档编号:16187230
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:36
- 大小:328.92KB
单片机全书汇编Word下载.docx
《单片机全书汇编Word下载.docx》由会员分享,可在线阅读,更多相关《单片机全书汇编Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
CPU中断允许
SETBEX0;
中断允许
SJMP$
中断服务程序:
查按钮,有按钮按下时响铃
ORG0300H;
中断服务程序
ZDP:
MOVA,P1;
查哪个按钮按下
ANLA,#0FH
SWAPA;
转换为点亮发光管信号
ORLA,#0FH
MOVP1,A
LCALLRING;
响铃
LCALLDELAY
RETI
延时子程序:
RING:
MOVR5,#20H;
时间常数
RIN0:
MOVR6,#60H;
RIN1:
MOVR7,#0F0H;
RIN2:
DJNZR7,RIN2
SETBP3.3
DJNZR6,RIN1
DJNZR5,RIN0
RET
DELAY:
MOVR6,#0FFH
DE2:
MOVR7,#0FFH
DE1:
DJNZR7,DE1
DJNZR6,DE2
【例5-4】设定时器T0工作在方式0,在P1.0引脚上输出周期为2ms的方波(定时时间为1ms),fosc=6MHZ。
编程实现其定时功能。
解:
当T0处于工作方式0时,加1计数器为13位。
设T0的初值为X。
(1机器周期=2µ
s)
1.计算T0初值X
则:
X=7692;
转换为二进制数:
1111000001100B;
结果为(TH0)=F0H,(TL0)=0CH.
2.初始化
选择T0并确定工作方式:
(TMOD)=00H
装入初始值:
(TH0)=0F0H(TL0)=0CH
选择数据传输方式:
中断方式:
允许T0中断
SETBEA
SETBET0
查询方式:
禁止T0中断
CLRET0
3.程序清单
将上述的分析过程用指令表示出来。
方法1:
中断法。
在定时器初始化时要开放对应的中断允许(ET0或ET1)和总允许EA,在启动后等待中断。
当计数器溢出中断,CPU将程序转到中断服务程序入口,因此应在中断服务程序中安排相应的处理程序。
主程序:
ORG1000H
PTOMD:
MOVTMOD,#00H;
T0方式0
MOVTL0,#0CH;
送初值
MOVTH0,#0F0H
SETBEA;
CPU开中断
SETBET0;
开T0中断
SETBTR0;
启动定时
SJMP$;
等待中断
ORG0120H
ITOP:
MOVTL0,#0CH;
重新装入初值
MOVTH0,#0F0H
CPLP1.0;
P1.0取反输出方波
RETI
方法2:
查询法。
在定时器初始化并启动后,在程序中安排指令查询TF0的状态。
设置T0为模式0
CLRET0;
禁止T0中断
SETBTR0;
启动T0
LOOP:
JBCTF0,NEXT;
查询定时时间是否到?
SJMPLOOP
NEXT:
重装计数初值
输出取反
SJMPLOOP;
重复循环
【例5-5】用89C51单片机产生方波信号,晶振频率为6MHz,用T0定时,通过并行口P1.0输出频率为lKHz的方波的程序。
用查询方式。
ORG2000H
START:
MOVTMOD,#01H;
T0工作于方式1
MOVTL0,#06H;
时间常数初值低8位
MOVTH0,#0FFH;
时间常数初值高8位
CLRET0;
SETBTR0;
LOOP:
JBCTF0,DONE;
检查T0溢出否
SJMPLOOP;
未计满再查
DONE:
MOVTL0,#06H;
计满重装时间常数初值
MOVTH0,#0FFH
CPLP1.0;
将P1.0输出电平反相;
SJMPLOOP
【例5-6】利用定时器T1的模式2对外部信号计数。
要求每计满100次,累加器A加1。
计算T1的计数初值:
X=28-100=156D=9CH
因此,TL1的初值为9CH,重装初值寄存器TH1=9CH.
程序清单:
ORG0000H
LJMPMAIN
ORG001BH;
中断服务程序入口
LJMPINTT1
MAIN:
MOVTMOD,#60H;
T1为模式2计数方式
MOVTL1,#9CH;
赋初值
MOVTH1,#9CH
MOVIE,#88H;
定时器T1开中断
SETBTR1;
启动计数器
HERE:
SJMPHERE;
INTT1:
CPLP1.0
【例5-7】用T0方式3,分别产生200μs和300μs的定时,并使P1.0和P1.1分别产生400μs和600μs的方波。
(fosc=6MHz)
本题需要2个定时器TH0和TL0
计数初始值计算:
(28-初始值)×
2=200/300
TH0的初值=156=9CH;
TL0的初值=106=6AH
初始化:
TMOD:
03H且TR0=1和TR1=1
程序:
ORG3000H
AJMPMAIN;
转主程序
ORG000BH;
转TR0溢出中断
AJMPPIT0
ORG001BH;
转TR1溢出中断
AJMPPIT1
MAIN:
MOVTMOD,#03H
MOVTH0,#6AH
MOVTL0,#9CH
MOVIE,#8AH
MOVTCON,#50H
SJMP$
PIT0:
MOVTH0,#6AH;
定时300us
CLPP1.0
PIT1:
MOVTL0,#9CH;
定时200μs
CLPP1.1
【例5-8】用定时器/计数器T0监视一生产线,每生产100个工件,发出一包装命令,包装成一箱,并记录其箱数。
硬件电路如图5-15所示。
图5-15例5-8题图
用T0作计数器,T为光敏三极管。
当有工件通过时,三极管输出高电平,即每通过一个工件,便会产生一个计数脉冲。
T0工作于计数器方式的方式2,方式控制字为TMOD:
00000110B;
计数初值为TH0=TL0=256-100=156=9CH;
用P1.0启动包装机包装命令;
用R5、R4作为箱数计数器。
程序如下:
ORG0000H
LJMPMAIN;
主程序
T0中断服务程序
LJMPCOUNT
ORG0030H
MOVSP,#60H
CLRP1.0
MOVR5,#0;
箱数计数器清“0”
MOVR4,#0
MOVTMOD,#06H;
置T0工作方式
MOVTH0,#9CH
SETBEA;
SETBTR0
SJMP$;
模拟主程序
COUNT:
MOVA,R4;
箱数计数器加1
ADDA,#01H
MOVR4,A
MOVA,R5
ADDCA,#00H
MOVR5,A
SETBP1.0;
启动包装
MOVR3,#100
DLY:
NOP;
给外设一定时间
DJNZR3,DLY
RETI;
中断返回
END
【例5-9】设系统时钟频率为12MHz,编程实现P1.1引脚上输出周期为1s,占空比为20%的脉冲信号。
分析:
根据输出要求,脉冲信号在一个周期内高电平占0.2s,低电平占0.8s,超出了定时器的最大定时间隔,因此利用定时器0产生一个基准定时配合软件计数来实现。
取10ms作为基准定时,采用工作方式1,这样整个周期需要100个基准定时,其中高电平占20个基准定时,低电平占80个基准定时。
程序代码如下:
LJMPMAIN
ORG000BH
LJMPT0INT
MOVSP,#60H
MOVR7,#0
MOVTMOD,01H;
初始化
MOVTH0,#0D8H
MOVTL0,#0F0H
SETBEA
SJMP$
T0INT:
MOVTH0,#0D8H;
重载初始值
MOVTL0,#0F0H
INCR7
CJNER7,#20,LL1
CLRP1.1
SJMPLLEND
LL1:
CJNER7,#100,LLEND
SETBP1.1
MOVR7,#00H
LLEND:
RETI
【例5-10】试编写利用T0产生1s定时的程序。
使得由P1口控制的8个LED指示灯每隔一秒轮流闪亮(输出为低电平时亮),设fosc=6MHz。
1)定时器T0工作模式的确定
因定时时间较长,使用51单片机的定时器/计数器进行定时,即使按工作方式l,其最大定时时间也只能达到131ms,离ls还差很远。
为此,我们把秒计时用硬件定时和软件计数相结合的方法实现,
采用哪一种工作模式合适呢?
可以算出:
模式0最长可定时16.384ms;
模式1最长可定时131.072ms;
模式2最长可定时512μs。
题中要求定时1s,可选模式1,每隔100ms中断一次,中断10次为1s。
初始值X(设fosc=6MHZ,振荡脉冲经12分频得到机器周期)
∴X=15536=3CB0H
因此,(TL0)=0B0H,(TH0)=3CH。
2)实现方法
对于中断10次计数,可使T0工作在计数方式,也可用循环程序的方法实现。
本例采用循环程序法。
3)程序设计:
ORG0000H
LJMPMAIN;
上电,转向主程序
T0的中断入口地址
AJMPDVT0;
转向中断服务程序
ORG2000H;
MOVSP,#60H;
设堆栈指针
MOVR2,#0AH;
设循环次数
MOVTMOD,#01H;
设置T0工作于模式1
MOVTL0,#0B0H;
装入计数值低8位
MOVTH0,#3CH;
装入计数值高8位
启动定时器T0
SETBET0;
允许T0中断
允许CPU中断
DVT0:
MOVTH0,#3CH
MOVTL0,#0B0H
DJNZR2,RTN
RLA;
左移一位
MOVP1,A
MOVR2,#20
RTN:
RETI
【例5-11】门控位GATE的应用
利用定时/计数器T0的门控位GATE,测量引脚上出现的脉冲宽度,并将结果(机器周期数)存入内部RAM30H和31H单元中。
1)由题意分析,外部脉冲由引脚输入,可设T0工作于定时方式1,计数初值为0,在一个完整的外部脉冲宽度内对机器周期计数(定时方式),显然计数值乘上机器周期就是脉冲宽度。
2)设定GATE=1,当TR0置1时,由外部脉冲上升沿启动T0开始工作。
加1计数器开始对机器周期计数;
引脚变为低电平时,停止计数,这时读出TH0、TL0的值,该计数值即为被测信号的脉冲宽度对应的机器周期数。
测试过程如5-16图所示.
图5-16例5-11题图
3)工作方式字TMOD=00001001B
计数初值TH0=00H,TL0=00H
4)程序设计
ORG0000H
LJMPMAIN
ORG0030H
MOVTMOD,#09H;
GATE=1
MOVTH0,#00H;
置计数初值
MOVTL0,#00H
MOVR0,#30H
WAIT1:
JBP3.2,WAIT1;
等待变低
SETBTR0;
预启动T0
WAIT2:
JNBP3.2,WAIT2;
等待
变高、启动计数
JBP3.2,WAIT3;
再变低
CLRTR0;
停止计数
MOV@R0,TL0;
读取计数值,存入指定单元
INCR0,
MOV@R0,TH0
AJMPDATA;
转数据处理程序
【例6-1】利用串行口工作方式0扩展出8位并行I/O口,驱动共阳极LED数码管显示0~9。
电路连接如图6-16。
把89C51串行口8位状态码串行移位输出后,TI置“l”,把Tl作为状态查询标志,则使用查询方法完成的串行口和CD4094驱动共阳极LED数码管(查表)显示0-9数字的参考子程序如下:
DSPLY:
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVSBUF,A
JNBTI,$
CLRTI
RET
TABLE:
DB0C0H,0F9H,0A4H0B0H,99H
DB92H,82H,0F8H,80H,90H
图6-16共阳极LED与单片机的联接
用方式0加上并入一串出移位寄存器可扩展一个8位并行输入口。
移位寄存器必须带有预置/移位的控制端,由单片机的一个输出端子加以控制,以实现先由8位输入口置数到移位寄存器,然后再串行移位从单片机的串行口输入到接收缓冲器,最后再读入到CPU中。
【例6-2】用51单片机串行口外加移位寄存器CD4014(或74LSl65,166)扩展8位输入口,输入数据由8个开关提供,另有一个开关K提供联络信号。
当K=0时,表示要求输入数据,输入的8位为开关量,提供逻辑模拟子程序的输入信号。
如图6-17所示。
串行口方式0的接收要用SCON寄存器中的REN位作为开关来控制。
因此,初始化时,除了设置工作方式之外,还要使REN位为l,其余各位仍然为0。
对RI采用查询方式来编写程序,当然,先要查询开关K是否闭合。
参考程序:
MOVSCON,#10H;
串行口方式0初始化
JBP1.l,$;
开关K未闭合,等待
SETBPl.0;
P/
=1,并行置入数据
CLRPl.0;
=0,开始串行移位
JNBRI,$;
查询RI
CLRRI;
查询结束,清RI
MOVA,SBUF;
读数据到累加器
ACALLLOGSIM;
进行逻辑模拟
SJMPSTART;
准备下一次模拟
甲机发送主程序:
ORG0023H
AJMPACINT
MOVTMOD,#20H;
设置定时器l工作方式2
MOVTLl,#0F3H;
定时器Tl数初值
MOVTHl,#0F3H;
计数重装值
中断总允许
CLRES;
禁止串行中断
MOVPCON,#00H;
波特率不倍增
SETBTRl;
启动定时器l
MOVSCON,#50H;
设置串行口方式l,REN=1
MOVSBUF,#40H;
发送数据区首地址高位
SOUTl:
JNBTl,$;
等待一帧发送完毕
CLRTl;
清发送中断标志
MOVSBUF,#00H;
发送数据区首地址低位
SOUT2:
CLRTI
发送数据区末地址高位
SOUT3:
MOVSBUF,#lFH;
发送数据区末地址
SOUT4:
等待一帧发送完毕
CLRTI
MOVDPTR,#4000H;
数据区地址指针
MOVXA,@DPTR;
读第一个数据
INCDPTR
MOVR7,#20H;
数据个数
SETBES;
开放串行中断
MOVSBUF,A;
启动发送第一个数据
DECR7
AHALT:
AJMP$;
甲机中断服务程序:
ACINT:
读数据
CLRTI;
清发送中断
MOVC,P;
奇偶标志赋予
MOVACC.7,C;
送ASCII码高位
发送字符
DECR7
CJNER7,#00H,AEND2;
没发送完转AEND2
CLRES;
发送完禁止串行中断
CLRTRl;
定时器l停止计数
AJMPAENDl
AEND2:
INCDPTR
AENDl:
RETI;
中断返回
乙机接收主程序:
0RG0023H
AJMPBCINT
ORG0030H
MOVTMOD,#20H;
设置定时器l工作方式2
定时器l计数初值
计数重装值
中断总允许
禁止串行中断
MOVDPTR,#5000H;
数据存放首地址
MOVR7,#24H;
接收数据个数
SINl:
JNBRl,$;
等待一帧接收完
CLRRl;
清接收中断标志
接收数据区首地址高位
MOVX@DPTR,A;
存首地址高位
INCDPTR;
地址指针增量
SIN2:
JNBRI,$
CLRRI
接收数据区首地址低位
存首地址低位
INCDPTR
SIN3:
CLRRI
DECR7
MOVA,SBUF;
接收数据区未地址高位
MOVX@DPTR,A;
存本地址高位
INCDPTR
SIN4:
接收数据区未地址低位
存末地址低位
SETBES;
BHALT:
乙机中断服务程序:
BCINT:
接收数据
奇偶标志赋予C
JNCBEND3;
C≠l为偶数转至BEND3
ANLA,#7FH;
为奇数删去校验位
BEND3:
存数据
CJNER7,#00H,BENDl;
没接收完转BENDl
接收完禁止串行中断
CLRTR1;
AJMPBEND2
BENDl:
BEND2:
【例6-4】设计一个发送程序,将片内RAM50H~5FH中的数据串行发送,串行口设定为方式2状态。
TB8作奇偶校验位。
在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时第9位数据作奇偶校验用。
参考程序如下:
TRT:
MOVSCON,#80H;
方式2设定
MOVPCON,#80H;
取波特率为fosc的1/32
MOVR0,#50H;
首地址50H送R0
MOVR7,#10H;
数据长度10H送R7
LOOP:
MOVA,@R0;
取数据送A
MOVC,PSW.0
MOVTB8,C;
P送TB8
数据送SBUF启动发送
WALT:
JBCTI,CONT;
判断发送中断标志
SJMPWALT
CONT:
INCR0
DJNZR7,LOOP
RET
【例6-5】设计一个接收程序,将接收的16个字节数据送入片内RAM50H~5FH单元中。
设串行口方式3状态工作,波特率为2400bps。
定时钟数器Tl为工作波特率发生器时,SMOD=0,计数常数为F4H。
RVE:
Tl编程为方式2定时状态
MOVTH1,#0F4H;
计数常数送Tl
MOVTL1,#0F4H
SETBTRl;
启动Tl
MOVR0,#50H;
R0置初值
MOVR7,#10H;
MOVSCON,#0D0H;
串行El编程方式3接收
置SMOD=0
WAIT:
JBCRI,PRI;
等待接收到数据
SJMPWAIT
PRI:
MOVA,SBUF
JNBPSW.0,PNP;
奇偶校验判P=R1387
JNBRB8,PER;
出错转至PER结束
SJMPRIGHT
PNP:
JBRB8,PER
RIGHT:
MOV@R0,A;
数据送缓冲器
DJNZR7,WAIT;
判数据块接完否?
CLRPSW.5;
正确接收完l6个字节置标志
PER:
【例8-1】对8255A各口作如下设置:
A口方式0输入,B口方式1输出,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 全书 汇编