山大单片机实验_第1页
山大单片机实验_第2页
山大单片机实验_第3页
山大单片机实验_第4页
山大单片机实验_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上单片机实验报告孙洪悦 20112.1实验1:汇编程序实验12.1.2 自我完成实验 (1)实验内容 将片内 RAM 30H 单元中的 8 位二进制数转换成 10 进制数。希望转换后的结果保存于 31H和 32H,31H 低 4 位存放个位,高 4 位存放十位,32H 低 4 位存放百位,高 4 位为 0自我完成实验程序ORG 0000H AJMPMAINORG 0030HMAIN:MOV SP,#62H ;MOV 30H,#0AFH;先将30H写上100 MOV R0,#32H;将百位地址送R0MOV A,30H;这句写错了,应该是将30H的内容送给A,而不是30,我

2、误写成了#30MOV B,#64H;除数为100DIV AB ;AB相除MOV R0,A ;将百位的数送给32H地址MOV A,B ;将余数送给AMOV B,#0AH;将10送BDIV AB;AB相除SWAP A ;高低四位交换DEC R0 ;R0减1 到31HMOV R0,A ;将十位送31H的高四位MOV A,BANL A,#0FHORL 31H,A;31高低四位分别存十和百位SJMP $END2.1总结与提高:本程序用了一个小算法,一个三位数数X除以100,商a为百位,余数为:X-100*a再用此余数除10,商为十位,余数为个位。2.2实验2:汇编程序实验22.2.2 自我完成实验 (1

3、)实验内容 将片内 RAM 30H 开始的 32 个单元中分布着随机的有符号 8 位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到 30H 开始的 32 个单元中(低地址存放小数据)。程序及其注释 自我完成实验程序第一种排序方法:ORG 0000H AJMP MAINORG 0090HMAIN:MOV SP,#62H ;MOV A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH;执行31次LOOP1:MOVC A,A+DPTRMOV R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32

4、次循环,在30-4F写表格数据LOOP2: MOV R1,#30H;将起始地址给R1MOV A,R0;R0为执行31次MOV R2,A;把进行一次冒泡的次数存到R2中LOOP3: CLR C ;清CMOV A,R1; ;比较开始,取第一个数MOV R3,A; 腾出累加器INC R1;指向下一个地址SUBB A,R1;取后一个数 ,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位 JC LOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行MOV A,R3;把后一个数存到累加器下XCH A,R1 ;累加器的数与R1指向的数交换位置, 即 ;前一个数和后一个数交DEC R

5、1 ;R1自减,准备将后面的数存到前面MOV R1,A;将后面的数存到前面INC R1 ;R1自增,准备下次转换,以上五行为交换LOOP4: DJNZ R2,LOOP3;R2自减,为下次冒泡准备DJNZ R0,LOOP2 ;跳回去进行下一轮冒泡SJMP $ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END第二种排序方法;ORG 0000H AJMP MAINORG 0090HMAIN:MOV SP,#62H ;MOV

6、 A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH;执行31次LOOP1:MOVC A,A+DPTRMOV R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32次循环,在30-4F写表格数据LOOP2: MOV R1,#30H;将起始地址给R1MOV A,R0;R0为执行31次MOV R2,A;把进行一次冒泡的次数存到R2中MOV R4,#30H;R4存的是最大数的位置LOOP3: CLR C ;清CMOV A,R1; ;比较开始,取第一个数MOV R3,A; 腾出累加器INC R1;指向下一个地

7、址MOV A,R4SUBB A,R1;取后一个数 ,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位 JC LOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行;MOV A,R3;把后一个数存到累加器下;XCH A,R1 ;累加器的数与R1指向的数交换位置, 即 ;前一个数和后一个数交;DEC R1 ;R1自减,准备将后面的数存到前面;MOV R1,A;将后面的数存到前面;INC R1 ;R1自增,准备下次转换,以上五行为交换DJNZ R2,LOOP3;R2自减,为下次冒泡准备LOOP4: MOV A,R1 ;MOV R4,ADJNZ R2,LOOP3DJNZ R0

8、,LOOP2 ;跳回去进行下一轮冒泡SJMP $ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END总结与提高:所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序2.3 C语言程序实验 自我完成实验 (1)实验内容 将片内 RAM 30H 开始的 32 个单

