绍兴文理学院单片机实验考试文档
更新时间: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
#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
#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
#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
正在阅读:
绍兴文理学院单片机实验考试文档11-09
维修电工中级实训指导书 - 图文04-22
人生若只如初见11-03
数字图像处理之彩色图像的处理10-31
夏晨作文650字06-30
全场梳理 补充论证 价值升华04-21
养殖类专业课试卷05-23
教科版小学科学二年级上册优质教案:1.4《观察月相》 - 图文01-28
C语言课程设计万年历打印12-13
银行工作总结 计划03-12
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 绍兴
- 文理
- 单片机
- 实验
- 文档
- 考试
- 学院