当前位置:文档之家› 单片机实验程序

单片机实验程序

单片机实验程序软件实验一1、分别编程实现两个16位无符号数相加,结果存放在40H41H中;两个16位的无符号数相减,结果存放在30H31H中。

; 两个16位无符号数相加,结果存放在30H31H中ORG 0000HLJMP MAINORG 0030HMAIN :MOV R3,#01H ;输入加数高八位MOV R4,#23H ;输入加数低八位MOV R5,#45H ;输入被加数高八位MOV R6,#67H ;输入被加数低八位MOV A,R4 ;将R4存入寄存器AADD A,R6 ;A与R6相加,结果存入AMOV 31H,A ;将低八位的和数存入31HMOV A,R3 ;将R3存入寄存器AADDC A,R5 ;A与R5相加,结果存入AMOV 30H,A ;将高八位的和数存入30HSJMP $END; 两个16位的无符号数相减,结果存放在30H31H中。

ORG 0000HLJMP MAINORG 0030HMAIN :MOV R3,#12H ;输入减数高八位MOV R4,#34H ;输入减数低八位MOV R5,#56H ;输入被减数高八位MOV R6,#78H ;输入被减数低八位MOV A,R4 ;将R4存入寄存器ACLR C ;C位清"0"SUBB A,R6 ;A与R6相减,结果存入AMOV 31H,A ;将低八位的差数存入31HMOV A,R3 ;将R3存入寄存器ASUBB A,R5 ;A与R5相减,结果存入A MOV 30H,A ;将高八位的差数存入30HSJMP $END2、编程实现X (X ≥40)Y= 2X (20<X<40)0(X≤20);实现X>=40时,Y=X;20<X<40时,Y=2X;X<20时,Y=0 X的值存放于R2中,Y的值存放于R3中ORG 0000HLJMP MAINORG 0030HMAIN:CMP40: CJNE R2,#40,NEXT0 ;X与40比较,结果由CY读出NEXT0: JNC BIGGER40 ;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40 JC CMP20 ;判断C的值,C不为0时则X小于40,跳到CMP20CMP20: CJNE R2,#21,NEXT1 ;X与21比较,结果由CY读出NEXT1: JNC BIGGER20 ;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20JC SMALLER20 ;判断C的值,C不为0时则X小于20,跳到SMALLER20BIGGER40: MOV A,R2 ;X>=40时,将X的值赋给存放Y的值的R3MOV R3,ASJMP $BIGGER20: MOV A,R2 ;20<X<40时,将X的值乘以2再赋给存放Y的R3MOV B,#02MUL ABMOV R3,ASJMP $SMALLER20: CLR A ;X<20时,将0赋给YMOV R3,ASJMP $3、学生实验:编写80个数相加,结果存放在30H31H中。

;编写80个数相加,结果存放在30H31H中ORG 0000HLJMP MAINORG 0030HMAIN: MOV R2,#80 ;输入累加的个数N存放到R2中MOV R0,#32H ;输入参与累加数据的首个数据的地址ADDER: MOV A,@R0 ;将参与累加的数据的值赋给AADD A,31H ;将A与当前累加数的和的低位(31H)相加结果存放在A中 MOV 31H,A ;将求得的和数的低位放入31H中CLR A ;对A清"0"ADDC A,30H ;计算已得累加数高位与当前进位相加,结果存放在A中 MOV 30H,A ;将求得的和数的高位放入30H中INC R0 ;R0中的数据加1LOOP: DJNZ R2,ADDER ;循环判断SJMP $END软件实验二1、编写R1×R2R3=R4R5R6,R1R2×R3R4=R4R5R6R7。

; R1×R2R3=R4R5R6ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R3 ; R1乘以低位数R3 R3xR1=R5R6MOV B,R1MUL ABMOV R6,AMOV R5,BMOV A,R2 ; R1乘以高位数R2 ;R2xR1=R4AMOV B,R1MUL ABMOV R4,BADD A,R5 ; 高。

低乘数结果相加 R5+A=R5MOV R5,A ;R4+CY=R4MOV A,R4ADDC A,#00HMOV R4,ASJMP $END;R1R2×R3R4=R4R5R6R7ORG 0000H LJMP MAINORG 0030H;————R2乘以R3R4存放于R5R6R7MAIN: LCALL MULLMOV R5,30HMOV R6,31HMOV R7,32H ;调用子程序MULL;————R1先赋给R2,再乘以R3R4MOV A,R1MOV R2,ALCALL MULL ;调用子程序MULLCLR C ;进位清"0"MOV A,32H ;R6加上32H中的值,存放于R6ADD A,R6MOV R6,AMOV A,R5 ;R5加上31H中的值,存放于R5ADDC A,31HMOV R5,AMOV A,#00H ;30H加上进位C,存放于R4ADDC A,30HMOV R4,ASJMP $;————子程序MULL:实现R2乘以R3R4R结果存放于30H31H32H MULL: MOV A,R4 ; R2乘以低位数R4 R3xR1=31H32HMOV B,R2MUL ABMOV 32H,AMOV 31H,BMOV A,R3 ; R2乘以高位数R3 ;R2xR1=30HMOV B,R2MUL ABMOV 30H,BADD A,31H ; 高。

