单片机全书汇编.docx
- 文档编号:3281687
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:36
- 大小:328.92KB
单片机全书汇编.docx
《单片机全书汇编.docx》由会员分享,可在线阅读,更多相关《单片机全书汇编.docx(36页珍藏版)》请在冰豆网上搜索。
单片机全书汇编
【例5-2】在89C51单片机的
引脚外接脉冲信号,要求每送来一个脉冲,把30H单元值加1,若30H单元计满则进位31H单元。
现利用中断编制脉冲计数程序。
主程序部分:
ORG0000H
AJMPMAIN;设置主程序入口地址
ORG0003H;
中断入口地址
AJMPSUBG;设置中断服务程序入口地址
ORG0100H
MAIN:
MOVA,#00H;30H、31H两单元清零
MOV30H,A
MOV31H,A
MOVSP,#70H;设置堆栈指针
SETBIT0;设
为边沿触发
SETBEA;开中断
SETBEX0;允许
中断
AJMP$;等待中断
中断服务程序:
ORG0200H;设置中断服务子程序位置
SUBG:
PUSHACC;保护现场
INC30H;中断后将脉冲计数值加1
MOVA,30H
JNZBACK
INC31H
BACK:
POPACC;恢复现场
RETI;返回
【例5-3】设计一个比赛抢答器,电路如图5-9所示,P1.0~P1.3分别接按钮S1~S4,当其中任何一个按钮按下时,都能立即从P3.3发出铃声信号,并点亮相应的发光二极管。
即S1点亮VL1,S2点亮VL2,S3点亮VL3,S4点亮VL4。
电路连接如图5-8。
图5-8例5-3电路图
主程序部分:
初始化,等待中断
0RG0000H
LJMPSTART
0RG0003H
LJMP0300H
ORG0100H
START:
MOVSP,#70H;设置栈区
SETBIT0;脉冲触发方式
WAITOFF:
CLRP3.3;响铃控制
SETBEA;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
RET
【例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的状态。
MOVTMOD,#00H;设置T0为模式0
MOVTL0,#0CH;送初值
MOVTH0,#0F0H
CLRET0;禁止T0中断
SETBTR0;启动T0
LOOP:
JBCTF0,NEXT;查询定时时间是否到?
SJMPLOOP
NEXT:
MOVTL0,#0CH;重装计数初值
MOVTH0,#0F0H
CPLP1.0;输出取反
SJMPLOOP;重复循环
【例5-5】用89C51单片机产生方波信号,晶振频率为6MHz,用T0定时,通过并行口P1.0输出频率为lKHz的方波的程序。
用查询方式。
ORG2000H
START:
MOVTMOD,#01H;T0工作于方式1
MOVTL0,#06H;时间常数初值低8位
MOVTH0,#0FFH;时间常数初值高8位
CLRET0;禁止T0中断
SETBTR0;启动T0
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
RETI
【例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
START:
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
RETI
PIT1:
MOVTL0,#9CH;定时200μs
CLPP1.1
RETI
【例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;主程序
ORG000BH;T0中断服务程序
LJMPCOUNT
ORG0030H
MAIN:
MOVSP,#60H
CLRP1.0
MOVR5,#0;箱数计数器清“0”
MOVR4,#0
MOVTMOD,#06H;置T0工作方式
MOVTH0,#9CH
MOVTL0,#9CH
SETBEA;CPU开中断
SETBET0
SETBTR0
SJMP$;模拟主程序
COUNT:
MOVA,R4;箱数计数器加1
ADDA,#01H
MOVR4,A
MOVA,R5
ADDCA,#00H
MOVR5,A
SETBP1.0;启动包装
MOVR3,#100
DLY:
NOP;给外设一定时间
DJNZR3,DLY
CLRP1.0
RETI;中断返回
END
【例5-9】设系统时钟频率为12MHz,编程实现P1.1引脚上输出周期为1s,占空比为20%的脉冲信号。
分析:
根据输出要求,脉冲信号在一个周期内高电平占0.2s,低电平占0.8s,超出了定时器的最大定时间隔,因此利用定时器0产生一个基准定时配合软件计数来实现。
取10ms作为基准定时,采用工作方式1,这样整个周期需要100个基准定时,其中高电平占20个基准定时,低电平占80个基准定时。
程序代码如下:
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0INT
ORG0030H
MAIN:
MOVSP,#60H
MOVR7,#0
MOVTMOD,01H;初始化
MOVTH0,#0D8H
MOVTL0,#0F0H
SETBEA
SETBET0
SETBTR0
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;上电,转向主程序
ORG000BH;T0的中断入口地址
AJMPDVT0;转向中断服务程序
ORG2000H;主程序
MAIN:
MOVSP,#60H;设堆栈指针
MOVR2,#0AH;设循环次数
MOVTMOD,#01H;设置T0工作于模式1
MOVTL0,#0B0H;装入计数值低8位
MOVTH0,#3CH;装入计数值高8位
SETBTR0;启动定时器T0
SETBET0;允许T0中断
SETBEA;允许CPU中断
SJMP$;等待中断
中断服务程序:
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
MAIN:
MOVTMOD,#09H;GATE=1
MOVTH0,#00H;置计数初值
MOVTL0,#00H
MOVR0,#30H
WAIT1:
JBP3.2,WAIT1;等待变低
SETBTR0;预启动T0
WAIT2:
JNBP3.2,WAIT2;等待
变高、启动计数
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是否闭合。
参考程序:
START:
MOVSCON,#10H;串行口方式0初始化
JBP1.l,$;开关K未闭合,等待
SETBPl.0;P/
=1,并行置入数据
CLRPl.0;P/
=0,开始串行移位
JNBRI,$;查询RI
CLRRI;查询结束,清RI
MOVA,SBUF;读数据到累加器
ACALLLOGSIM;进行逻辑模拟
SJMPSTART;准备下一次模拟
甲机发送主程序:
ORG0023H
AJMPACINT
ORG0030H
MOVTMOD,#20H;设置定时器l工作方式2
MOVTLl,#0F3H;定时器Tl数初值
MOVTHl,#0F3H;计数重装值
SETBEA;中断总允许
CLRES;禁止串行中断
MOVPCON,#00H;波特率不倍增
SETBTRl;启动定时器l
MOVSCON,#50H;设置串行口方式l,REN=1
MOVSBUF,#40H;发送数据区首地址高位
SOUTl:
JNBTl,$;等待一帧发送完毕
CLRTl;清发送中断标志
MOVSBUF,#00H;发送数据区首地址低位
SOUT2:
JNBTl,$;等待一帧发送完毕
CLRTI
MOVSBUF,#40H;发送数据区末地址高位
SOUT3:
JNBTl,$;等待一帧发送完毕
CLRTl;清发送中断标志
MOVSBUF,#lFH;发送数据区末地址
SOUT4:
JNBTl,$;等待一帧发送完毕
CLRTI
MOVDPTR,#4000H;数据区地址指针
MOVXA,@DPTR;读第一个数据
INCDPTR
MOVR7,#20H;数据个数
SETBES;开放串行中断
MOVSBUF,A;启动发送第一个数据
DECR7
AHALT:
AJMP$;等待中断
甲机中断服务程序:
ORG0100H
ACINT:
MOVXA,@DPTR;读数据
CLRTI;清发送中断
MOVC,P;奇偶标志赋予
MOVACC.7,C;送ASCII码高位
MOVSBUF,A;发送字符
DECR7
CJNER7,#00H,AEND2;没发送完转AEND2
CLRES;发送完禁止串行中断
CLRTRl;定时器l停止计数
AJMPAENDl
AEND2:
INCDPTR
AENDl:
RETI;中断返回
乙机接收主程序:
0RG0023H
AJMPBCINT
ORG0030H
MOVTMOD,#20H;设置定时器l工作方式2
MOVTHl,#0F3H;定时器l计数初值
MOVTLl,#0F3H;计数重装值
SETBEA;中断总允许
CLRES;禁止串行中断
MOVPCON,#00H;波特率不倍增
SETBTRl;启动定时
MOVSCON,#50H;设置串行口方式l,REN=1
MOVDPTR,#5000H;数据存放首地址
MOVR7,#24H;接收数据个数
SINl:
JNBRl,$;等待一帧接收完
CLRRl;清接收中断标志
DECR7
MOVA,SBUF;接收数据区首地址高位
MOVX@DPTR,A;存首地址高位
INCDPTR;地址指针增量
SIN2:
JNBRI,$
CLRRI
DECR7
MOVA,SBUF;接收数据区首地址低位
MOVX@DPTR,A;存首地址低位
INCDPTR
SIN3:
JNBRI,$
CLRRI
DECR7
MOVA,SBUF;接收数据区未地址高位
MOVX@DPTR,A;存本地址高位
INCDPTR
SIN4:
JNBRI,$
CLRRI
DECR7
MOVA,SBUF;接收数据区未地址低位
MOVX@DPTR,A;存末地址低位
INCDPTR
SETBES;开放串行中断
BHALT:
AJMP$;等待中断
乙机中断服务程序:
ORG0100H
BCINT:
MOVA,SBUF;接收数据
MOVC,P;奇偶标志赋予C
JNCBEND3;C≠l为偶数转至BEND3
ANLA,#7FH;为奇数删去校验位
BEND3:
MOVX@DPTR,A;存数据
CLRRI;清接收中断标志
DECR7
CJNER7,#00H,BENDl;没接收完转BENDl
CLRES;接收完禁止串行中断
CLRTR1;定时器l停止计数
AJMPBEND2
BENDl:
INCDPTR
BEND2:
RETI;中断返回
【例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
MOVSBUF,A;数据送SBUF启动发送
WALT:
JBCTI,CONT;判断发送中断标志
SJMPWALT
CONT:
INCR0
DJNZR7,LOOP
RET
【例6-5】设计一个接收程序,将接收的16个字节数据送入片内RAM50H~5FH单元中。
设串行口方式3状态工作,波特率为2400bps。
定时钟数器Tl为工作波特率发生器时,SMOD=0,计数常数为F4H。
参考程序如下:
RVE:
MOVTMOD,#20H;Tl编程为方式2定时状态
MOVTH1,#0F4H;计数常数送Tl
MOVTL1,#0F4H
SETBTRl;启动Tl
MOVR0,#50H;R0置初值
MOVR7,#10H;数据长度10H送R7
MOVSCON,#0D0H;串行El编程方式3接收
MOVPCON,#00H;置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;数据送缓冲器
INCR0
DJNZR7,WAIT;判数据块接完否?
CLRPSW.5;正确接收完l6个字节置标志
PER:
RET
【例8-1】对8255A各口作如下设置:
A口方式0输入,B口方式1输出,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 全书 汇编
![提示](https://static.bdocx.com/images/bang_tan.gif)