第一篇:单片机实验总结
单片机原理及接口技术实验总结
本学期的单片机实验转眼已到尾声,共做了六项实验,分别是KEIL4、ISP下载软件的安装于使用、P1口输出循环灯实验、P1口转弯灯实验、P3.3口输入P1口输出实验和中断实验。在王承林老师的带领与指导下,我们认真完成每次的实验任务,并在实验中拓展,去发现一些新的问题。
在这六项实验中让我刻骨铭心的是中断实验。中断可以说是我的一个弱点,首先从概念上我理解比较含糊,理解能力差;其次,6个中断源比较难记清,经常记混,加之它们分配的寄存器存在太多的异同,工作方式更是让人头疼;再次,中断的使用。中断的精髓是在于使用,在电路设计中使用中断来控制单片机的工作,使之更好的达到所需目的。我刚开始学习的时候连怎么使用中断还是一无所知,后来我到图书馆里查找资料,慢慢的琢磨。至今学会了中断源的4种工作方式,能简单设计出中断电路。虽然起步晚,但我相信能厚积薄发,未来一定能熟练使用它们。
经过学习单片机的中断控制,我发现自己存在许多不足,但这些都困难无法阻挡我对单片机的追求。许多同学在做实验时都抱着不良的心态,他们只想照着实验本的步骤原原本本把实验完成就算大功告成,很少更深层次挖掘里面的奥秘,更有甚者是打酱油的,我不得不为他们如此浪费那么好的学习机会感到可惜。我能为他们做的就是帮助他们讲解一些单片机知识,有时教他们编写程序。实验室是培养高层次人才和开展科学研究的重要基地。邢台学院对培养学生的动手能力是十分重视的,为了提高学生的动手能力,让学生做相关实训并完成单片机实验,在实验的形式上注重培养学生的实验技能和动手能力。从单片机实验中学生就可以总结出大量的经验以适应当代社会的发展。
学习单片机这门课程,要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使我从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。
单片机课是一门实践性很强的课程,仅有课堂上理论知识的学习,对运用好单片机是完全不够的,必须亲自做实验,从实验中吸取教训,总结经验,增加实战经验,加深对单片机的理解,更好的运用单片机。单片机实验课的目的就是为学生提供做实验的机会,让学生能够从几个简单的实验中学会单片机开发的过程和单片机的实际运用。单片机实验课让我将课堂上学到的理论知识运用到实验当中去,在实验中发现问题,解决问题,强化理论知识的运用。下面是自己做实验当中遇到的一些问题和体会。
首先,自己在实验课上对老师讲解的东西没有很好的领会。自己觉得老师讲的电路和原理自己都懂,就没有认真听老师的讲解,但是当自己去理解程序和修改程序就发现自己对电路的工作原理和过程并不是很了解,使得自己在改编程序实现不同功能时遇到较多的问题。
其次,自己对汇编语言的运用不是很熟练。自己之前接触和使用的编程语言都是诸如C语言等的高级语言,对汇编语言基本上是空白状态。虽然每个实验老师都给出了参考程序,但是自己理解整个程序的运行过程和程序的功能依然遇到了比较大的困难。这就说明基础薄弱是实验中最大的问题。
最后,也是最突出的一个问题。自己逻辑思维和分析问题的能力比较欠缺。对程序的分析能力不足,不能够很好的理解程序段之间的逻辑关系。同时,自己对实验中遇到的问题不能及时分析并找出解决的办法,知识一味的依赖老师的指导和同学的帮助。这也提醒自己,只有多加强锻炼,才能不断提高这方面的能力。
六周的时间说短不短,说长不长,因为在这个不同寻常的六周时间里,我除了做实验,还到图书管理查阅了许多与单片机相关的书籍,学习用C语言编写程序,艰苦奋斗,使我在单片机学习上有了质的飞跃。现在的我虽然不是学习最好的,可是我已经改变过去一事无成的我,如今站在大家面前是个全新的我。我始终梦想着以后自己能在单片机行业上有所建树,经过自己的双手创造无价的财富,成就感伴随终生。
身存在的不足之处。而且这也激发了我今后努力学习的兴趣。
发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
1、不管做什么事,计划是很重要的。没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。这样才能提高成功率。
2、做事要多动脑,选出最好的方法。一件事往往有多种解决方法,一个好的方法,不仅能使事情事半功倍,而且往往决定最后的成与败,所以做事时一定要多动一下脑筋,想出最好的方法。
3、要注意细节。细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是在软件的编程过程中,一点点的错误就会使你整个程序不能运行。因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。
4、最后,也是最重要的一点,通过这次课题,我们学到了很多有关单片机方面的知识,也对单片机有了更深入的了解。使我们受益匪浅。
总之,亲自动手是课堂学习的延续,电子领域随时随地都在发生着翻天覆地的变化,现有的知识储备总是落后于科技的发展脚步,我们只有不断学习新知识,才能做到面对新课题时游刃有余。
感谢王承林老师的教育指导!
教会我单片机应用技术,使我受益终生。
第二篇:单片机实验代码总结
编者:方园
单片机实验代码集合(by fangyuan)
1.多字节累加程序:
ORG 0000H LJMP MAIN ORG 0030H;将加数和被加数送到指定地址 MAIN: MOV 20H,#45H
MOV 21H,#74H
MOV 30H,#67H
MOV 31H,#28H
;低位相加
MOV A,21H
ADD A,31H
DA A
MOV 42H,A
;高位相加
MOV A,20H
ADDC A,30H
DA A
MOV 41H,A
CLR A
ADDC A,#0
MOV 40H,A
SJMP $ END
2.数据交换实验
编写程序,实现以下操作:
【功能1】产生数组Hex1:0H、1H、2H、„ 0FH,存储到片内RAM区中,数组Hex1的首地址为30H。
【功能2】产生数组Hex2:0FH、0EH、0DH、„ 0H,存储到片外RAM区中,数组Hex2的首地址为3000H。
【功能3】将片内RAM数组Hex1与片外RAM数组Hex2交换内容。
代码:
ORG 0000H
Hex1 EQU 30H
;定义内部RAM数组首地址
Hex2 EQU 3000H;定义外部RAM数组首地址
编者:方园
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#4FH
;定义栈顶地址
MOV R7,#16
MOV R0,#Hex1
MOV DPTR,#Hex2
LCALL HEX1DE
;调用内部送数据函数
LCALL HEX2DE;调用外部送数据函数
LCALL XCHDE;调用交换函数
SJMP $
ORG 0100H
;内部送数据
HEX1DE: PUSH 00H
PUSH 07H
MOV A,#0 LOOP1: MOV @R0,A
INC A
INC R0
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
;外部送数据
HEX2DE: PUSH 07H
PUSH DPL
PUSH DPH
MOV A,#0FH LOOP2: MOVX @DPTR,A
DEC A
INC DPTR
DJNZ R7,LOOP2
POP DPH
POP DPL
POP 07H
RET
;交换子程序 XCHDE:
LOOP3: MOVX A,@DPTR
XCH A,@R0
编者:方园
END
MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,LOOP3 RET
3.查表实验
1、《单片机原理及应用实验教程》(第2版)“第2章 实验3”(P49)。要求: 16进制数(00H~0FH)ASCⅡ码表定义在内部ROM中(用伪指令定义);R0为片内RAM区Hex数组指针;R1为片内RAM区Asc数组指针;数据块长度放在寄存器R2中。
代码如下:
ORG 0000H
Hex EQU 40H
Asc EQU 50H
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI
LCALL ZHUANHUAN
SJMP $
TABLE:
DB '0123456789'
;查表子程序 ORG 1000H ZHUANHUAN:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
编者:方园
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET END
2、编写用@A+PC指令的查表程序,实现用查表方式将片内RAM中16进制数组Hex(00H~0FH)转换为ASCⅡ码并存入片内RAM数组Asc中。要求:
16进制数(00H~0FH)ASCⅡ码表在内部ROM中; R0为片内RAM区Hex数组指针; R1为片内RAM区Asc数组指针; 数据块长度放在寄存器R2中。代码如下:
ORG 0000H
Hex EQU 40H
;内部Hex送数据地址定义
Asc EQU 50H;查表后数据储存地址定义
LJMP MAIN
ORG 0030H MAIN:
MOV R2,#16
MOV DPTR,#TABLE
MOV R0,#Hex
编者:方园
MOV R1,#Asc
MOV SP,#2FH
LCALL FUZHI;送值函数
LCALL CHABIAO;查表函数
SJMP $
ORG 1000H;查表子程序 CHABIAO:
PUSH 00H
PUSH 01H
PUSH 02H LOOP1:
MOV A,@R0
ADD A,#20H
MOVC A,@A+PC
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP1
POP 02H
POP 01H
POP 00H
RET
;R0送值子程序 FUZHI:
PUSH 00H
PUSH 01H
PUSH 02H
MOV A,#0 LOOP2:
MOV @R0,A
INC R0
INC A
DJNZ R2,LOOP2
POP 02H
POP 01H
POP 00H
RET
编者:方园
TABLE:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
END
4.十进制数1-100累加运算
《单片机原理及应用实验教程》(第2版)“第2章 实验5”(P30)。编写程序,实现以下功能:
【功能1】产生十进制数1~100,并存放在片外RAM中以1000H为首地址的Deci数组中。【功能2】对Deci数组元素进行累加运算,并将累加和存入内部RAM中60H(存累加和低位)和61H(存累加和高位)单元。代码如下: 方法一:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0
MOV R3,#0 LOOP1: INC A
DA A
XCH A,R3
ADDC A,#0
MOVX @DPTR,A
INC DPTR
XCH A,R3
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
POP DPL
编者:方园
POP DPH
POP 07H
RET
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
MOV R3,#0
LOOP2: INC DPTR
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOV A,#1
ADD A,61H
DA A
MOV 61H,A
POP DPL
POP DPH
POP 07H
RET
END
方法二:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV R7,#100
MOV DPTR,#1000H
MOV SP,#20H
编者:方园
LCALL STEP1
LCALL STEP2
SJMP $
ORG 2000H
;送值子函数
STEP1: PUSH 07H
PUSH DPH
PUSH DPL
MOV A,#0 LOOP1: INC A
DA A
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP1
CLR A
ADDC A,#0
MOVX @DPTR,A
POP DPL
POP DPH
POP 07H
RET
;累加子函数
STEP2: PUSH 07H
PUSH DPH
PUSH DPL
MOV 60H,#0
MOV 61H,#0
LOOP2:
MOVX A,@DPTR
ADD A,60H
DA A
MOV 60H,A
CLR A
ADDC A,61H
DA A
MOV 61H,A
INC DPTR
DJNZ R7,LOOP2
MOVX A,@DPTR
ADD A,61H
DA A
编者:方园
MOV 61H,A POP DPL POP DPH POP 07H RET
END
5.DPTR指针应用
《单片机原理及应用实验教程》(第2版)“第2章 实验6”(P31)。编写程序,实现以下功能:
【功能1】产生十进制数组Deci(1~99),并存放在片内RAM中,Deci数组首地址为08H。【功能2】将Deci数组中的偶数元素全部送入外部RAM偶数区,首地址为2000H;将Deci数组中的奇数元素全部送入外部RAM奇数区,首地址为3000H;分别统计外部RAM偶数区和奇数区元素个数。代码如下:
ORG 0000H
LJMP MAIN
ORG 0030H MAIN:
MOV SP,#70H
MOV R7,#99
MOV R0,#08H
MOV R5,#0
MOV R6,#0
LCALL STEP1
LCALL STEP2
SJMP $
STEP1: PUSH 00H
PUSH 07H
MOV A,#1 LOOP1: DA A
MOV @R0,A
INC R0
INC A
DJNZ R7,LOOP1
POP 07H
POP 00H
RET
编者:方园
STEP2: MOV DPTR,#2000H
PUSH DPL
PUSH DPH
MOV DPTR,#3000H
MOV R3,DPH
MOV R4,DPL LP1: MOV A,@R0
MOV R2,A
JNB ACC.0,LOOP2
SJMP LOOP3
LOOP2: POP DPH
POP DPL
MOVX @DPTR,A
MOV A,R5
ADD A,#1
DA A
MOV R5,A
INC DPTR
PUSH DPL
PUSH DPH
SJMP NEXT
LOOP3: MOV DPH,R3
MOV DPL,R4
MOVX @DPTR,A
MOV A,R6
ADD A,#1
DA A
MOV R6,A
INC DPTR
MOV R3,DPH
MOV R4,DPL
SJMP NEXT
NEXT:
INC R0
DJNZ R7,LP1
POP DPH
POP DPL
RET
END
编者:方园
6.定时器应用实验
DBUF EQU 30H ORG 0000H STRT: LJMP MAIN ORG 000BH LJMP PTF00 ORG 0030H MAIN: MOV DPTR,#5FFFH MOV A,#0DCH MOVX @DPTR,A MOV R5,#20 LP: MOVX A,@DPTR JNB ACC.7,LP MOV A,#00H MOVX @DPTR,A MOV A,#34H MOVX @DPTR,A MOV SP,#60H MOV R0,#39H MOV R7,#06H ML1: MOV @R0,#00H INC R0 DJNZ R7,ML1 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H MOV 40H,#10H ML0: LCALL DIR LJMP ML0 PTF00: PUSH PSW PUSH ACC SETB PSW.3 MOV TL0,#0B0H MOV TH0,#3CH
编者:方园
DJNZ R5,PTFY MOV R5,#20
MOV A,40H DEC A MOV 40H,A JNZ PTFY MOV 40H,#10H MOV R0,#39H MOV R7,#6 PTFX: MOV A,@R0 ADD A,#1 DA A MOV @R0,A CJNE A,#0AH,$+3 JC PTFY MOV @R0,#0 INC R0 DJNZ R7,PTFX PTFY: POP ACC POP PSW RETI DIR:
MOV R3,#06H MOV A,#92H MOV DPTR,#5FFFH MOVX @DPTR,A MOV R1,#39H TY11: MOV A,@R1 MOV DPTR,#CODE1 MOVC A,@A+DPTR MOV DPTR,#5FFFH MOVX @DPTR,A
INC R1 DJNZ R3,TY11 RET
CODE1: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H,88H
编者:方园
DB 83H,0C6H,0A1H,86H,8EH,8CH DB 0C1H,89H,0C7H,0BFH,91H DB 00H,0FFH END
7.广告灯实验
ORG 0000H LJMP MAIN ORG 000BH LJMP DELAY ORG 0030H MAIN: MOV DPTR,#TAB MOV R5,#71H MOV R2,#00H MOV R6,#20 MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH SETB TR0 MOV IE,#82H SJMP $ DELAY: MOV TL0,#0B0H MOV TH0,#2CH
DJNZ R6,LP ACALL STEP MOV R6,#20 DJNZ R5,LP MOV R5,#71H
LP: RETI
STEP: LOOP: MOV A,R2 MOVC A,@A+DPTR MOV P1,A INC R2 DEC R5
编者:方园
RET
TAB:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 0FFH,7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH
DB 0FEH,0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H
DB 80H,00H,80H,0C0H,0E0H,0F0H,0F8H,0FCH
DB 0FEH,0FFH,7FH,3FH,1FH,0FH,07H,03H
DB 01H,00H,01H,03H,07H,0FH,1FH,3FH
DB 7FH,0FFH,7EH,3CH,18H,00H,18H,3CH
DB 7EH,0FFH,0FEH,0FCH,0FCH,0F9H,0F3H,0E7H
DB 0CFH,9FH,3FH,7FH,0FFH,7FH,3FH,9FH
DB 0CFH,0E7H,0F3H,0F9H,0FCH,0FEH,0FFH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,00H
DB 80H,40H,20H,10H,08H,04H,02H,01H,00H
DB 01H,02H,04H,08H,10H,20H,40H,80H,00H
DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END
第三篇:单片机实验
实验
一、MCS51单片机基本开发环境
1. 实验目的:
1)熟悉软件的集成开发环境 2)掌握单片机软件设计流程
3)掌握单片机存贮器结构及各窗口之间的联系 2. 实验内容:
1)用三种方法实现将累加器A内容改为20H
方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做实验时就越感觉这题根本不能说是题目,但不得不说在没接触过编程软件,刚开始学的汇编,第一次做的实验就光这道题都觉得不知道做什么.所以凡是总有开始,不了解情况的多简单的都会觉得难.2)将58H位单元置为1,观察内部RAM中2BH内容的变化 代码:
SETB 2BH.0 JMP $ END 心得:这是关于内部存储中对单元和字节了解,不理解很容易做错.比如开始写的指令为
MOV R0,#58H;MOV @R0,#1
这是错误的指令。这就需要认真去了解单片机中的字节地址与位地址的关系。80C51中有位寻址区和字节寻址区。题目中58H为位地址,2BH为字节地址,且58H为2B字节的最低位。由于58H属于位寻址区,可用位操作指令 SETB 进行置位,SETB 2BH.0 执行后,2BH中内容变为01
3)如果当前状态为有进位、工作寄存器使用区2,请用3种方法设置这种状态
代码:
ANL PSW,#01H MOV A,PSW
CJNE A,#01,LAB2 LAB1:JMP LAB1
LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H CLR PSW.3 MOV C,P0.0 MOV PSW,R0 MOV PSW.4,C CPL C MOV PSW.3,C END
心得:以上LAB2写了三段代码,可分别完成题目要求。不过实验时只是对代码进行了错误调试,没有对结果进行检验。其中值得注意的是对于布尔(位)操作指令的用法,比如传送指令必须经累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及对于位寻址的方式(如需用到“.”隔开)的应用。4)编一个小程序将内部RAM中的20H单元的内容送到21H单元并调试
代码:
MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END
5)用程序将堆栈指针指向60H,然后在堆栈中依次压入01,02,03,04,05五个数,观察哪些单元内容发生了变化,各变为多少?从哪些窗口可以发现这些变化?顺序将堆栈中的五个数放入30H~34H五个单元中,编程实现之。
代码:
MOV R1,#60H MOV SP,R1 MOV DPL,#1H LAB1:PUSH DPL INC DPL MOV A,DPL CJNE A,#6,LAB1 POP 34H POP 33H POP 32H POP 31H POP 30H JMP $ END
6)将外部数据存贮器1000H~100FH 16个单元中存放00H~0FH 代码:
MOV DPTR,#1000H MOV R1,#10H LOOP:MOVX @DPTR,#1234H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
心得:此处需要访问片外存储空间,需要借助寄存器DPTR,需注意其为16位的寄存器,在使用时若与八位寄存器进行数据交换时需分为高八位DPH与低八位DPL来用。7)若要求程序从0010H单元开始运行,可用两种方法实现?
方法一 ORG 0010H 方法二 AJMP 0010H
3. 选做实验内容:数据传送 目的:
1)掌握8051单片机内部数据存贮器、外部数据存贮器的数据传送特点和应用 2)掌握MOV,MOVX和MOVC类指令的用法及区别 内容:
1)将片内RAM数据区20H为首地址的十六个字节传送到30H为首地址的数据区,即:20H~2FH送30H~3FH
代码: ORG 0000H JMP MAIN ORG 0030H MAIN:MOV R0,#20H MOV R1,#30H LOOP:MOV @R0,#1234H MOVA,@R0 MOV @R1,A INC R0 INC R1 CJNE R1,#30H,LOOP JMP $ END
2)将外部数据存储器2000H~200FH单元的十六个数传送至内部数据存储器的30H~3FH 代码: ORG 0000H JMP MAIN ORG 0030H MAIN: MOV DPTR,#2000H MOV R1,#30H LOOP:MOVX @DPTR,#12H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
总体心得体会:
第一次做实验主要是熟悉了解了下单片机编程软件的使用,开始接触时在对其软件不是太了解的情况下实验编程做的确实很乱,不清楚该怎样进行,比如不知如何进行对指令的调试,也不清楚该如何观察结果,没有一个整体的概念,所以在了解其开发环境上花了不少时间。经过一段时间的摸索后也终于了解了其具体的使用,也能够顺利的对指令的编程运用。运行指令时遇到的一些问题需要注意的也在上面各题中做了说明。还有需要注意的是:进入软件仿真时需要对存储空间进行查看的方法是在Address窗口中输入:d:00h 显示内部数据存储器从00h开始的单元; x:1000h 显示外部数据存储器从1000h开始的单元; c:0000H 显示程序存储器内容。还有由于伪指令 END 定义的原因,在程序末需加一条死循环调转指令(如 JMP $)使程序不会进入其他未知空间执行其他指令。实验
二、加、减法实验
1. 实验目的
1)正确使用单片机的加减运算指令
2)掌握不同指令对于程序状态字的影响及程序状态字的意义、用处 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)学习模块化程序设计方法 2. 实验内容
1)编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。需考虑有进位和无进位情况。程序入口为: 加数:22H,21H,20H三字节,22H为最高位
被加数:32H,31H,30H三字节,32H为最高位
程序出口为: 23H,22H,21H,20H四字节,23H为最高位 例如:地址:23 22 21 20 32 31 30 执行前数据: 01 23 45 FF 01 01 执行后数据:01 00 24 46
代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 22H,#01H MOV 21H,#23H MOV 20H,#45H MOV 32H,#0FFH MOV 1H,#01H MOV 30H,#01H ACALL ADDI HERE:JMP HERE ORG 100H ADDI: PUSH PSW MOV R0, #20H;加数1地址、和的地址 MOV R1, #30H;加数2地址 CLR C MOV R2, #3;循环3次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 MOV @R0, A;存 INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A, #0;得到进位 MOV 23H, A;保存 POP PSW RET END
2)编写三字节二进制减法子程序 入口:被减数: 52H,51H,50H, 50H为最低位
减数: 42H,41H,40H, 40H为最低位
出口:差:外部数据存贮器2003H~2000H(2000H为最低位)用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。例如:
执行前:地址: 52 51 50 42 41 40
数据: 90 80 70 10 10 10
执行后:地址: 2003 2002 2001 2000
数据: 00 80 70 60 代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 52H,#90H MOV 51H,#80H MOV 50H,#70H MOV 42H,#10H MOV 41H,#10H MOV 40H,#10H ACALL SUB1 HERE:JMP HERE SUB1: PUSH PSW MOV R0, #50H;被减数地址 MOV R1, #40H;减数地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循环3次 LOOP: MOV A, @R0;取 SUBB A, @R1;减 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP CLR A SUBB A, #0;得到借位 MOVX @DPTR, A;存 POP PSW RET END
3)编写10位十进制加法子程序(十进制数采用压缩BCD码存放)入口: 加数:24H—20H,低地址放低字节
被加数:29H—25H,低地址放低字节
出口 和:4005H—4000H,低地址放低字节
要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。例如:
执行前地址:24 23 22 21 20 29 28 27 26 25
数据:12 34 56 78 90 88 99 33 12 74
执行后地址:4005 4004 4003 4002 4001 4000
数据: 01 01 33 89 91 64
代码:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 24H,#12H MOV 23H,#34H MOV 22H,#56H MOV 21H,#78H MOV 20H,#90H MOV 29H,#88H MOV 28H,#99H MOV 27H,#33H MOV 26H,#12H MOV 5H,#74H ACALL ADD2 HERE:JMP HERE ADD2: PUSH PSW MOV R0, #20H;加数1地址 MOV R1, #25H;加数2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循环5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加
DA A;调整为BCD码 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END
第四篇:单片机实验
实验一清0、移数
将片内20H~2FH及片外0010H~001FH单元清0;
然后将片内30H~3FH的数据移到片外0000H~000FH中;判断:
若(30H)≤10,则求其平方存到31H中,并将位00H置1(其它位清0)若(30H)=10,则将AA存到31H中,并位01H置1(其它位清0)若(30H)≥10,则减10存到31H中,并位02H置1(其它位清0)
实验二加法、排序
有两个长度为10的无符号数分别放在片内20H和30H为首的存储单元中(低位),求其对应项之和(带进位位),结果放在40H为首的单元中(若最高位有进位则存在后续单元中),然后按升序排列放在50H为首的单元中
实验三查表、散转
设有一表格,表中数为:00H、11H、22H、33H、44H、55H、66H、77H、88H、99H、AAH、BBH、CCH、DDH、EEH、FFH。根据片外0001H单元的低4位的数,取出表中相应的值存到片内30H中;根据片外0001H单元的高4位的数,将片内RAM区中可位寻址的相应的位置1(从位00H~位0FH,只可有一个位地址为1)
实验四外中断
P1.0~P1.7接8个发光二极管,管脚INT0、INT1接两个按键,分别定义为“L”和“R”。
要求:上电全灭,按 “L”(或R)键,最右(左)侧灯亮,每按一次“L” ”(或R)键,则亮的灯向左(右)移一位,当移到最左(右)端时,灯全灭
实验五定时器
P1.0、P1.1分别接两个发光二极管,INT0脚接
一按键做开关,按一次开关,则启动,两个发
光管一亮一灭,亮灭时间均为1秒;再按一次
开关,则关闭,即两个发光管都灭。
实验六定时器、计数器
P3.2口输出周期为2S的方波,T1口为脉冲输入端,记录输入的脉冲个数,脉冲个数由P1口所接的8个数码管显示(二进制),设一按键作为开关控制系统运行,关闭时数码管全灭,P3.2无输出。
第五篇:单片机最小系统实验总结
STC89C51单片机最小系统板开发实验总结 实验小组成员:陆叙旺 张爱华 温小静
总的要求:设计并制作STC89C51单片机最小系统板。提供单片机最基本的运行环境并具备ISP下载程序的功能。由于该板将来拟用作参赛设计的核心板,所以要求该板的设计具备使用灵活、方便,并采用模块化设计使该板能与将来的整个系统很好的连接。同时应具备很好的可维修与可维护性。具体要求:
[1] [2] [3] [4] [5] [6] 提供合适的电源接口并具备电源指示灯 应具有上电复位和手动复位功能 支持最大40MHz的运行频率
具有RS232接口,可连接电脑下载程序
八位流水灯,用于测试最小系统板是否工作正常 应引出单片机的所有输入输出引脚
考虑的问题:
[1] [2] [3] [4] [5] [6] [7] 如何做到模块化? 是否需要复位按键? 是否要编程座?
系统晶振插座:可更换升级晶振。是否需要EA跳线?
考虑是否需要电源开关,以及采用哪种开关最好? 其它
实验设计过程: 原理图设计:
(1)单片机CPU部分:采用STC89C51芯片,封装DIP-40。40个引脚,用40个排针引出,40脚接VCC,20脚接GND,VCC与GND之间用一小电容(可以用104)耦合。(去耦电容的主要功能就是提供一个局部的直流电源给有源器件,以减少开关噪声在板上的传播和将噪声引导到地。)P0,P1,P2,P3做IO接口。9脚接RST(复位电路)。18,19脚接晶振,(这次实验用晶振为40M)。31脚接EA。
(2)电源供电部分:直接用排针引入电源给单片机供电,另外一种电源输入就是加一个稳压块7805,正电源端接一个二极管,保护电路,防止上电时正负反接。经过稳压后串一个电阻(几百欧)引出一个发光二极管。做为电源指示灯。问题出现在,如果是5V供电,经过7805
稳压后,得到的电源并不够5V了,只有3V多,所以,如果是选用经过稳压后的电源供电,那么输入就要有7V。(3)晶振部分:采用40M晶振,电容可以采用30P(可以用更小点的电容,小点的电容理论上效果会好点)。在封装电路的时候,晶振部分加了一个晶振插座,这样,可以更换升级晶振。
(4)复位电路部分:电复位和手动复位,电复位就是接一个1U的电容,手动复位就是接一个开关,这个开关选用点触开关比较方便。
(5)EA电位选择部分:单片机的9脚(EA)。采用了排针引出,与电源的正负两端一起用三列排针引出,实验用到时,用两个孔的插帽做EA跳线。
(6)RS232接口,电脑下载程序部分:下载程序接口用DB9,电平转换采用MAX232芯片。DB9的2,3脚接到MAX232的7(T2OUT),8(R2IN)脚,5脚接地。MAX232的9(R2OUT),10(T2IN)分别接到单片机上的P3^0(RXD)和P3^1(TXD)脚。MAX232的1,3脚,4,5脚,6,15脚,2,16脚,都串接一个电容,这些电容的大小最好都是1U,当然,也可以采用其他的小电容,例如:104。15接地,16接VCC,加一个去耦电容104。(7)LED试验灯部分:8个发光二极管,正端接到P2端,负端接330欧的排阻,当P2口输出高电位时,发光二极管亮,地电位时,发光二极管熄灭。(8)总电路图如下:
PCB图设计:电源线,地线,做得相对大点,排线时,考虑到信号干扰,线与线之间的距离要适当。特别是电源与地线不要靠太近,输入输出排版尽量合理。输入输出接口放到板子比较好接,好调的地方。尽量避免跳线,主干部分(CPU)最好排在板子中间。调试过程:
焊接好板子,做出来的实物图,接上电源,烧写一个流水等程序进去,可以看到8个发光二极管闪亮。
实际做板遇到的问题;在做板中,出现的问题主要集中在RS232接口,电脑下载程序部分和电源部分。刚开始用RS232的13脚和14脚接DB9的2,3脚。11脚和12脚接到单片机的P3^0脚和P3^1脚,调试过程中,程序下载不进去,进过检查,其它部分电路都没有错。后来又用跳线按照上述讲的接。结果程序可以下载进去了。电源部分:采用7805稳压,效果不是很好,带来了不少麻烦。所以,后面干脆把7805也去掉,如果是用我们自己做的电源供电,稳定性已经很好了,没必要i再次稳压。现在我们基本都是用自己做的直流稳压电源。所以,这里可以去掉稳压块电路。
想做一块好的板子,封装一定要对口,不对口的话就接不上去,或者接上去了也不好看。原理图尽量要做得清晰好看,PCB图尽量用手工布线,布线的时候不要布得太绕了。线是追求最短。做板的时候最好买一些好的材料做,效果会更好,比如说,铜板,电容。
想做一块好的板子,就以我们现在的水平。不要追求速度。能按时完成就好。以后再慢慢提高。遇到不懂的,希望大家一起讨论。
******2***101112******9101112***819201
19876543212019******42526272829303******6543212019******2121212121212***89