低乘数结果相加 31H+A=31HMOV 31H,A ;30H+CY=30HMOV A,30HADDC A,#00HMOV 30H,ARETEND2、找出内RAM中从30H到50H中在最小值。

;找出内RAM中从30H到50H中在最小值,并将最小值存放于60H中ORG 0000HLJMP MAINORG 0030HADDRMAX EQU 50H ;定义ADDRMAX为所查找范围的上限值ADDRMIN EQU 30H ;定义ADDRMIN为所查找范围的下限值MAIN: MOV R0,#ADDRMIN ;将地址指针存放于R0中,并赋初值LOOP1: MOV 60H,@R0LOOP2: CJNE R0,#ADDRMAX,NEXT1;判断R0是否达到所查找范围的上限NEXT1: JNC OUT ;是就跳出循环INC R0 ;否则RO加1MOV A,@R0CJNE A,60H,NEXT2 ;将相邻两个数((R0))和(60H)进行比较NEXT2: JNC LOOP2 ;若((R0))大于(60H)则直接跳到LOOP2JC LOOP1 ;若((R0))小于或者等于(60H)则 OUT: SJMP $ ;跳到LOOP1END3、用查表方式编写y=x3(x为0~9的整数),要求分别用@A+DPTR和@A+PC的方法。

;用@A+DPTR的方法,X存放于R4中,Y存放于R2R3中ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R4ADD A,R4 ;将累加器A翻倍MOV DPTR,#TABMOVC A,@A+DPTRMOV R2,AMOV A,R4 ;重新将X的值存入AADD A,R4 ;A翻倍INC A ;A加1MOVC A,@A+DPTRMOV R3,ASJMP $ TAB: DW 0000H,0001H,0008H,0019H,0040H ;0~9立方表DW 007DH,00C4H,0157H,0200H,02D9HEND;用@A+PC的方法。

X存放于R4中,Y存放于R2R3中ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,R4ADD A,R4 ;存放X的R4加倍 ADD A,#09H ;累加器加上偏移量 MOVC A,@A+PCMOV R2,AMOV A,R4ADD A,R4ADD A,#04H ;累加器加上偏移量 MOVC A,@A+PCMOV R3,ASJMP $TAB: DW 0000H,0001H,0008H,0019H,0040H ;0~9立方表DW 007DH,00C4H,0157H,0200H,02D9HEND4.编程实现:时钟频率6MHZ,延时2MS;时钟频率12MHZ,延时10S;延时2MS,时钟频率6MHZORG 0000HLJMP MAINORG 0030HMAIN: LCALL DELSJMP $DEL: MOV R7,#5 ;外循环DEL1: MOV R6,#100 ;内循环DEL2: DJNZ R6,DEL2 ;先执行内循环,后执行外循环DJNZ R7,DEL1RETEND;延时10S,时钟频率12MHZORG 0000HLJMP MAINORG 0030HMAIN: LCALL DELSJMP $DEL: MOV R7,#5 ;外二循环DEL1: MOV R6,#50 ;外一循环DEL2: MOV R5,#200 ;内循环DEL3: DJNZ R5,DEL3 ;先执行内循环,后执行外一循环DJNZ R6,DEL2 ;最后执行外二循环DJNZ R7,DEL1RETEND软件实验三1、用查表方式编写y=x13+x23+x33。

(x为0~9的整数)#include <reg51.h>void main(){int a[10]={0,1,8,27,64,125,216,343,512,729}; //0~9的立方表int x1,x2,x3,y;x1=0;x2=6;x3=6;y=a[x1]+a[x2]+a[x3]; //X1,X2,X3的立方和while(1);}2、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。

试编写有关程序。

#include <reg51.h>void main(){unsigned char data a[10]={0,1,8,19,40,75,88,57,2,9}; //二进制数据存入数组a中 char i;char *d=0x50; //定义d为指向内RAM50H的指针//对a[i]进行奇偶校验,偶数存入内RAM50H开始的数据中for(i==0;i<10;i++){ACC=a[i]; //a[i]存入累加器ACC中 if (P==0) //对a[i]进行奇偶校验{*d=a[i]; //偶数存入内RAM50H开始的数据区中d++; //d指针加1}}while(1);}3、有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。

相关主题