9、元中分布着随机的有符号 8 位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到 30H 开始的 32 个单元中(低地址存放小数据)。#include#include#include#define uchar unsigned char#define uint unsigned int/uchar data a32 _at_ 0x30;/设定数组a的起始地址为30uchar data a32 _at_ 0x30;/设定数组a的起始地址为30uint i _at_ 0x55;uchar data b32 = 1,3,9,2,17,4,11,6,5,20,100,64,21,14,79,

10、35,92,7,91,23,65,16,13,18,18,73,65,101,27,19,62,69;void fuzhi()uchar j;/srand(5);for(j=0;j0;j-)while(t=at+1)temp = at+1;at+1 = at;at = temp;t+;t = 0;*/第二种方法实现冒泡 void maopao(uchar c,uchar num)uchar j = 0,temp = 0,m = 0;uchar weizhi = 0;uchar maxloc = 31;for(j=num;j0;j-)weizhi = 0;for(m=1;m=j;m+)if(cw

11、eizhicm)weizhi = m;temp = cweizhi;cweizhi = cmaxloc;cmaxloc = temp;maxloc-;void main()fuzhi();maopao(a,31);while(1);总结与提高:C语言编写的代码也是用两种方法写的,其中一种已经被注释掉了。所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序3.1基本并行I/O口实验实验功能为: 当按键 SW1 按下之后,D1-D8 轮流

12、点亮,点亮时间为 100ms,当按键停下后,停止轮换,再次按下后继续轮换。ORG 0000HAJMP MAINORG 0030HMAIN:MOV SP,#60HMOV P2,#0FFHMOV 20H,#0FEHMOV R7,#8LOOP:SETB P1.0JNB P1.0,LOOP1AJMP LLOOP1:MOV A,20HMOV P2,AACALL DELAYMOV A,P2RL AMOV 20H,AL:DJNZ R7,LOOPDELAY:MOV R6,#200L1:MOV R5,#250DJNZ R5,$DJNZ R6,L1RETSJMP $END总结与提高:1.按键去抖动是必要的 2用移

13、位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的。3.2扩展并行I/O口实验实验功能为: 仿真实现交通信号灯控制功能。 控制顺序为: 南北绿灯亮,同时东西红灯亮 10s; 南北黄灯亮,同时东西红灯亮 2s; 南北红灯亮,同时东西绿灯亮 10s; 东西黄灯亮,同时南北红灯亮 2s; 重复。ORG 0000HAJMP STARTORG 0003HSTART:MOV SP,#60HMOV P0,#0FFHCLR P3.6STATE1:MOV DPTR,#0FE00HMOV A,#0F3HMOVX DPTR,AMOV DPTR,#0FD00HMOV A,#0CHMOVX

14、DPTR,AACALL DELAY2STATE2:MOV DPTR,#0FE00HMOV A,#0C3HMOVX DPTR,AMOV DPTR,#0FD00HMOV A,#0FHMOVX DPTR,AACALL DELAY1STATE3:MOV DPTR,#0FE00HMOV A,#0FCHMOVX DPTR,AMOV DPTR,#0FD00HMOV A,#03HMOVX DPTR,AACALL DELAY2STATE4:MOV DPTR,#0FE00HMOV A,#3CHMOVX DPTR,AMOV DPTR,#0FD00HMOV A,#0FHMOVX DPTR,AACALL DELAY1A

15、JMP STATE1DELAY1:MOV R7,#20DL2:MOV R6,#200DL1:MOV R5,#250DJNZ R5,$DJNZ R6,DL1DJNZ R7,DL2RETDELAY2:MOV R7,#100L2:MOV R6,#200L1:MOV R5,#250DJNZ R5,$DJNZ R6,L1DJNZ R7,L2RETEND总结与提高:1.用汇编写程序比难的一个地方我觉得就是控制逻辑不是那么直观,所以一定要注意程序的格式规范,尽量使用缩进,标号命名尽量通俗易懂2用移位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的多积累一些常用代码,比如延时程序,

16、只需简单改些参数就可以再次使用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 按钮又一次开始倒计时,如此反复。ORG

