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

更新时间:2023-11-09 08:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

实验三:汇编语言程序设计

(1)清零:把外部RAM 2000H~20FFH的内容清零。

ORG 0000H

AJMP MAIN ORG 0030H MAIN: MOV A,#00H //累加器A清零 MOV R0,#00H

MOV DPTR,#2000H //将2000H内容送给DPTR LOOP: MOV @DPTR,A //将2000H中的内容清零 INC DPTR //DPTR增1

DJNZ R0,LOOP //减1不为0则转移,继续循环,否则结束 SJMP $ END

(2)拆字:把外部RAM 2000H的内容拆开,高位送外部RAM 2001H低位,低位送外部RAM 2002H低位,外部RAM 2001H、外部RAM 2002H高位清零。 ORG 0000H AJMP MAIN ORG 0030H

MAIN: MOV DPTR,#2000H //DPTR中为2000H MOVX A,@DPTR //2000H内容送A

MOV B,A //将A中内容寄存在B中 SWAP A //高低位交换 ANL A,#0FH //高位清零

INC DPTR //DPTR中为2001H

MOVX @DPTR,A //将A中的内容(2000H的高位)给2001H的低位 INC DPTR //DPTR中为2002H

MOV A,B //将B中的内容(2000H内容)还给A ANL A,#0FH //屏蔽200OH的高位

MOVX @DPTR,A //将A中的内容(2000H的低位)给2002H的高位 SJMP $ END

(3)拼字:把外部RAM 2000H、外部RAM 2001H的低位分别送入外部RAM 2002H高低位。

ORG 0000H AJMP MAIN ORG 0030H

MAIN: MOV DPTR,#2000H //将2000H中的内容送DPTR MOVX A,@DPTR //将2000H中的内容送A ANL A,#0FH //交换高低位送B SWAP A MOV B,A

INC DPTR //DPTR增1 MOVX A,@DPTR ANL A,#0FH //屏蔽高位,将2001H内容送A ORL A,B //A和B或后送2002H INC DPTR MOVX @DPTR,A SJMP $ END

(4)在内部RAM中查找是否有单元为特殊值。(单重循环)如:查找找内部RAM的30H-50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。

ORG 0000H AJMP START ORG 0030H

START: MOV R0,#30H MOV R2,#20H LOOP: MOV A,@R0 CJNE A,#0AAH,NEXT MOV 51H,#01H LJMP EXIT NEXT: INC R0 DJNZ R2,LOOP MOV 51H,#00H OVER: SJMP $

END

实验四:汇编语言程序设计

1.外部RAM数据块搬移程序:

(1)试将片内RAM中30H~3FH的数据传送到片外RAM地址为1000H开始的单元中。数据搬移:(内部和外部数据存储器之间,单重循环)

ORG 0000H AJMP MAIN ORG 0030H

MAIN: MOV R0,#30H

MOV R1,#10H

MOV DPTR,#1000H

LOOP: MOV A,@R0

MOVX @DPTR,A INC DPTR INC R0

OVER: DJNE R1,LOOP

SJMP $ END

(2)将外部RAM中R2、R3为源地址的N个字节数据传送到R4、R5为目的地址的外部RAM区中,字节个数存放在R6、R7中。

数据区传送功能:在R2、R3中输入源地址(例如0000H),R4、R5中输入目的地址(例如2000H),R6、R7中输入字节数(例如2000H),运行程序,检查0000~1FFFH中内容是否和2000H~3FFFH中内容完全—致。 ORG 0000H AJMP MAIN ORG 0030H

MAIN: MOV DPL,R3 ;R3内容给DPTR低位 MOV DPH,R2 ;R2内容给DPTR高位

MOVX A,@DPTR ;R2,R3源地址内容给累加器A,即取数 MOV DPL,R5 ;R5内容给DPTR低位 MOV DPH,R4 ;R4内容给DPTR高位 MOVX @DPTR,A ;数据搬移

CJNE R3,#0FFH,LOOP1 ;R3是否需要进位,即传送数据是否超过OFFH INC R2 ;若超过则进位 LOOP1: INC R3 ;源地址加1

CJNE R5,#0FFH,LOOP2 ;R5是否需要进位,即接受数据是否超过OFFH INC R4 ;若超过则进位

LOOP2: INC R5 ;目的地址加1

CJNE R7,#00H,LOOP3 ;若低位字节数不为0,则跳转LOOP3,字节数减1 CJNE R6,#00H,LOOP4 ;若高位字节数不为0,则跳转LOOP4,产生借位,高低位字节数均减1 SJMP $ NOP ;空操作 LOOP3: DEC R7 SJMP MAIN LOOP4: DEC R7 DEC R6 SJMP MAIN END

2.双字节*单字节无符号乘法程序:是编写程序,其功能为:(R0R1)*(R2)→R3R4R5。 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV A,R1 MOV B,R2

MUL AB ;R1*R2

XCH A,R5 ;乘积低位→R5,R5→A准备乘数 MOV R4,B ;乘积高位暂存R4

