单片机典型例题文档格式.docx
- 文档编号:16711726
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:16
- 大小:22.55KB
单片机典型例题文档格式.docx
《单片机典型例题文档格式.docx》由会员分享,可在线阅读,更多相关《单片机典型例题文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
MOVX@DPTR,A;
x送RAM的1818h单元
●已知RAM50h单元有一个0~9的数,试编程将它变成相应的ASCII码。
【解】:
0~9的ASCII码是30h~39h,两者相差30h。
方法一:
对50h单元的数据高四位组装一个30h。
movr0,#50h;
指针赋值
mova,#30h;
30h→A
xchda,@r0;
(A)3~0↔(r0)3~0,在A中组成ASCII码
mov@r0,a;
A中的ASCII送回50h单元
例:
设(30H)=X,(40H)=Y,试利用堆栈区域实现30H和40H单元中的数据交换
MOVSP,#60H ;
设栈底的地址为60H
PUSH40H ;
Y→(61H)
PUSH30H ;
X→(62H)
POP40H ;
X→(40H)
POP30H ;
Y→(30H)
【例】编程将片内RAM中10H和20H单元的内容交换。
方法一:
用交换指令。
XCHA,10H
XCHA,20H
方法二:
用“MOV”指令。
MOVA,10H
MOV10H,20H
MOV20H,A
方法三:
用堆栈。
PUSH10H
PUSH20H
POP10H
POP20H
思考题:
已知:
(A)=A9H、(20H)=98H,试问执行如下指令后累加器A和CY中的值是多少?
CLRC
MOVA,#0A9H
MOVR0,#20H
MOV20H,#98H
SUBBA,@R0
执行结果:
(A)=11H,(PSW)=00H
【例】:
已知M1、M2单元中存有两个16位无符号数x1、x2
(低位在前)。
试编程求x1+x2,并将结果放入M1、M1+1单元
(低8位在M1单元)。
设两数之和不会超过16位(65535)。
MOVR0,#M1;
x1指针赋初值
MOVR1,#M2;
x2指针赋初值
MOVA,@R0;
取x1低8位送A
ADDA,@R1;
x1与x2低8位相加
MOV@R0,a;
低8位和送m1单元
INCR0
修改指针
取x1的高8位送A
ADDCA,@R1;
x1与x2的高8位和Cy相加
MOV@R0,A;
结果送M1+1单元
【例】:
试将A中的二进制数转换为3位BCD码,其中,百位数存放于31H单元,十位数和个位数压缩后存于30H单元中。
MOVB,#100
DIVAB
MOV31H,A
MOVA,#10
XCHA,B
SWAPA
ADDA,B
MOV30H,A
外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。
解1,利用MOVXA,@Ri指令:
MOVR0,#30H10101010
MOVXA,@R0⊕00001111
XRLA,#0FH10100101
MOVX@R0,A
解2,利用MOVXA,@DPTR
MOVDPTR,#0030H
MOVXA,@DPTR
XRLA,#0FH
MOVX@DPTR,A
在M1和M1+1单元有一个16位数(M1存低8位),试编程将其扩大2倍(设结果小于65535)。
扩大2倍可以用左移一位来实现。
CLRC;
清除Cy位
MOVR1,#M1;
MOVA,@R1;
取低8位数据
RLCA;
循环左移,Cy进低位,高位进Cy
MOV@R1,A;
移位后数据回送
INCR1;
指针加一
取高8位数据
循环左移Cy进低位
数据回送
【例】令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUN单元(设其和小于256)。
ORG1000H
START:
MOVR2,#0AH;
数据块长度10送计数器R2
MOVR0,#DATA;
数据块起始地址送指针R0
CLRA;
累加器清零
LOOP:
ADDA,@R0;
累加部分和
INCR0
DJNZR2,LOOP;
若R2-1≠0则转LOOP继续
MOVSUN,A;
存累加和
END
试将00H位和7FH位中的内容互换。
两个位互换必须找一个位作为缓冲位。
MOVC,00H
MOV01H,C
MOVC,7FH
MOV00H,C
MOVC,01H
MOV7FH,C
内部RAM的M1、M2单元各有两个无符号的8位数。
试编程比较其大小,并将大数送MAX单元。
【解】:
MOVA,M1;
操作数1送累加器A
CJNEA,M2,LOOP;
两个数相比较
LOOP:
JNCLOOP1;
M1>
=M2时转LOOP1
MOVA,M2;
M1<
M2时,取M2到A
LOOP1:
MOVMAX,A;
A中数据送MAX单元
【说明】:
1,第2条指令作为比较指令使用,不论结果多少都转LOOP
2,第3条指令是一条位控转移指令,根据Cy的状态控制转移。
【例】已知16位二进制负数存放在R1R0中,试求其补码,并将结果存在R3R2中。
CONT:
CLRA
MOVA,R0;
读低8位
CPLA;
取反
ADDA,#01H;
加1
MOVR2,A;
存低8位
MOVA,R1;
读高8位
ADDCA,#80H;
加进位及符号位
MOVR3,A;
存高8位
将R2中BCD码数转为二进制数存进R2
ORG2000H
BCD2B:
MOVA,R2;
取入口数据
ANLA,#0F0H;
取出十位
SWAPA;
高4位低4位
MOVB,#0AH
MULAB;
十位乘10
MOVR3,A;
积暂存进R3
MOVA,R2;
再取入口数据
ANLA,#0FH;
取出个位
ADDA,R3
MOVR2,A;
结果R2
RET;
若不是子程序可用END
例:
软件循环延时100mS(晶振12MHz)
☆1Tm=1uS100mS=100000uS
☆MOVRn#data和NOP是单机器周期指令
☆DJNZRn,rel是双机器周期指令
☆200=0C8H;
248=0F8H
ORG1000H
DELAY:
MOVR6,#200;
1Tm
LOOP1:
MOVR7,#248;
NOP;
LOOP2:
DJNZR7,LOOP2;
2Tm
DJNZR6,LOOP1;
RET;
软件循环延时1S(晶振12MHz)
☆1Tm=1uS1S=1000000uS
☆MOVRn#data是单机器周期指令
☆DJNZRn,rel是双机器周期指令
DL1S:
MOVR7,#10
DL1:
MOVR6,#200
DL2:
MOVR5,#250
DL3:
DJNZR5,DL3
DJNZR6,DL2
DJNZR7,DL1
RET
16进制数(00H—0FH)转ASCII码子程序
算法:
凡≥10的十六进制数加37H;
凡<10的十六进制数加30H。
ie.0~9→30H~39H,A~F→41H~46H
H2ASC:
MOVA,R2;
取待转换的数据(入口)
ADDA,#0F6H;
判此数是否≥10?
若≥10,则C=1;
<10,则C=0
重取待转换的数据
JNCAD30H;
小于10就跳去加30H
ADDA,#07H;
≥10就先加7再去加30H
AD30H:
ADDA,#30H
MOVR2,A;
存结果(出口)
根据16个双字节数的序号查表找出对应数据
STA1:
取待查数据的序号X(入口)
RLA;
每数占2个单元,序号要乘2
R3←序号x2(即偏移量)
MOVDPTR,#TABL;
DPTR←表格首地址
MOVCA,@A+DPTR;
(A)←查到数据低8位
XCHA,R3;
数据低8位存进R3(出口)
;
同时取出偏移量到A
INCDPTR;
DPTR指向下一个单元
再查到数据高8位
MOVR4,A;
将数据高8位存进R4(出口)
TABL:
DW050FH,0E89H,0A695H,1EAAH,0D9BH,7F93H
DW0373H,26D7H,2710H,9E3FH,1A66H,22E3H
DW1174H,16EFH,33E4H,6CA0H
END
求双字节补码程序
ORG0100H
MOVA,#80H
ANLA,addr1;
判断是否为正数
CJNEA,#0,TT
SJMPLOOP
TT:
XRLaddr1+1,#7FH
;
除第一位异或取反
XRLaddr1,#0FFH
低八位取反
INCaddr1
MOVaddr2,addr1
MOVA,#0
ADDCA,addr1+1
用ADDC
MOVaddr2+1,A
利用外部中断0做一个计数器。
当有脉冲时,A的内容加1。
并且当A的内容大于或等于100时将P1.0置位.
ORG0000h
LJMPMIN0
ORG0003h
LJMPINTB0
ORG000bh
RETI
ORG0013h
ORG001bh
ORG0023h
ORG0030h
MIN0:
MOVSP,#30H
SETBIT0
SETBEX0
CLRPX0
SETBEA
MOVA,#00
Min1:
NOP
LJMPMin1
ORG0100h
INTB0:
PushPSW
ADDA,#01
CJNEA,#100,INTB1
LJMPINTB2
INTB1:
JCINTB3
INTB2:
SETBP1.0
INTB3:
POPPSW
RETI
从P1.0脚输出频率=1KHz方波。
设:
晶振=6MHz。
利用T1定时中断。
分析:
fosc=6MHz
1机器周期=2S
1KHz方波周期=1mS
半个方波周期=500S
500uS÷
2uS=250
若选择模式2工作,8位定时器最大数值为:
28=256=0FFH+1
可以满足要求。
计算初值:
256-250=6
ORG0000H
AJMPMAIN
ORG001BH;
T1的中断矢量
CPLP1.0;
中断服务:
P1.0取非
RETI;
中断返回
MAIN:
MOVTMOD,#20H
MOVTH0,#6
MOVTL0,#6
SETBET1
SETBTR1
HERE:
AJMPHERE;
原地等待中断
用T1产生一个50Hz的对称方波,由P1.l输出,采用程序查询方式,fosc=12MHz。
首先确定工作方式、工作模式和定时初值。
1,选定时方式(C/T=0);
2,模式1(M2M1=01),
3,方波周期T=l/50=O.02s=20ms,用T1定时10ms,计数初值为:
X1=216-10×
10-3×
12×
106/12=65536-10000=55536=D8F0H;
既TH1=D8H,TL1=F0H。
TMOD00010000
源程序如下:
LJMPT1BUS
ORG0030h
T1BUS:
MOVTMOD,#10H;
T1模式1,定时
SETBTRl启动T1
LOOP:
MOVTH1,#0D8H;
T1计数初值
MOVTL1,#0F0H
JNBTF1,LOOP1;
T1没有溢出等待
CLRTF1;
产生溢出清标志位
CPLP1.1;
P1.l取反输出
SJMPLOOP;
循环
利用中断方式编程
LJMPT1MIN
ORG001Bh
LJMPLOOP
T1MIN:
MOVTH1,#0D8H;
MOVTL1,#0F0H
SETBEA;
CPU、T1开中断
SETBTRl;
启动T1
T1MIN2:
LJMPT1MIN2
ORG0100h
CPLP1.1;
P1.l取反输出
RETI
试编写由Pl.0输出一个周期为2分钟的方波信号的程序。
已知fosc=12MHz。
●解:
此例要求P1.0输出的方波信号的周期较长,用一个定时器无法实现。
解决的办法可采用定时器加软件计数的方法
●方法:
将T1设置为定时器方式,定时时间为10ms(即10ms中断一次由CPU自动调用一次中断服务程序),工作于模式1;
再利用T1的中断服务程序作为软件计数器;
共同实现一分钟的定时。
●整个程序由两部分组成,即由主程序和T1的中断服务程序。
其中主程序包括初始化程序和Pl.0输出操作程序,中断服务程序包括毫秒(ms)、秒(s)、分(min)的定时等。
●编写T1的中断服务程序时,应首先将T1初始化,并安排好中断服务程序中所用到的内部RAM中地址单元。
T1计数初值:
X=216-12×
10×
1000/12=55536=D8FOH。
中断服务程序所用到的地址单元安排如下:
40H作ms的计数单元,计数值为1s/10ms=100次;
4lH作s的计数单元,计数值为1min/1s=60次;
29H单元的D7位(位地址为4FH)作1分计时到的标志位,即标志用4FH
具体程序如下
主程序:
ORG0000H
AJMP0030H
ORG001BH
AJMP1100H
ORG0030H
T1定时,模式1
SETBTR1;
MOV40H,#100;
毫秒计数初值
MOV41H,#60;
秒计数初值
CLR4FH
TT:
JNB4FH,TT;
等待1分钟到
CLR4FH;
清分标志值
CPLPl.0;
输出变反
AJMPTT;
反复循环
T1中断服务程序:
(由001BH转来)
ORG1100H
PUSHPSW
TI重赋初值
DJNZ40H,TT1;
1秒到否?
1秒到,重赋秒的计数值
DJNZ41H,TT1;
1分到否?
MOV4lH,#60;
1分到了,重赋1分钟的计数值
SETB4FH;
置1分到标志位,告诉主程序。
TTl:
POPPSW
中断返回
【例】因外中断INT0、INT1已被占用,试利用定时/计数器T0扩展成外中断。
利用定时/计数器T0扩展成外中断时须有两个条件:
(1)是外部触发脉冲从P3.4输入(下降沿有效);
(2)是将定时/计数器设置成计数临界状态,即定时初值为FFH,再来一个脉冲即能溢出触发中断。
编程如下:
ORG0000H;
复位地址
LJMPSTART;
复位,转初始化程序START
ORG000BH;
T0中断入口地址
LJMPIT0;
转T0中断服务子程序IT0
ORG1000H;
初始化程序首地址
MOVSP,#60H;
置堆栈
MOVTMOD,#06H;
置T0计数器方式2
MOVTH0,#0FFH;
置T0初值
MOVTL0,#0FFH;
SETBPT0;
置T0为高优先级
MOVIE,#0FFH;
全部开中
SETBTR0;
T0启动
SJMPMAIN;
转主程序,并等待T0中断
ORG2000H;
T0中断服务子程序首地址
IT0:
…;
T0中断服务子程序
RETI;
发送程序发送一个字符,等待TI=1后再发送下一个字符。
1.查询方式:
TRAM:
MOVA,@R0;
取数据
MOVSBUF,A;
发送一个字符
WAIT:
JBCTI,NEXT;
等待发送结束
SJMPWAIT
NEXT:
INCR0;
准备下一次发送
SJMPTRAM
2.中断方式:
ORG0023H;
串行口中断入口
AJMPSINT
MAIN:
…;
初始化编程
MOVA,@R0;
MOVSBUF,A;
发送第一个字符
H:
SJMPH;
其它工作
SINT:
CLRTI;
中断服务程序
MOVA,@R0;
MOVSBUF,A;
发送下一个字符
RETI
选用偶校验方式发送
PIPL:
PUSHPSW;
保护现场
PUSHACC
CLRTI;
清发送中断标志以备下次发送
MOVA,@R0;
取由R0所指向的单元中的数据
MOVC,P;
将奇偶标志位通过C放进TB8
MOVTB8,C;
一起发送出去
MOVSBUF,A;
启动发送
INCR0;
指针指向下一个数据单元
POPACC;
恢复现场
选用偶校验方式接收:
PUSHPSW;
CLRRI;
清接收中断标志以备下次接收
MOVA,SBUF;
读进收到的数据
奇偶标志位C=JNBP,L1
JNCL1;
C=0时转到L1P=0时转到L1
JNBRB8,ERR;
P=1时转到L2,若RB8=0“出错”
SJMPL2;
RB8=1则表明接收正确,转L2
L1:
JBRB8,ERR;
P=0且RB8=1表明“出错”
L2:
MOV@R0,A;
P=0且RB8=0表明接收正确
POPPSWERR:
出错处理……
中断返回RETI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 典型 例题