山大单片机实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1单片机实验报告孙洪悦20112.1实验1:汇编程序实验12.1.2自我完成实验(1)实验内容将片内RAM30H单元中的8位二进制数转换成10进制数。希望转换后的结果保存于31H和32H,31H低4位存放个位,高4位存放十位,32H低4位存放百位,高4位为0自我完成实验程序ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#62H;MOV30H,#0AFH;先将30H写上100MOVR0,#32H;将百位地址送R0MOVA,30H;这句写错了,应该是将30H的内容送给A,而不是30H,我误写成了#30HMOVB,#64H;除数为100DIVAB;AB相除MOV@R0,A;将百位的数送给32H地址MOVA,B;将余数送给AMOVB,#0AH;将10送BDIVAB;AB相除SWAPA;高低四位交换DECR0;R0减1到31HMOV@R0,A;将十位送31H的高四位MOVA,BANLA,#0FHORL31H,A;31高低四位分别存十和百位SJMP$END2.1总结与提高:本程序用了一个小算法,一个三位数数X除以100,商a为百位,余数为:X-100*a再用此余数除10,商为十位,余数为个位。2.2实验2:汇编程序实验22.2.2自我完成实验(1)实验内容2将片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。程序及其注释②自我完成实验程序第一种排序方法:ORG0000HAJMPMAINORG0090HMAIN:MOVSP,#62H;MOVA,#0HMOVR1,#30HMOVR7,#20HMOVDPTR,#TABLEMOVR0,#1FH;执行31次LOOP1:MOVCA,@A+DPTRMOV@R1,AINCR1INCDPTRMOVA,#0HDJNZR7,LOOP1;执行32次循环,在30-4F写表格数据LOOP2:MOVR1,#30H;将起始地址给R1MOVA,R0;R0为执行31次MOVR2,A;把进行一次冒泡的次数存到R2中LOOP3:CLRC;清CMOVA,@R1;;比较开始,取第一个数MOVR3,A;腾出累加器INCR1;指向下一个地址SUBBA,@R1;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JCLOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行MOVA,R3;把后一个数存到累加器下XCHA,@R1;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交3DECR1;R1自减,准备将后面的数存到前面MOV@R1,A;将后面的数存到前面INCR1;R1自增,准备下次转换,以上五行为交换LOOP4:DJNZR2,LOOP3;R2自减,为下次冒泡准备DJNZR0,LOOP2;跳回去进行下一轮冒泡SJMP$ORG30HTABLE:DB1,3,9,2,17,4,11,6DB5,20,100,64,21,14,79,35DB92,7,91,23,65,16,13,18DB18,73,65,101,27,19,62,69END第二种排序方法;ORG0000HAJMPMAINORG0090HMAIN:MOVSP,#62H;MOVA,#0HMOVR1,#30HMOVR7,#20HMOVDPTR,#TABLEMOVR0,#1FH;执行31次LOOP1:MOVCA,@A+DPTRMOV@R1,AINCR1INCDPTRMOVA,#0HDJNZR7,LOOP1;执行32次循环,在30-4F写表格数据LOOP2:MOVR1,#30H;将起始地址给R1MOVA,R0;R0为执行31次MOVR2,A;把进行一次冒泡的次数存到R2中4MOVR4,#30H;R4存的是最大数的位置LOOP3:CLRC;清CMOVA,@R1;;比较开始,取第一个数MOVR3,A;腾出累加器INCR1;指向下一个地址MOVA,@R4SUBBA,@R1;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JCLOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行;MOVA,R3;把后一个数存到累加器下;XCHA,@R1;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交;DECR1;R1自减,准备将后面的数存到前面;MOV@R1,A;将后面的数存到前面;INCR1;R1自增,准备下次转换,以上五行为交换DJNZR2,LOOP3;R2自减,为下次冒泡准备LOOP4:MOVA,R1;MOVR4,ADJNZR2,LOOP3DJNZR0,LOOP2;跳回去进行下一轮冒泡SJMP$ORG30HTABLE:DB1,3,9,2,17,4,11,6DB5,20,100,64,21,14,79,35DB92,7,91,23,65,16,13,18DB18,73,65,101,27,19,62,69END总结与提高:所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序2.3C语言程序实验5自我完成实验(1)实验内容将片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。#includereg51.h#includestdio.h#includestdlib.h#defineucharunsignedchar#defineuintunsignedint//uchardataa[32]_at_0x30;//设定数组a的起始地址为30uchardataa[32]_at_0x30;//设定数组a的起始地址为30uinti_at_0x55;uchardatab[32]={1,3,9,2,17,4,11,6,5,20,100,64,21,14,79,35,92,7,91,23,65,16,13,18,18,73,65,101,27,19,62,69};voidfuzhi(){ucharj;//srand(5);for(j=0;j=31;j++){//a[j]=rand();a[j]=b[j];}}/*voidmaopao(uchara[],ucharnum){ucharj=0,temp=0,t=0;6for(j=(num-1);j0;j--){while(tj){if(a[t]=a[t+1]){temp=a[t+1];a[t+1]=a[t];a[t]=temp;}t++;}t=0;}}*///第二种方法实现冒泡voidmaopao(ucharc[],ucharnum){ucharj=0,temp=0,m=0;ucharweizhi=0;ucharmaxloc=31;for(j=num;j0;j--){weizhi=0;for(m=1;m=j;m++){if(c[weizhi]c[m]){weizhi=m;}}temp=c[weizhi];c[weizhi]=c[maxloc];c[maxloc]=temp;maxloc--;}}voidmain(){fuzhi();7maopao(a,31);while(1);}总结与提高:C语言编写的代码也是用两种方法写的,其中一种已经被注释掉了。所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序3.1基本并行I/O口实验实验功能为:当按键SW1按下之后,D1-D8轮流点亮,点亮时间为100ms,当按键停下后,停止轮换,再次按下后继续轮换。ORG0000HAJMPMAINORG0030HMAIN:8MOVSP,#60HMOVP2,#0FFHMOV20H,#0FEHMOVR7,#8LOOP:SETBP1.0JNBP1.0,LOOP1AJMPLLOOP1:MOVA,20HMOVP2,AACALLDELAYMOVA,P2RLAMOV20H,AL:DJNZR7,LOOPDELAY:MOVR6,#200L1:MOVR5,#250DJNZR5,$DJNZR6,L1RET9SJMP$END总结与提高:1.按键去抖动是必要的2用移位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的。3.2扩展并行I/O口实验实验功能为:仿真实现交通信号灯控制功能。控制顺序为:①南北绿灯亮,同时东西红灯亮10s;②南北黄灯亮,同时东西红灯亮2s;③南北红灯亮,同时东西绿灯亮10s;④东西黄灯亮,同时南北红灯亮2s;⑤重复①~④。ORG0000HAJMPSTARTORG0003HSTART:10MOVSP,#60HMOVP0,#0FFHCLRP3.6STATE1:MOVDPTR,#0FE00HMOVA,#0F3HMOVX@DPTR,AMOVDPTR,#0FD00HMOVA,#0CHMOVX@DPTR,AACALLDELAY2STATE2:MOVDPTR,#0FE00HMOVA,#0C3HMOVX@DPTR,AMOVDPTR,#0FD00HMOVA,#0FHMOVX@DPTR,AACALLDELAY1STATE3:MOVDPTR,#0FE00HMOVA,#0FCHMOVX@DPTR,AMOVDPTR,#0FD00HMOVA,#03HMOVX@DPTR,AACALLDELAY2STATE4:MOVDPTR,#0FE00HMOVA,#3CHMOVX@DPTR,AMOVDPTR,#0FD00HMOVA,#0FHMOVX@DPTR,AACALLDELAY1AJMPSTATE1DELAY1:MOVR7,#20DL2:MOVR6,#200DL1:MOVR5,#250DJNZR5,$DJNZR6,DL111DJNZR7,DL2RETDELAY2:MOVR7,#100L2:MOVR6,#200L1:MOVR5,#250DJNZR5,$DJNZR6,L1DJNZR7,L2RETEND总结与提高:1.用汇编写程序比C难的一个地方我觉得就是控制逻辑不是那么直观,所以一定要注意程序的格式规范,尽量使用缩进,标号命名尽量通俗易懂2用移位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的4多积累一些常用代码,比如延时程序,只需简单改些参数就可以再次使用3.3静态LED显示实验控制要求图3.9中7SEG2为十位显示数码管,7SEG1为个位显示数码管,KEY_LOAD为倒计时初值按钮,KEY_START为倒计时启动按钮。要求实现的功能是:当KEY_LOAD按钮按下时加载倒计时初值(如:10s),当按下KEY_START按钮时,开始倒计时,每过1s,计时器减1,直到减到“00”为止。减到“00”时使P3.0引脚上的LED按10Hz频率进行闪烁,直到再次按下KEY_LOAD按钮才重新加载初值,并熄灭LED。再次按下KEY_START按钮又一次开始倒计时,如此反复。12ORG0000HAJMPMAINORG000BHAJMPT0INTORG001BHAJMPT1INTORG0100HMAIN:SETBP1.0SETBP1.1CLRP1.2CLRP1.3CLRP1.4MOVR4,#0MOVTMOD,#21HMOVTH1,#56;直接赋值就可MOVTL1,#56MOVTH0,#0B1HMOVTL0,#0E0HSETBET1SETBET0SETBEASETBTR1SETBTR0WAIT1:;定时器中断等待JBP1.2,S4JBP1.3,S5SJMPWAIT1S4:CLRP1.2;清标志位MOVR3,#9MOVDPTR,#0FD00H;十位显示0,个位循环MOVA,#0C0H13MOVX@DPTR,ALOOP:;09-

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功