绍兴文理学院单片机实验考试文档资料.docx

上传人:b****1 文档编号:439841 上传时间:2022-10-10 格式:DOCX 页数:11 大小:60.40KB
下载 相关 举报
绍兴文理学院单片机实验考试文档资料.docx_第1页
第1页 / 共11页
绍兴文理学院单片机实验考试文档资料.docx_第2页
第2页 / 共11页
绍兴文理学院单片机实验考试文档资料.docx_第3页
第3页 / 共11页
绍兴文理学院单片机实验考试文档资料.docx_第4页
第4页 / 共11页
绍兴文理学院单片机实验考试文档资料.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

绍兴文理学院单片机实验考试文档资料.docx

《绍兴文理学院单片机实验考试文档资料.docx》由会员分享,可在线阅读,更多相关《绍兴文理学院单片机实验考试文档资料.docx(11页珍藏版)》请在冰豆网上搜索。

绍兴文理学院单片机实验考试文档资料.docx

绍兴文理学院单片机实验考试文档资料

绍兴文理学院单片机实验考试程序:

基本部分:

实验三:

汇编语言程序设计

⑴清零:

把外部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]={

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1