第一篇:单片机实验代码总结
编者:方园
单片机实验代码集合(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
第二篇:单片机实验总结
单片机原理及接口技术实验总结
本学期的单片机实验转眼已到尾声,共做了六项实验,分别是KEIL4、ISP下载软件的安装于使用、P1口输出循环灯实验、P1口转弯灯实验、P3.3口输入P1口输出实验和中断实验。在王承林老师的带领与指导下,我们认真完成每次的实验任务,并在实验中拓展,去发现一些新的问题。
在这六项实验中让我刻骨铭心的是中断实验。中断可以说是我的一个弱点,首先从概念上我理解比较含糊,理解能力差;其次,6个中断源比较难记清,经常记混,加之它们分配的寄存器存在太多的异同,工作方式更是让人头疼;再次,中断的使用。中断的精髓是在于使用,在电路设计中使用中断来控制单片机的工作,使之更好的达到所需目的。我刚开始学习的时候连怎么使用中断还是一无所知,后来我到图书馆里查找资料,慢慢的琢磨。至今学会了中断源的4种工作方式,能简单设计出中断电路。虽然起步晚,但我相信能厚积薄发,未来一定能熟练使用它们。
经过学习单片机的中断控制,我发现自己存在许多不足,但这些都困难无法阻挡我对单片机的追求。许多同学在做实验时都抱着不良的心态,他们只想照着实验本的步骤原原本本把实验完成就算大功告成,很少更深层次挖掘里面的奥秘,更有甚者是打酱油的,我不得不为他们如此浪费那么好的学习机会感到可惜。我能为他们做的就是帮助他们讲解一些单片机知识,有时教他们编写程序。实验室是培养高层次人才和开展科学研究的重要基地。邢台学院对培养学生的动手能力是十分重视的,为了提高学生的动手能力,让学生做相关实训并完成单片机实验,在实验的形式上注重培养学生的实验技能和动手能力。从单片机实验中学生就可以总结出大量的经验以适应当代社会的发展。
学习单片机这门课程,要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使我从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。
单片机课是一门实践性很强的课程,仅有课堂上理论知识的学习,对运用好单片机是完全不够的,必须亲自做实验,从实验中吸取教训,总结经验,增加实战经验,加深对单片机的理解,更好的运用单片机。单片机实验课的目的就是为学生提供做实验的机会,让学生能够从几个简单的实验中学会单片机开发的过程和单片机的实际运用。单片机实验课让我将课堂上学到的理论知识运用到实验当中去,在实验中发现问题,解决问题,强化理论知识的运用。下面是自己做实验当中遇到的一些问题和体会。
首先,自己在实验课上对老师讲解的东西没有很好的领会。自己觉得老师讲的电路和原理自己都懂,就没有认真听老师的讲解,但是当自己去理解程序和修改程序就发现自己对电路的工作原理和过程并不是很了解,使得自己在改编程序实现不同功能时遇到较多的问题。
其次,自己对汇编语言的运用不是很熟练。自己之前接触和使用的编程语言都是诸如C语言等的高级语言,对汇编语言基本上是空白状态。虽然每个实验老师都给出了参考程序,但是自己理解整个程序的运行过程和程序的功能依然遇到了比较大的困难。这就说明基础薄弱是实验中最大的问题。
最后,也是最突出的一个问题。自己逻辑思维和分析问题的能力比较欠缺。对程序的分析能力不足,不能够很好的理解程序段之间的逻辑关系。同时,自己对实验中遇到的问题不能及时分析并找出解决的办法,知识一味的依赖老师的指导和同学的帮助。这也提醒自己,只有多加强锻炼,才能不断提高这方面的能力。
六周的时间说短不短,说长不长,因为在这个不同寻常的六周时间里,我除了做实验,还到图书管理查阅了许多与单片机相关的书籍,学习用C语言编写程序,艰苦奋斗,使我在单片机学习上有了质的飞跃。现在的我虽然不是学习最好的,可是我已经改变过去一事无成的我,如今站在大家面前是个全新的我。我始终梦想着以后自己能在单片机行业上有所建树,经过自己的双手创造无价的财富,成就感伴随终生。
身存在的不足之处。而且这也激发了我今后努力学习的兴趣。
发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
1、不管做什么事,计划是很重要的。没有一个完好的计划,做事情就会没有一个好的顺序,做事情会比较乱,很难成功。而有一个好的计划,不管做什么事都会事半功倍,做事心中有数,明确重点和缓急,不会有疏漏。这样才能提高成功率。
2、做事要多动脑,选出最好的方法。一件事往往有多种解决方法,一个好的方法,不仅能使事情事半功倍,而且往往决定最后的成与败,所以做事时一定要多动一下脑筋,想出最好的方法。
3、要注意细节。细节决定成败,这句话在这次课题中不仅一次得到了印证,特别是在软件的编程过程中,一点点的错误就会使你整个程序不能运行。因此我们不仅仅要有整体意识,也要注意细节,不要因一个关键地方的一个细节而导致满盘皆输。
4、最后,也是最重要的一点,通过这次课题,我们学到了很多有关单片机方面的知识,也对单片机有了更深入的了解。使我们受益匪浅。
总之,亲自动手是课堂学习的延续,电子领域随时随地都在发生着翻天覆地的变化,现有的知识储备总是落后于科技的发展脚步,我们只有不断学习新知识,才能做到面对新课题时游刃有余。
感谢王承林老师的教育指导!
教会我单片机应用技术,使我受益终生。
第三篇:单片机实验
实验
一、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无输出。
第五篇:数据库上机实验总结(含代码)
实验一
(1)无条件单表查询
select sname NAME,'year of birth:' BIRTH,2004-sage BIRTHDAY,LOWER(sdept)DEPARTMENT FROM student;(2)有条件单表查询
SELECT sname,sdept,sage FROM student WHERE sage NOT BETWEEN 20 AND 23;(3)单表嵌套(一层)查询
SELECT sno,sname,sdept FROM student WHERE sdept IN(SELECT sdept FROM student WHERE sname='刘晨');(4)复合条件多表查询
SELECT student.sno,sname,cname,grade FROM student ,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno;(5)使用COUNT()的单表查询 SELECT COUNT(*)FROM student;(6)使用AVG()的单表查询
SELECT AVG(grade)'平均成绩' from SC where CNO='1';(7)查询结果分组
SELECT cno,COUNT(sno)'人数' FROM sc GROUP BY cno;(8)查询结果排序
SELECT * FROM student ORDER BY sdept,sage DESC;(9)使用通配符的查询
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'刘%';(10)使用换码字符的单表查询
SELECT cno,ccredit FROM course WHERE cname LIKE 'DB_Design'ESCAPE'';(11)插入单个元组 插入一个新学生元组
Insert into student(sno,sname,ssex,sdept,sage)values('200215128','陈冬','男','IS',18)(12)插入子查询结果
对每一个系,求学生平均年龄,并把结果存入数据库 Create table dept_age(sdept char(15),avg_age int)Insert into dept_age(sdept,avg_age)select sdept,avg(sage)from student group by sdept(13)修改某个元组的值
将学生200215121的年龄改为22岁
Update student set sage=’22’ where sno=’200215121’(14)修改多个元组的值 将所有学生的年龄增加一岁 Update student set sage=sage+1(15)删除一个元组的值 删除学号为200215128的学生记录
delete from student where sno='200215128'(16)建立视图 建立信息系学生的视图
create view is_student as select sno,sname,sage from student where sdept='IS' ×(17)查询视图
查询选修了1号课程的信息系学生信息
Select is_student.sno,sname from is_student,sc where is_student.sno=sc.sno and sc.cno=’1’ ×(18)更新视图
将信息系学生视图is_student中学号为95001的学生姓名改为李楠 update is_student set sname='李楠' where sno='95002' 将下列问题用SQL命令表示:
1.查询‘IS’系学生的学号、姓名、性别。
SELECT sno,sname,ssex FROM student WHERE sdept='IS';2.查询‘IS’系年龄在20岁以下的学生。
SELECT * FROM student WHERE sdept='IS'AND sage<20;3.查询所有不姓‘刘’的学生的学号、姓名、性别。
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'刘%';4.查询student表中学生的总人数。
SELECT COUNT(*)'总人数' FROM student;5.查询和‘李勇’同性别的所有同学的姓名。
SELECT sname from student where ssex in(select ssex from student where sname='李勇');6.查询和‘李勇’同性别并同系的所有同学的姓名。
Select sname from student where ssex in(select ssex from student where sname='李勇')and sdept in(select sdept from student where sname='李勇')7.查询选修2号课程的学生的学号。Select sno from sc where cno='2' 8.求3号课程的平均成绩。
Select avg(grade)from sc where cno=’3’ 9.查询选修2号课程的学生的最高分。Select max(grade)from sc where cno=’2’
10.按成绩降序排列,输出‘IS’系学生选修了2号课程的学生的姓名和成绩。
Select sname,grade from student,sc where sdept='IS' and cno='2' and student.sno=sc.sno order by grade desc SQL查询分析器下建数据库的命令代码: create database 霍双双200826352 on(name='霍双双200826352_data',filename='E:
霍霍
双双
双双
***5
霍霍
双双
双双200826352_data.mdf',size=10mb,maxsize=50mb,filegrowth=10%)log on(name='霍双双200826352_log',filename='E:200826352_log.ldf',size=10mb,maxsize=50mb,filegrowth=10%)在查询分析器重建立各表的命令代码: 建立student表:
create table student(sno char(5)primary key,sname char(20),ssex char(2),sage int,sdept char(15))建立course表:
create table course(cno char(2)primary key,cname char(15),cpno char(2),ccredit int)建立cs表:
use 霍双双200826352 create table sc(sno char(5),cno char(2),grade smallint,primary key(sno,cno),foreign key(sno)references student(sno),foreign key(cno)references course(cno))实验二
T-SQL查询、存储过程、触发器、完整性上机作业题 第一部分 :T-SQL程序设计
(1).如果3号课程的平均成绩在80分以上,则输出“3号课程成绩良好”,否则输出“3号成绩一般” declare @avg float set @avg=(select avg(grade)from sc where cno='3')if @avg>80print'3号课程成绩良好'else print'3号成绩一般'(2)计算并输出95003号学生的平均成绩,若无该生信息,则显示“该生未选课”,提示信息.declare @avg float if(select count(*)from sc where sno='95003')=0 print '该生未选课' else begin select @avg=avg(grade)from sc where sno='95003' print'95003号学生平均成绩' print @avg end(3).如果有成绩在90分以上的学生,则显示他的学号,课程和成绩,否则显示“没有学生的课程成绩在90分以上”提示信息
declare @text char(10)if exists(select grade from SC where grade>90)select Sno,Cno,Grade from SC where Grade>90 else begin set @text='没有学生的课程成绩在90分以上' print @text end ×(4).利用游标逐行显示student表中的记录。
declare stu cursor for select *from student open stu fetch next from stu while @@fetch_status=0 fetch next from stu close stu deallocate stu(5).用自定义函数计算全体男生的平均年龄
create function avg_age(@sex char(2))returns int as begin declare @aver int select @aver=(select avg(Sage)from Student where Ssex=@sex)return @aver end go declare @aver1 int,@sex char(2)set @sex='男' select @aver1=dbo.avg_age(@sex)select @aver1 as '全体男生的平均年龄' go(6).显示course表中课程名的前2个字符。select substring(Cname,1,2)from Course(7).在一列中显示student中各元组的学号中的年级,列名显示为“年级”;另一列中显示学号中的学生序列号,列名显示为“序号”。
select substring(Sno,1,2)年级,substring(Sno,3,len(Sno)-1)序号 from Student order by Sno(8).在选课表中显示学号、课程号,并根据成绩:0-59显示“不合格”;60-79显示“合格”;80-89显示“良好”;90-100显示“优秀。”
select Sno as '学号',Cno as '课程号', grade =case when Grade<=59 then '不合格' when Grade>=60 and Grade<=79 then '合格' when Grade>=80 and Grade<=89 then '良好' else '优秀' end from SC 第二部分 :存储过程
(1)创建一个为worker表添加职工记录的存储过程Addworker go
if exists(select name from sysobjects where name='Addworker' and type='P')drop procedure Addworker go create proc Addworker @职工号 char(4),@姓名 char(8),@性别 char(2),@出生日期 datetime,@党员否 char(2),@参加工作 datetime,@部门号 char(4)as insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号)values(@职工号,@姓名,@性别,@出生日期,@党员否,@参加工作,@部门号)go exec Addworker '16','王璐','女','1988-11-20','否','2010-08-21','11'(2)创建一个存储过程Delworker删除worker表中指定职工号的记录 go
if exists(select name from sysobjects where name='Delworker' and type='P')drop procedure Delworker go create procedure Delworker @职工号 char(4)as delete from worker where 职工号=@职工号
go exec Delworker '16'(3)显示存储过程Delworker的定义信息。Sp_helptext Delworker(4)删除存储过程Addworker和Delworker。drop procedure Addworker, Delworker(5)创建并执行以下存储过程:
a.从数据库表中查询,返回学生学号、姓名、课程名、成绩 use 霍双双200826351 go if exists(select name from sysobjects where name='select_stu' and type='P')drop procedure select_stu go create procedure select_stu as select SC.Sno,Sname,Cname,Grade from Student,SC,Course where SC.Sno=Student.Sno and SC.Cno=Course.Cno go exec select_stu b.从数据库表中查询指定学号的学生学号,姓名,该存储过程接受与传递参数,精确匹配的值 use 霍双双200826351 go if exists(select name from sysobjects where name='select_sno' and type='P')drop procedure select_sno go create procedure select_sno @Sno char(5)as select Sno,Sname from Student where Sno=@Sno go exec select_sno '95002' ×第三部分:触发器
(1)在表depart上创建一个触发器 depart_update , 当更改部门号时同步更改 worker表中对应的部门号。Go If exists(select name from sysobjects where name='depart_update'and type='tr')drop trigger depart_update go Create trigger depart_update on depart for update as set worker.部门号=(select 部门号 from inserted)where worker.部门号=(select 部门号from deleted)(2)在表worker上创建一个触发器worker_delete,当删除职工记录时同步删除salary表中对应的职工记录。Go If exists(select name from sysobjects where name='worker_delete'and type='tr')drop trigger worker_delete go create trigger worker_delete on worker for delete as delete salary where salary.职工号=(select 职工号 from deleted)(3)删除触发器depart_update(4)删除触发器worker_delete(5)在数据库中创建一个触发器,向选课表添加一条纪录时,检查该纪录的学号在学生表中是否存在,检查该纪录的课程号在课程表中是否存在,若其中有一项为否,则拒绝添加操作,并显示“违反数据一致性”提示信息。Go If exists(select name from sysobjects where name='add_student'and type='tr')drop trigger add_student go
create trigger add_student on sc for insert as go 第四部分:数据库完整性
1、实施worker表的“性别”字段默认值为“男”的约束 create default default_sex as '男' go sp_bindefault'default_sex','worker.性别'
2、实施salary表的“工资”字段值在0~9999的约束、create rule salary_rule as @salary='[0~9999]' go sp_bindrule 'salary_rule','salary.工资'
3、实施depart表的“部门号”字段值唯一的非聚集索引的约束
4、为worker表建立外键“部门号”,参考表depart的“部门号”列。
5、建立一个规则 sex:@性别=’男’OR @性别=’女’,将其绑定到worker表的“性别”列上。Create rule sex as @性别='男'OR @性别='女' Go Sp_bindrule 'sex','worker.性别'
6、删除1小题所建立的约束。
7、删除2小题所建立的约束。
8、删除3小题所建立的约束
9、删除4小题所建立的约束
10.解除5小题所建立的绑定并删除规则sex