17、 0000HAJMP MAINORG 000BHAJMP T0INTORG 001BHAJMP T1INTORG 0100HMAIN:SETB P1.0SETB P1.1CLR P1.2CLR P1.3CLR P1.4MOV R4,#0MOV TMOD,#21HMOV TH1,#56;直接赋值就可MOV TL1,#56MOV TH0,#0B1HMOV TL0,#0E0HSETB ET1SETB ET0SETB EASETB TR1SETB TR0WAIT1: ;定时器中断等待JB P1.2,S4JB P1.3,S5SJMP WAIT1 S4:CLR P1.2;清标志位MOV R3,#9MOV

18、DPTR,#0FD00H;十位显示0,个位循环MOV A,#0C0HMOVX DPTR,ALOOP:;09-00循环JB P1.2,S4;判断显示过程中有无按键被按下JB P1.3,S5MOV A,R3MOV DPTR,#TABLEMOVC A,A+DPTRMOV DPTR,#0FE00HMOVX DPTR,ALCALL DELAY2;此处容易出错误DEC R3MOV A,R3INC A;JNZ LOOPSETB P1.4;到00后才闪灯SJMP WAIT1 S5:;装载初值CLR P1.3;清标志位MOV DPTR,#0FD00HMOV A,#0F9HMOVX DPTR,AMOV DPTR,

19、#0FE00HMOV A,#0C0HMOVX DPTR,ASJMP WAIT1 TABLE:DB 0C0H,0F9H,0A4H,0B0H,99HDB 92H,82H,0F8H,80H,90HT0INT:MOV TH0,#0B1H;T0工作在方式1 ,要装载初值MOV TL0,#0E0H;T0工作在方式1,20ms 检测按键JNB P1.1, S2;检测装载初值键JNB P1.0, S3;检测开始键RETIS2:CLR P1.4;检测装载初值键SETB P3.0;熄灭LEDSETB P1.3;装载显示初值RETIS3:CLR P1.4;检测开始键SETB P3.0;熄灭LEDSETB P1.2R

20、ETIT1INT:;T1 工作在方式2 8位重装JB P1.4,S6RETIS6:INC R4MOV A,#50;LED 闪烁CLR CSUBB A,R4JZ S1 RETIS1:;控制LEDMOV R4,#0CPL P3.0;RETI;必须要写中断返回DELAY2:;1s 换一次MOV R7,#10L2:MOV R6,#200L1:MOV R5,#250DJNZ R5,$DJNZ R6,L1DJNZ R7,L2RETEND总结与提高:1.此程序我用了的位重装的定时方式我用定时器每隔,来检测有无按键按下,但是也得加入按键去抖动的程序3.4矩阵键盘扫描实验控制要求 图 3.11 中 D1D8 八

21、个发光二极管构成彩色旋转灯,D9D13 为档位指示灯,一档旋转速度最慢(周期 1s,D13 亮),二档较快(周期 0.8s,D12 亮),三档更快(周期 0.6s,D11 亮),四档再快(周期 0.4s,D10 亮),五档最快(周期 0.2s,D10 亮)。四个按键 KEY0-KEY1用于设定旋转方向为顺时针旋转或者逆时针旋转,KEY2-KEY3 用于增快或则减慢旋转速度。ORG 0000HAJMP MAINORG 0003HAJMP PINT0ORG 000BHAJMP T0INTORG 0013HAJMP PINT1ORG 0100HMAIN:CLR P0.6CLR P0.7MOV SP,

22、#40HMOV R4,#1 ;默认为1档;the fastest 0.2sMOV R3,#0 ;控制旋转间隔时间MOV P1,#07FHMOV TMOD,#21H;定时器初始化;MOV TH1,#56;直接赋值就可;MOV TL1,#56MOV TH0,#0B1HMOV TL0,#0E0H;SETB ET1SETB ET0SETB EA;SETB TR1;SETB PT0;响应外部中断0 就把定时器给关了,所以还是两级嵌套;SETB PX0;?;SETB PX1;必须设计成高优先级SETB EX0SETB EX1SETB IT0;边沿触发SETB IT1WAIT1:SJMP WAIT1S2:ORG 0200HPINT0:;控制旋转与停止旋转CPL P2.0LCALL Delay10ms;按键去抖动CPL TR0;关闭打开定时器,实现开始和暂停RETIPINT1:;控制循环变速CPL P2.1LCALL Delay10ms;按键去抖动INC R4CLR CMOV A,#6SUBB A,R4JZ S8RETIS8:MOV R4,#1RETIDelay10ms:;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论