山大单片机实验.docx
- 文档编号:26498762
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:24
- 大小:227.01KB
山大单片机实验.docx
《山大单片机实验.docx》由会员分享,可在线阅读,更多相关《山大单片机实验.docx(24页珍藏版)》请在冰豆网上搜索。
山大单片机实验
单片机实验报告
孙洪悦2011
实验1:
汇编程序实验1
自我完成实验
(1)实验内容
将片内RAM30H单元中的8位二进制数转换成10进制数。
希望转换后的结果保存于31H
和32H,31H低4位存放个位,高4位存放十位,32H低4位存放百位,高4位为0
自我完成实验程序
ORG0000H
AJMPMAIN
:
ORG0030H
MAIN:
MOVSP,#62H;
MOV30H,#0AFH;先将30H写上100
MOVR0,#32H;将百位地址送R0
MOVA,30H;这句写错了,应该是将30H的内容送给A,而不是30H,我误写成了#30H
MOVB,#64H;除数为100
DIVAB;AB相除
MOV@R0,A;将百位的数送给32H地址
MOVA,B;将余数送给A
)
MOVB,#0AH;将10送B
DIVAB;AB相除
SWAPA;高低四位交换
DECR0;R0减1到31H
MOV@R0,A;将十位送31H的高四位
MOVA,B
ANLA,#0FH
ORL31H,A;31高低四位分别存十和百位
SJMP$
END
\
总结与提高:
本程序用了一个小算法,一个三位数数X除以100,商a为百位,余数为:
X-100*a
再用此余数除10,商为十位,余数为个位。
实验2:
汇编程序实验2
自我完成实验
(1)实验内容
将片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大
的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。
程序及其注释
,
②自我完成实验程序
第一种排序方法:
ORG0000H
AJMPMAIN
ORG0090H
MAIN:
MOVSP,#62H;
MOVA,#0H
MOVR1,#30H
MOVR7,#20H
<
MOVDPTR,#TABLE
MOVR0,#1FH;执行31次
LOOP1:
MOVCA,@A+DPTR
MOV@R1,A
INCR1
INCDPTR
MOVA,#0H
DJNZR7,LOOP1;执行32次循环,在30-4F写表格数据
?
LOOP2:
MOVR1,#30H;将起始地址给R1
MOVA,R0;R0为执行31次
MOVR2,A; 把进行一次冒泡的次数存到R2中
LOOP3:
CLRC;清C
MOVA,@R1; ;比较开始,取第一个数
MOVR3,A;腾出累加器
INCR1;指向下一个地址
SUBBA,@R1;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位
~
JCLOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行
MOVA,R3; 把后一个数存到累加器下
XCHA,@R1;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交
DECR1;R1自减,准备将后面的数存到前面
MOV@R1,A;将后面的数存到前面
INCR1;R1自增,准备下次转换,以上五行为交换
LOOP4:
DJNZR2,LOOP3;R2自减,为下次冒泡准备
DJNZR0,LOOP2;跳回去进行下一轮冒泡
SJMP$
·
ORG30H
TABLE:
DB1,3,9,2,17,4,11,6
DB5,20,100,64,21,14,79,35
DB92,7,91,23,65,16,13,18
DB18,73,65,101,27,19,62,69
END
{
第二种排序方法;
ORG0000H
AJMPMAIN
ORG0090H
MAIN:
MOVSP,#62H;
MOVA,#0H
MOVR1,#30H
MOVR7,#20H
MOVDPTR,#TABLE
MOVR0,#1FH;执行31次
…
LOOP1:
MOVCA,@A+DPTR
MOV@R1,A
INCR1
INCDPTR
MOVA,#0H
DJNZR7,LOOP1;执行32次循环,在30-4F写表格数据
LOOP2:
MOVR1,#30H;将起始地址给R1
*
MOVA,R0;R0为执行31次
MOVR2,A; 把进行一次冒泡的次数存到R2中
MOVR4,#30H;R4存的是最大数的位置
LOOP3:
CLRC;清C
MOVA,@R1; ;比较开始,取第一个数
MOVR3,A;腾出累加器
INCR1;指向下一个地址
MOVA,@R4
SUBBA,@R1;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位
>
JCLOOP4;前一个数小的情况下,两个数交换位置,否则,继续执行
;MOVA,R3; 把后一个数存到累加器下
;XCHA,@R1;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交
;DECR1;R1自减,准备将后面的数存到前面
;MOV@R1,A;将后面的数存到前面
;INCR1;R1自增,准备下次转换,以上五行为交换
DJNZR2,LOOP3;R2自减,为下次冒泡准备
LOOP4:
"
MOVA,R1;
MOVR4,A
DJNZR2,LOOP3
DJNZR0,LOOP2;跳回去进行下一轮冒泡
SJMP$
ORG30H
TABLE:
DB1,3,9,2,17,4,11,6
—
DB5,20,100,64,21,14,79,35
DB92,7,91,23,65,16,13,18
DB18,73,65,101,27,19,62,69
END
总结与提高:
所谓冒泡法,有两种理解方式:
1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。
2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序
C语言程序实验
自我完成实验
(1)实验内容
)
将片内RAM30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大
的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。
#include<>
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。
2相邻的两个数比较,记下最大的数的位置,直到一轮遍历后将找到的最大的数与最后一个数交换,实现排序
~
基本并行I/O口实验
实验功能为:
当按键SW1按下之后,D1-D8轮流点亮,点亮时间为100ms,当按键停下后,停止轮换,
再次按下后继续轮换。
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVP2,#0FFH
|
MOV20H,#0FEH
MOVR7,#8
LOOP:
SETB
JNB,LOOP1
AJMPL
LOOP1:
MOVA,20H
MOVP2,A
ACALLDELAY
MOVA,P2
】
RLA
MOV20H,A
L:
DJNZR7,LOOP
DELAY:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
RET
SJMP$
END
~
总结与提高:
1.按键去抖动是必要的2用移位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的。
扩展并行I/O口实验
实验功能为:
仿真实现交通信号灯控制功能。
控制顺序为:
①南北绿灯亮,同时东西红灯亮10s;
②南北黄灯亮,同时东西红灯亮2s;
③南北红灯亮,同时东西绿灯亮10s;
④东西黄灯亮,同时南北红灯亮2s;
~
⑤重复①~④。
ORG0000H
AJMPSTART
ORG0003H
START:
MOVSP,#60H
MOVP0,#0FFH
CLR
STATE1:
$
MOVDPTR,#0FE00H
MOVA,#0F3H
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0CH
MOVX@DPTR,A
ACALLDELAY2
STATE2:
MOVDPTR,#0FE00H
MOVA,#0C3H
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0FH
MOVX@DPTR,A
ACALLDELAY1
STATE3:
MOVDPTR,#0FE00H
MOVA,#0FCH
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#03H
MOVX@DPTR,A
[
ACALLDELAY2
STATE4:
MOVDPTR,#0FE00H
MOVA,#3CH
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0FH
MOVX@DPTR,A
ACALLDELAY1
AJMPSTATE1
DELAY1:
`
MOVR7,#20
DL2:
MOVR6,#200
DL1:
MOVR5,#250
DJNZR5,$
DJNZR6,DL1
DJNZR7,DL2
RET
DELAY2:
MOVR7,#100
:
L2:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
DJNZR7,L2
RET
END
总结与提高:
1.用汇编写程序比C难的一个地方我觉得就是控制逻辑不是那么直观,所以一定要注意程序的格式规范,尽量使用缩进,标号命名尽量通俗易懂2用移位操作可以很方便的实现一些功能3多使用调试工具,程序不是写出来的,而是调出来的4多积累一些常用代码,比如延时程序,只需简单改些参数就可以再次使用
。
静态LED显示实验
控制要求
图中7SEG2为十位显示数码管,7SEG1为个位显示数码管,KEY_LOAD为倒计时初
值按钮,KEY_START为倒计时启动按钮。
要求实现的功能是:
当KEY_LOAD按钮按下时加载
倒计时初值(如:
10s),当按下KEY_START按钮时,开始倒计时,每过1s,计时器减1,
直到减到“00”为止。
减到“00”时使引脚上的LED按10Hz频率进行闪烁,直到再次
按下KEY_LOAD按钮才重新加载初值,并熄灭LED。
再次按下KEY_START按钮又一次开始倒
计时,如此反复。
ORG0000H
AJMPMAIN
ORG000BH
;
AJMPT0INT
ORG001BH
AJMPT1INT
ORG0100H
MAIN:
SETB
SETB
CLR
CLR
CLR
MOVR4,#0
)
MOVTMOD,#21H
MOVTH1,#56;直接赋值就可
MOVTL1,#56
MOVTH0,#0B1H
MOVTL0,#0E0H
SETBET1
SETBET0
SETBEA
SETBTR1
SETBTR0
WAIT1:
;定时器中断等待
}
JB,S4
JB,S5
SJMPWAIT1
S4:
CLR;清标志位
MOVR3,#9
MOVDPTR,#0FD00H;十位显示0,个位循环
MOVA,#0C0H
MOVX@DPTR,A
|
LOOP:
;09-00循环
JB,S4;判断显示过程中有无按键被按下
JB,S5
MOVA,R3
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVDPTR,#0FE00H
MOVX@DPTR,A
LCALLDELAY2;此处容易出错误
DECR3
(
MOVA,R3
INCA;
JNZLOOP
SETB;到00后才闪灯
SJMPWAIT1
S5:
;装载初值
CLR;清标志位
MOVDPTR,#0FD00H
MOVA,#0F9H
~
MOVX@DPTR,A
MOVDPTR,#0FE00H
MOVA,#0C0H
MOVX@DPTR,A
SJMPWAIT1
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
T0INT:
{
MOVTH0,#0B1H;T0工作在方式1,要装载初值
MOVTL0,#0E0H;T0工作在方式1,20ms检测按键
JNB,S2;检测装载初值键
JNB,S3;检测开始键
RETI
S2:
CLR;检测装载初值键
SETB;熄灭LED
SETB;装载显示初值
RETI
[
S3:
CLR;检测开始键
SETB;熄灭LED
SETB
RETI
T1INT:
;T1工作在方式28位重装
JB,S6
RETI
S6:
INCR4
MOVA,#50;LED闪烁
.
CLRC
SUBBA,R4
JZS1
RETI
S1:
;控制LED
MOVR4,#0
CPL;
RETI;必须要写中断返回
DELAY2:
;1s换一次
、
MOVR7,#10
L2:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
DJNZR7,L2
RET
END
#
总结与提高:
1.此程序我用了T1的8位重装的定时方式 2我用T0定时器每隔20ms,来检测有无按键按下,但是也得加入按键去抖动的程序
矩阵键盘扫描实验
控制要求
图中D1~D8八个发光二极管构成彩色旋转灯,D9~D13为档位指示灯,一档旋转
速度最慢(周期1s,D13亮),二档较快(周期,D12亮),三档更快(周期,
D11亮),四档再快(周期,D10亮),五档最快(周期,D10亮)。
四个按键KEY0-KEY1
用于设定旋转方向为顺时针旋转或者逆时针旋转,KEY2-KEY3用于增快或则减慢旋转速度。
—
ORG0000H
AJMPMAIN
ORG0003H
AJMPPINT0
ORG000BH
AJMPT0INT
ORG0013H
AJMPPINT1
ORG0100H
-
MAIN:
CLR
CLR
MOVSP,#40H
MOVR4,#1;默认为1档;thefastest
MOVR3,#0;控制旋转间隔时间
MOVP1,#07FH
MOVTMOD,#21H;定时器初始化
;MOVTH1,#56;直接赋值就可
;MOVTL1,#56
MOVTH0,#0B1H
|
MOVTL0,#0E0H
;SETBET1
SETBET0
SETBEA
;SETBTR1
;SETBPT0;响应外部中断0就把定时器给关了,所以还是两级嵌套
;SETBPX0;
;SETBPX1;必须设计成高优先级
¥
SETBEX0
SETBEX1
SETBIT0;边沿触发
SETBIT1
WAIT1:
SJMPWAIT1
S2:
$
ORG0200H
PINT0:
;控制旋转与停止旋转
CPL
LCALLDelay10ms;按键去抖动
CPLTR0;关闭打开定时器,实现开始和暂停
RETI
PINT1:
;控制循环变速
CPL
LCALLDelay10ms;按键去抖动
INCR4
CLRC
~
MOVA,#6
SUBBA,R4
JZS8
RETI
S8:
MOVR4,#1
RETI
Delay10ms:
;10ms改参数R6
MOVR6,#20
L:
MOVR5,#250
?
DJNZR5,$
DJNZR6,L
RET
T0INT:
MOVTH0,#0B1H;T0工作在方式1,要装载初值
MOVTL0,#0E0H;T0工作在方式1,20ms检测按键
S0:
CJNER4,#1,S3;1档
MOVP0,#0FFH
CPL
【
INCR3
MOVA,#10;LED200ms
CLRC
SUBBA,R3
JZS01
RETI
S3:
;2档
CJNER4,#2,S5
MOVP0,#0FFH
CPL
INCR3
(
MOVA,#20;LED400ms
CLRC
SUBBA,R3
JZS01
RETI
S5:
;3档
CJNER4,#3,S6
MOVP0,#0FFH
CPL
INCR3
MOVA,#30;LED600ms
CLRC
SUBBA,R3
JZS01
RETI
S6:
;4档
CJNER4,#4,S7
MOVP0,#0FFH
CPL
INCR3
MOVA,#40;LED800ms
CLRC
SUBBA,R3
JZS01
RETI
S7:
;5档
CJNER4,#5,S0;返回1档
MOVP0,#0FFH
CPL
INCR3
MOVA,#50;LED1000ms
CLRC
SUBBA,R3
JZS01
RETI
S01:
;循环灯的实现
MOVA,P1
RLA
MOVP1,A
MOVR3,#0
RETI
END
总结与提高:
1.此程序我用了T0,工作在方式1,我通过赋给TH0,TL0不同的初值,达到变速的母的2用移位实现彩灯的循环比较方便3写程序一定要一个整体的概念,有一个整体的把握,当写代码的时候肯定是一部分一部分的写,每写好一部分,就要调试好一部分,这样写到最后了,整个程序也就调通了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验