绍兴文理学院单片机实验考试程序:
基本部分:
实验三:汇编语言程序设计
(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
拆字:把外部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
拼字:把外部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
在内部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
实验四:汇编语言程序设计
外部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 ;R0*R2
ADD A,R4 ;乘积低位加上一次的乘积高位暂存R4
CLR A ;清累加器
ADDC A,B ;高位加从低位来的进位给乘积高位
MOV R3,A
SJMP $
END
提高部分:
数据排序。(256个数以内)
编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。
数据排序功能:把RAM空间50H~5AH中放入不等的数据,运行本实验程序后检查50H~5AH中数据是否按从小到大排列。
ORG 0000H
AJMP START
ORG 0030H
START: MOV R0,#50H ;将50h的值赋给R0
MOV R2,#10 ;将10赋给R2
SORT: MOV A,R0 ;将R0值给A
MOV R1,A ;将A的值给R1
MOV A,R2 ;将R2的值给A
MOV R5,A ;将A的值给R5
CLR F0 ;将F0清零
MOV A,@R1 ;将R1的地址给A
LOOP: MOV R3,A ;将A的值给R3
INC R1 ;R1自加
CLR C ;清零进位标志
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 ;R1自减
XCH A,@R1 ;将A与R1的字节交换
INC R1 ;R1自加
LOOP1: MOV A,@R1 ;将R1的地址赋给A
DJNZ R5,LOOP ;判断R5是否为0 是则跳转 反之按顺序继续程序
JB F0,SORT ;判断F0是否为1,是则跳转 反之按顺序继续程序
RET ;返回
SJMP $ ;数据保留
END ;结束
动态显示。(用实验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; //数码管消影
}
}
}
脉冲计数并显示。(用实验6仿真图)
实验五 定时/计数器实验:将定时/计数器0外部输入的脉冲进行计数。
#include