绍兴文理学院单片机实验考试文档资料.docx
《绍兴文理学院单片机实验考试文档资料.docx》由会员分享,可在线阅读,更多相关《绍兴文理学院单片机实验考试文档资料.docx(11页珍藏版)》请在冰豆网上搜索。
绍兴文理学院单片机实验考试文档资料
绍兴文理学院单片机实验考试程序:
基本部分:
实验三:
汇编语言程序设计
⑴清零:
把外部RAM2000H-20FFH的内容清零。
ORG0000H
AJMPMAIN
ORG0030H
累加器A清零
MAIN:
MOVA,#00H//
MOVR0,#00H
//将2000H内容送给DPTR//将2000H中的内容清零
//DPTR增1
MOVDPTR,#2000H
LOOP:
MOV@DPTR,A
INCDPTR
DJNZR0,LOOP//减1不为0则转移,继续循环,否则结束
SJMP$END
⑵拆字:
把外部RAM2000H勺内容拆开,高位送外部RAM2001H低位,低位送外部RAM2002H氐位,外部RAM2001H外部RAM2002HS位清零。
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#2000H//DPTR中为2000H
MOVXA,@DPTR
MOVB,A
SWAPA
ANLA,#0FH
INCDPTR
MOVX@DPTR,A//将A中的内容(2000H的高位)给2001H的低位INCDPTR
MOVA,B
ANLA,#0FH
MOVX@DPTR,A//将A中的内容(2000H的低位)给2002H的高位SJMP$
END
(3)拼字:
把外部RAM2000H外部RAM2001H的低位分别送入外部RAM2002H咼低位。
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVDPTR,#2000H//将2000H中的内容送DPTR
MOVXA,@DPTR//将2000H中的内容送A
ANLA,#0FH//交换高低位送B
SWAPA
MOVB,A
INCDPTR//DPTR增1
MOVXA,@DPTR
ANLA,#0FH//屏蔽高位,将2001H内容送A
ORLA,B//A和B或后送2002H
INCDPTR
MOVX@DPTR,A
SJMP$
END
(4)在内部RAM中查找是否有单元为特殊值。
(单重循环)如:
查找找内部RAM的30H-50H单元中是否有0AAH这一数据。
若有,则将51H单元置为“01H';若未找到,
1•外部RAM数据块搬移程序:
(1)试将片内RAM中30H~3FH的数据传送到片外RAM地址为1000H开始的单元中。
数据搬移:
(内部和外部数据存储器之间,单重循环)
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVR0,#30H
MOVR1,#10H
MOVDPTR,#1000H
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCDPTR
INCR0
OVER:
DJNER1,LOOP
SJMP$
END
(2)将外部RAM中R2R3为源地址的N个字节数据传送到R4R5为目的地址的外部RAME中,字节个数存放在R6R7中。
数据区传送功能:
在R2R3中输入源地址(例如0000H,R4R5中输入目的地址(例如2000H,R6R7中输入字节数(例如2000H),运行程序,检查0000〜仆FFH中内容是否和2000H-3FFFH中内容完全一致。
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVDPL,R3R3内容给DPTR氐位
MOVDPH,R2R2内容给DPTF高位
MOVXA,@DPTRR2,R3源地址内容给累加器A,即取数
MOVDPL,R5R5内容给DPTR[低位
MOVDPH,R叙4内容给DPTF高位
MOVX@DPTR,A数据搬移
CJNER3,#0FFH,LOOP1;R3是否需要进位,即传送数据是否超过OFFH
INCR2;若超过则进位
LOOP1:
INCR3;源地址加1
CJNER5,#0FFH,LOOP2;R5是否需要进位,即接受数据是否超过OFFH
INCR4;若超过则进位
LOOP2:
INCR5;目的地址加1
CJNER7,#00H,LOOP3;若低位字节数不为0,则跳转LOOP3字节数减1
CJNER6,#00H,LOOP4;若高位字节数不为0,则跳转LOOP4产生借位,
高低位字节数均减1
SJMP$
NOP;空操作
LOOP3:
DECR7
SJMPMAIN
LOOP4:
DECR7
DECR6
SJMPMAIN
END
2.双字节*单字节无符号乘法程序:
是编写程序,其功能为:
(R0R1)*(R2)
fR3R4R5
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVA,R1
MOVB,R2
MULAB;R1*R2
XCHA,R5;乘积低位—R5,R5^A准备乘数
MOVR4,B;乘积高位暂存R4
MOVA,R0
MOVB,R2
MULAB;R0*R2
ADDA,R4;乘积低位加上一次的乘积高位暂存R4
CLRA;清累加器
ADDCA,B;高位加从低位来的进位给乘积高位
MOVR3,A
SJMP$
END
提高部分:
1、数据排序。
(256个数以内)
编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。
数据排序功能:
把RAM空间50H-5AH中放入不等的数据,运行本实验程序后检查50H〜5AH中数据是否按从小到大排列。
ORG0000H
AJMPSTART
ORG0030H
START:
MOVR0,#50H;将50h的值赋给R0
MOVR2,#10;将10赋给R2SORT:
MOVA,R0;将R0值给A
MOVR1,A;将A的值给R1
MOVA,R2;将R2的值给A
MOVR5,A;将A的值给R5
CLRF0;将F0清零
MOVA,@R1;将R1的地址给ALOOP:
MOVR3,A;将A的值给R3
INCR1;R1自加
CLRC;清零进位标志
MOVA,@R1;将R1的地址给A
SUBBA,R3;将A与R3的值相减
JNCLOOP1;如果借位跳转到LOOP1反之按顺序往下
SETBF0;把F0置1
MOVA,R3;把R3的值给A
XCHA,@R1;将A与R1的字节交换
DECR1;R1自减
XCHA,@R1;将A与R1的字节交换
INCR1;R1自加
LOOP1:
MOVA,@R1;将R1的地址赋给A
DJNZR5,LOOP;判断R5是否为0是则跳转反之按顺序继续程序
JBF0,SORT;判断F0是否为1,是则跳转反之按顺序继续程序
RET;返回
SJMP$;数据保留
END;结束
2、动态显示。
(用实验6仿真图)
实验二:
编写程序,在数码管上显示固定“654321”字形
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab1[]={0xF9,0xA4,0xB0,0x99,0x92,0x82};〃数码管显示数字1-6
ucharcodetab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//控制数码管位选
uchari;
voiddelay(uintms)//延时1Ms
{
uchari;
while(ms--)
for(i=0;i<123;i++);
}
voidmain()
{
while
(1)
{
for(i=0;i<6;i++)
{
P1=tab2[i];//选择数码管位选
PO=tab1[i];//选择数码管显示字形
delay
(1);
P0=0xff;〃数码管消影
}
}
}
3、脉冲计数并显示。
(用实验6仿真图)
实验五定时/计数器实验:
将定时/计数器0外部输入的脉冲进行计数
#include
#include
#defineucharunsignedchar//宏定义用uchar代替unsignedchar
#defineuintunsignedint
code
uchartab1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsignedlongintcount;//计数值uintsum;
ucharnum[6],flag,i,j;
ucharcodetab2[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
voiddelay(uintms)//延时MS
{uchari;
while(ms--)for(i=0;i<123;i++);
}
voiddisplay。
//显示子函数
{if(sum>1000000)
{sum=0;
TH0=0;TL0=0;
count=0;}else
count=sum*65536+TH0*256+TL0;//取计数值num[5]=count/100000;//第6位num[4]=count%100000/10000;〃第5位num[3]=count%10000/1000;〃第4位num[2]=count%1000/100;〃第3位num[1]=count%100/10;〃第2位num[0]=count%10;〃第1位for(i=0;i<6;i++)
{
{flag=0;
for(j=i;j<6;j++)
if(num[j]!
=0)
//该位为0的情况下前面位是否还有大于
的值
{flag=1;
break;
}
}if(flag)
//跳出循环
P0=tab1[0];//else
若有则该位显示0
P0=0xff;
//若没有有则该位不显示
P1=tab2[i];
if(i!
=0&&num[i]==0)//消0显示
0
}
else
P0=tab1[num[i]];//显示相应位的数字
delay
(1);
P0=0xff;//消去阴影
}
voidmain()
{
TMOD=0x05;//开计数器
TH0=0;
TL0=0;
TR0=1;
EA=1;
ET0=1;
while
(1)
{
//keyscan();
display。
;
}
}
voidintr()interrupt1
{
sum++;
}
4、24s倒计数器。
(用实验6仿真图)
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
段选
ucharcodetab1[10]={