MOV A,R0 MOV B,R2 MUL AB ADD A,R4 CLR A ADDC A,B MOV R3,A SJMP $ END

;R0*R2

;乘积低位加上一次的乘积高位暂存R4 ;清累加器

;高位加从低位来的进位给乘积高位

提高部分: 1、 数据排序。(256个数以内)

编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。

数据排序功能:把RAM空间50H~5AH中放入不等的数据,运行本实验程序后检查50H~5AH中数据是否按从小到大排列。

ORG 0000H AJMP START ORG 0030H

MOV R2,#10 ;将10赋给R2 MOV R1,A ;将A的值给R1 MOV A,R2 ;将R2的值给A MOV R5,A ;将A的值给R5 CLR F0

;将F0清零

MOV A,@R1 ;将R1的地址给A INC R1 CLR C

;R1自加 ;清零进位标志

START: MOV R0,#50H ;将50h的值赋给R0 SORT: MOV A,R0 ;将R0值给A

LOOP: MOV R3,A ;将A的值给R3

MOV A,@R1 ;将R1的地址给A SUBB A,R3 ;将A与R3的值相减

JNC LOOP1 ;如果借位跳转到LOOP1 反之按顺序往下 SETB F0

;把F0置1

MOV A,R3 ;把R3的值给A XCH A,@R1 ;将A与R1的字节交换 DEC R1 INC R1

;R1自减 ;R1自加

XCH A,@R1 ;将A与R1的字节交换

MOV A,@R1 ;将R1的地址赋给A

LOOP1:

DJNZ R5,LOOP ;判断R5是否为0 是则跳转 反之按顺序继续程序 JB F0,SORT ;判断F0是否为1,是则跳转 反之按顺序继续程序 RET END

;返回

;数据保留 ;结束

SJMP $

2、 动态显示。(用实验6仿真图)

实验二:编写程序,在数码管上显示固定“654321”字形

#include #include

#define uchar unsigned char #define uint unsigned int

uchar code tab1[]={0xF9,0xA4,0xB0,0x99,0x92,0x82}; //数码管显示数字1-6 uchar code tab2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //控制数码管位选 uchar i; void delay(uint ms) //延时1Ms { uchar i; while(ms--) for(i=0;i<123;i++); }

void main() { while(1) { for(i=0;i<6;i++) { P1=tab2[i]; //选择数码管位选 P0=tab1[i]; //选择数码管显示字形 delay(1); P0=0xff; //数码管消影 } } }

3、 脉冲计数并显示。(用实验6仿真图)

实验五 定时/计数器实验:将定时/计数器0外部输入的脉冲进行计数。 #include #include

#define uchar unsigned char //宏定义 用uchar代替unsigned char #define uint unsigned int uchar code tab1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned long int count; //计数值 uint sum;

uchar num[6],flag,i,j;

uchar code tab2[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; void delay(uint ms) //延时MS

{

uchar i; while(ms--)

for(i=0;i<123;i++); }

void display() //显示子函数 { 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]=count0000/10000;//第5位 num[3]=count000/1000;//第4位 num[2]=count00/100;//第3位 num[1]=count0/10;//第2位 num[0]=count;//第1位 for(i=0;i<6;i++) {

P1=tab2[i];

if(i!=0 && num[i]==0) //消0显示 { flag=0;

for(j=i;j<6;j++) {

if(num[j]!=0) //该位为0的情况下前面位是否还有大于0的值

{ flag=1;

break; //跳出循环 } } if(flag)

P0=tab1[0]; //若有则该位显示0 else

P0=0xff; //若没有有则该位不显示

} else

P0=tab1[num[i]]; //显示相应位的数字 delay(1);

P0=0xff; //消去阴影 }

}

void main() {

TMOD=0x05; //开计数器 TH0=0; TL0=0; TR0=1; EA=1; ET0=1; while(1) {

//keyscan(); display(); } }

void intr() interrupt 1 {

sum++; }

4、 24s倒计数器。(用实验6仿真图)

#include #include

#define uchar unsigned char #define uint unsigned int

uchar code tab1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//段选 unsigned int i;

unsigned char count,a,b;

void delay(uint ms) //延时子程序 {

uchar i;

}

while(ms--) for(i=0;i<123;i++);

void main() {

TMOD=0x02; //方式2定时 TH0=0x06; //定时赋初值 TL0=0x06; //自动重载值 EA=1;//开中断 ET0=1; TR0=1;

i=0; //循环计数值 count=24; //倒计时值 while(1) {

a=count/10; //取十位 b=count; //取个位 P1=0xfd;

P0=tab1[a]; //显示十位

delay(3); P0=0xff; P1=0xfe;

}

P0=tab1[b]; //显示个位 delay(3);

P0=0xff; //消除阴影 }

void intr() interrupt 1 //开定时器中断 { }

i++;

if(i@00==0) //1S循环,250*4000*1us=1S { }

if(count==0)

count=24; //满24重新计数

else

count--; //未满24继续减1

本文来源:https://www.bwwdw.com/article/bccv.html

Top