单片机实验总结

单片机实验总结(小老师)

班级:生物医学工程0803 姓名:王俊 学号:u200812657 日期:2010.12.20-2011.01.06

在实验之前便收到单片机需要小老师的通知,仔细想了一下相关的问题,也对照着之前的生物化学与分子生物学的小老师的情况,最终决定报名作为小老师。一方面自己对这方面的兴趣比较大,通过这种方式应该可以给自己一些压力,让自己能够学得更好;另一方面,在作为小老师的过程中可以帮助别人,也可以发现更多的问题,这样可以互相促进,共同进步。所以一开始便觉得作为一名小老师是非常有意义的。

在第一个实验之前便对小老师集中进行了一次授课,主要是对实验的内容作一个基本的了解。在这次课后我便开始提前做完实验。第一个实验主要内容是写几个汇编程序。在实验之前我花了一天时间将所有程序写出来,并给出了详细的注释。由于当时对汇编语言还不是非常熟悉,所以程序的冗余度相当高。当时所用的程序中最多的是MOV、MOVX,在涉及到循环时一般用到的都是DJNZ,而CJNE等指令极少用到,这必然使程序太过冗长,而且在各处跳转时要用比较巧妙的方法才能使循环的次数不出现错误。在这些程序中没有很好地使用程序的调用,也使程序变得复杂,不便于理解。

当时为了便于观察程序运行的结果,在程序开始时对相关量进行了赋值,而在程序结尾处又将相关量调出观察效果。

下面举几个例子说明(下面的序号对应《单片微型计算机与接口技术(第2版)》的253页程序设计选题的序号):

(1)将外部数据存储器0001H和0002H单元内容互换。

ORG 0000H ;程序起始位置

MOV A,#0D3H ;将一个数先送进A,以便后面观察效果

MOV DPTR,#0001H ;将外部存储器地址0001H送入DPTR

MOVX @DPTR,A ;将A中的数据送入0001H中

MOV A,#34H ;同上

MOV DPTR,#0002H ;同上

MOVX

MOV

MOVX

MOV

MOV

MOV

MOVX

MOVX

XCH

MOVX

MOVX

MOVX

SJMP

END A,@DPTR ;观察外部存储器0001H中的内容 A,@R1 ;观察外部存储器0002H中的内容 $ ;动态暂停 ;汇编结束 @DPTR,A ;同上 DPTR,#0001H ;得到外部存储器地址0001H存入DPTR A,@DPTR ;将外部存储器0001H中的数据送入A中 R2,A ;将数据再存入R2中,以保留 P2,#00H ;得到第二个外部存储器地址0002H的高位地址00H R1,#02H ;得到第二个外部存储器地址0002H的低位地址02H A,@R1 ;将外部存储器0002H中的数据送入A中 @DPTR,A ;将存在A中的外部存储器0002H中的内容送入外部存储器0001H中 A,R2 ;将A与R2中的内容交换,使A得到原外部存储器0001H中的内容 @R1,A ;将原外部存储器0001H中的内容送入外部存储器0002H中,交换完

这本来是个简单的程序,但由于将具体的数送进和送出而使程序较为冗长。在前面送数部分可以写得更为有条理,这样可以使程序更加容易理解。

(6)将外部数据存储器0~05H单元中的十六进制数转换成ASCII码放回原单元。 ORG 0000H ;程序起始位置

MOV P2,#00H ;将程序中的高位地址送入P2中

MOV R7,#06H ;将子程序的循环次数6送入R7中

MOV R0,#00H ;将程序中的低位起始地址送入R0中

;MOVX A,@Ri或MOVX @Ri,A 中i=0或1

;为R0指示的外部存储器赋值子程序

MOV A,#9DH ;送入一个数到A中,以观察后面效果

MOVR0: MOVX @R0,A ;将数据送入R0中存放的地址指示的外部存储器

INC R0 ;R0中存放的地址自加1

INC A ;将A自加1,以使效果明显

DJNZ R7,MOVR0 ;循环执行子程序

MOV R7,#06H ;将子程序的循环次数6送入R7中

MOV R0,#00H ;将程序中的低位起始地址送入R0中

MOV R1,#10H ;将最后存储数据的低位起始地址送入R1中

;转换子程序

MOVE1: MOVX A,@R0 ;将外部存储器中的内容送入A中

ANL A,#0FH ;先取A的低位进行转换

ADD A,#30H ;将A中的内容转完ASCII码,即与30H相加,4位进行一次 MOV B,A ;将A中的内容暂时存入B中

SUBB A,#3AH ;判断A中的内容是否小于10

JC NUM1 ;小于10,则跳转到数字子程序1

MOV A,B ;将B中的内容送回A中

ADD A,#07H ;将其转换成ASCII码的A-F中的一个

MOVX @R1,A ;将转换后的内容送回R1中存放的地址指示的外部存储器中

INC R1 ;R1中存放的地址自加1

MOVE2: MOVX A,@R0 ;将外部存储器中的内容送入A中

ANL A,#0F0H ;取A的高位进行转换

INC R1 INC R0 DJNZ

MOV

MOV

SJMP

NUM1: MOV

NUM2: MOVX INC R1 SJMP MOV ;R1中存放的地址自加1 ;R0中存放的地址自加1 R7,MOVE1 ;循环执行子程序 R7,#0CH ;将子程序的循环次数12送入R7中 R1,#10H ;将最后存储数据的低位起始地址送入R1中 MOVA ;跳到显示子程序 A,B ;将B中的内容送回A中,不能直接把B送回@R1中 @R1,A ;小于10则直接送到外部存储器中 ;R1中存放的地址自加1 MOVE2 ;跳到变换子程序2 A,B ;将B中的内容送回A中,不能直接把B送回@R1中 ADD A,#30H ;将A中的内容转完ASCII码,即与30H相加,4位进行一次 MOV B,A ;将A中的内容暂时存入B中 SUBB A,#3AH ;判断A中的内容是否小于10 JC NUM2 ;小于10,则跳转到数字子程序2 MOV A,B ;将B中的内容送回A中 ADD A,#07H ;将其转换成ASCII码的A-F中的一个 MOVX @R1,A ;将转换后的内容送回R1中存放的地址指示的外部存储器

MOVX @R1,A ;小于10则直接送到外部存储器中

INC R1 ;R1中存放的地址自加1

INC R0 ;R0中存放的地址自加1

DJNZ R7,MOVE1 ;循环执行子程序

MOV R7,#0CH ;将子程序的循环次数12送入R7中

MOV R1,#10H ;将最后存储数据的低位起始地址送入R1中

;观察效果子程序

MOVA: MOVX A,@R1 ;将R1中存放的地址指示的外部存储器中的数据送入A中 INC R1 ;R1中存放的地址自加1

DJNZ R7,MOVA ;循环执行子程序

STOP: SJMP STOP ;停止子程序

SJMP $ ;动态暂停

END ;汇编结束

这里将程序复杂化了,是将每个单元中的十六进制数转换成两个ASCII码后送回指定单元中。而这里由于用到的指令的类型很少,使程序很复杂,特别是为了不致出现没有转换到的错误而使这个子程序的顺序要安排得相当巧妙才可以。而且在适当的位置上还要加上“SJMP STOP”这样的语句,使程序不致进入死循环。当然这题不是实验中要求。拿出这题只是来说明一下当时的情况。

单片机书上也有类似的程序,比较简洁,可以作为参考。

在这里我为了观察效果而送进和送出具体的内容,那么有没有什么办法可以直接观察呢?

实验中虽然要求使用Proteus,但实验一完全是汇编程序,所以我当时主要是在Keil中进行的。通过查阅资料,对于单片机中的CODE、DATA、IDATA、SFR、XDATA作了初步的了解,而在Keil中也可以通过以“C:”、“D:”、“I:”、“X:”开头再加上相应的地址的方式观察指定的单元中的内容,这样便可以更方便地观察程序运行的结果。

对于实验一的思考题,我的认识如下:

1、为什么程序结束用“STOP:SJMP STOP”指令?有没有其他的停止方式?51单片机启动后,是否一直不断地在执行指令?

答:程序的结束还可以使用“SJMP $”,题中的结束指令和这个作用是类似的,是通过循环而使程序停留在此处,其实“SJMP $”是动态暂停,等待中断的到来。51单片机启动后,最后如果执行到此条指令,还是在不断地执行的,只不过看不出具体的效果。

2、比较“跟踪”、“单步”和“断点”调试方式的特点。

答:“跟踪”和“单步”的调试方式有很多相似之处,在大多数时候,它们都是一步步执行程序,但在调用子程序的过程中,“跟踪”会进入子程序,然后依然一步步地执行程序,而“单步”会将子程序一次执行完,相当于没有进入子程序内部;“断点”主要是指在某句程序处设置断点,这样程序便可一次执行到此处,观察运行的结果,在Keil中“断点”有很多使用方法,都是很好的调试手段,由于涉及到的内容较多,此处不再赘述。

在提前完成这个实验的过程中,我们小老师也进行了交流,对于可能出现的问题也尽量去解决,这样才能更好地作为小老师帮助其他同学。

以上主要是以第一个实验为例说明在实验之前的情况。下面将结合着实验说说遇到的一些问题和解决办法。

在本次单片机实验中,我是作为生医0804班郑卿杭和朱舟的小老师,当然在实际操作中,各位小老师还经常互相帮助,互相探讨问题的。

在第一次实验中,我们主要让同学们用Keil进行编程。部分同学对于Keil的使用还不是非常熟悉,我们和他们讲解了一下基本的使用和应该注意的问题。

下面对部分人在编程后无法创建目标进行归纳:

1、要养成良好的习惯。建立一个属于自己的单独的文件夹,一般以英文命名比较好,有些软件不兼容中文文件名,而且最好也不要出现纯数字命名的文件夹,在新建工程或ASM程序时命名也最好这样去做。另外命名中除扩展名前的“.”,其它地方最好不要再出现。

2、建立工程时的问题。我们使用的一般是Atmel公司的AT89C51,在新建工程时还是将STARTUP.A51添加进去比较好。虽然在后面可能因为它而出现3个警告,但有时没有它却可能导致目标无法创建。建立工程后记得将自己写好的ASM或C文件添加到工程中。

3、编程问题。很多时候无法创建目标都是因为在写具体的程序时出现了错误。最常见的错误是指令写错了。比如将SETB写成了STEB,这需要我们在编程时要十分细心,另外还要将指令的拼写记清楚。这种错误一般程序是不提示的。还有种类似的错误是可能将数字0和字母O混淆了。以上都是拼写的错误中。还有另一种错误是指令不匹配,比如说MOV和MOVX的混用,在作为地址时将地址值送入了除R0或R1之外的寄存器中,比如说R2。最后还有一种错误,这种错误会提示你某一句有语法错误,这时候我们也许会很奇怪:这么简单的句子,我都检查不下十遍了,哪里有错啊?这时你可以试着拖动横向的滚动条,看看很远的地方是不是还有一个句子,如果有,那就是它导致错误了。

4、如果你确定以上错误都排除了,但还是无法创建目标,那么可以从头来过,从新建一个英文文件夹开始。

在第一次编程中还遇到过其它问题,但由于是具体编程的问题,在过程中都有解决,而且编程主要还是要靠自己平时多写程序,所以在此处不再赘述。当时部分人没有提前进行很好地预习,在实验过程中无法写出其中某些程序,但在对照书上的例子后还是可以模仿着写出来,这也是一种学习的方法,但还是要注意预习和坚持去学习,不能写过之后就又全都放下了,要在模仿中学会编程,掌握方法。

后面三次实验有着很多共同之处,主要是要求同学们在理解的基础上,对照着给出的电路图来画出电路图,利用已给出的程序进行运行调试,观察实验的效果。因为这一点,后面三次的实验将放在一起进行总结。

因为在实验之前我们在做单片机作业时已经多次使用Proteus,所以大家对于Proteus的基本使用已经比较熟悉了。先看看实验中的思考题。

对于实验二的思考题,我的认识如下:

1、在七段LED显示中,如果设置20H为显示缓冲区,要显示的字段码送入显示缓冲区,反复调用显示子程序即可,试编写该显示子程序。

答:SHOW: MOV P1,20H

RET

这个程序与前面的例子并没有什么本质上的区别。有时候可能还要添加延时程序。

2、能否显示“H”、“L”、“P”、“U”的字形,试写出它们的字段码。

答:字出它们的字段码实际就是对照七段LED显示的每段的位置,以及是共阴极型还是共阳极型,将相应位置0或置1,然后用十六进制数表示出来。则“H”、“L”、“P”、“U”的共阴十六进制代码分别为76H、38H、73H、3EH;共阳十六进制代码分别为:89H、0C7H、8CH、0C1H。

对于实验三的思考题,我的认识如下:

1、分析用中断和查询方式编写的键盘程序在运行时会出现什么区别?

答:中断方式编写的键盘程序会等待中断的到来,然后执行相应的中断子程序;而查询方式是一直在运行程序,不断地进行扫描,如果达到条件便执行相应的子程序。同时中断方式还可能要将相应的内容送入和送出栈中,以保护现场。查询方式相对来说要简单一些,但是中断方式更加合理实用。当然这些东西都是相对来说的,没有绝对的说法。

2、当单片机进入中断后,其SP、PC 等特殊功能寄存器的内容会发生什么变化? 答:由于要进入中断子程序,则要保护现场,因为最后要返回主程序。保护现场就是将程序中的一些内容送入栈中,这时SP就要作相应的改变,以指向新的地址,以使最后能

够正确地返回。而根据指令的跳转,PC的内容也要作相应的改变,以使子程序能够得到正确地执行。

3、中断程序保护现场有何意义?

答:保护现场是指将主程序中需要保护的寄存器内容进行保护,这样在中断程序执行完毕之后就可以正确地恢复现场,返回主程序。这样一来就不会因为中断程序而影响其他程序的正常运行。

4、在程序中,读入按键端口状态后为什么要取反?

答:因为最开始时端口都是高电平,这样得出的数值并不是我们所想要的,而取反之后,正好与它们对应的数字相等,这样就可以更好地进行程序的编写。(最开始端口是高电平是使读入操作时不致出现误读。)

5、两种键盘输入电路中数码管的硬、软件驱动有何不同?

答:中断方式的电路中数码管和单片机之间只用了RX8,相当于加了电阻,起到限流的作用。查询方式中在RX8和单片机之间又加了74LS244,主要是增加电路的驱动能力。在程序中分别在送入数据到指定端口之前和之后进行了延时去抖动。

下面结合实验中大家遇到的一些问题进行总结。

由于实验中主要是画出电路图,所以也主要是针对这方面的一些问题:

1、首先最基本的是查找器件和连线。在Proteus的库中查找器件比较方便,只要输入相应的单词或其一部分就能快速定位。在连线时注意不要将两个元件的端脚直接相连,这样在很多时候实际上是没有连接上的。在连线时也要注意不要将不相干的线相交了或者将两条线完全重合了。

2、使用元器件一些注意事项。对于电阻、电容或者是它们的其他形式,如RX8等,要记得为它们设定值,否则系统可能将其设为默认值,大多数时候这样可能导致电路无法正常工作。要使用系统可以仿真的元件,如某些人在本来要用74LS系列的元件的地方使用了74ALS系列的元件,这样会导致无法进行仿真,也就看不出程序运行的结果。一些人在使用BUTTON时可能无法正常使用,一般情况下是将BUTTON锁定了,这时需要先将其解除锁定。很多时候感觉一切连接正常,但是无法得到理想的结果,这时候可以逐步排查,锁定某个元件,因为可能是因为你某个不经意的操作改变了元件的属性。

3、一些技巧。这里先以总线为例。使用总线时需要将其所连接的两端连线进行标号,并且需要一一对应,当然我们可以通过放置网络标号的方式进行,但这样效率太低了。我们可以在对总线相关部分操作后,点击:工具——属性设置工具,在字符串中输入“NET=P1#”(这里以对P1口连接的线进行分配为例,其它类似),先对某一边的连线进行分配,然后再重新点击,再进行另一边的连线的分配工作。在连接线路时,如果连接的线和上一次的相同,这时直接左键双击元件的端脚即可。这样的技巧还有很多,就不再一一赘述,这需要我们在实验中不断发现、总结、运用,如果掌握了这些技巧可以大大提高我们连接电路的速度。

4、有时候程序说没有载入代码,这时候应该是还没有添加hex文件。有时CPU无法实时、正确的仿真,可能需要我们在程序中加一些内容来调节一下。有时程序运行较快,我们可能需要将延时子程序延时的时间改得更长一点。

以上便是作为单片机实验小老师时同学们遇到的一些问题和解决方法,以及我自己的一点感想。

对于这种小老师的教学方式,同学们的交流更多了,在这过程中互相促进,共同进步了。但同学们对于自己的要求应该不仅仅局限于完成实验中的内容,而是要在实验中发现更多的问题,并且进行深层次的了解,最后进行总结、交流。只有这样才能达到实验的目的,只有这样这种教学方式才能发挥它的最大作用。

单片机实验总结(小老师)

班级:生物医学工程0803 姓名:王俊 学号:u200812657 日期:2010.12.20-2011.01.06

在实验之前便收到单片机需要小老师的通知,仔细想了一下相关的问题,也对照着之前的生物化学与分子生物学的小老师的情况,最终决定报名作为小老师。一方面自己对这方面的兴趣比较大,通过这种方式应该可以给自己一些压力,让自己能够学得更好;另一方面,在作为小老师的过程中可以帮助别人,也可以发现更多的问题,这样可以互相促进,共同进步。所以一开始便觉得作为一名小老师是非常有意义的。

在第一个实验之前便对小老师集中进行了一次授课,主要是对实验的内容作一个基本的了解。在这次课后我便开始提前做完实验。第一个实验主要内容是写几个汇编程序。在实验之前我花了一天时间将所有程序写出来,并给出了详细的注释。由于当时对汇编语言还不是非常熟悉,所以程序的冗余度相当高。当时所用的程序中最多的是MOV、MOVX,在涉及到循环时一般用到的都是DJNZ,而CJNE等指令极少用到,这必然使程序太过冗长,而且在各处跳转时要用比较巧妙的方法才能使循环的次数不出现错误。在这些程序中没有很好地使用程序的调用,也使程序变得复杂,不便于理解。

当时为了便于观察程序运行的结果,在程序开始时对相关量进行了赋值,而在程序结尾处又将相关量调出观察效果。

下面举几个例子说明(下面的序号对应《单片微型计算机与接口技术(第2版)》的253页程序设计选题的序号):

(1)将外部数据存储器0001H和0002H单元内容互换。

ORG 0000H ;程序起始位置

MOV A,#0D3H ;将一个数先送进A,以便后面观察效果

MOV DPTR,#0001H ;将外部存储器地址0001H送入DPTR

MOVX @DPTR,A ;将A中的数据送入0001H中

MOV A,#34H ;同上

MOV DPTR,#0002H ;同上

MOVX

MOV

MOVX

MOV

MOV

MOV

MOVX

MOVX

XCH

MOVX

MOVX

MOVX

SJMP

END A,@DPTR ;观察外部存储器0001H中的内容 A,@R1 ;观察外部存储器0002H中的内容 $ ;动态暂停 ;汇编结束 @DPTR,A ;同上 DPTR,#0001H ;得到外部存储器地址0001H存入DPTR A,@DPTR ;将外部存储器0001H中的数据送入A中 R2,A ;将数据再存入R2中,以保留 P2,#00H ;得到第二个外部存储器地址0002H的高位地址00H R1,#02H ;得到第二个外部存储器地址0002H的低位地址02H A,@R1 ;将外部存储器0002H中的数据送入A中 @DPTR,A ;将存在A中的外部存储器0002H中的内容送入外部存储器0001H中 A,R2 ;将A与R2中的内容交换,使A得到原外部存储器0001H中的内容 @R1,A ;将原外部存储器0001H中的内容送入外部存储器0002H中,交换完

这本来是个简单的程序,但由于将具体的数送进和送出而使程序较为冗长。在前面送数部分可以写得更为有条理,这样可以使程序更加容易理解。

(6)将外部数据存储器0~05H单元中的十六进制数转换成ASCII码放回原单元。 ORG 0000H ;程序起始位置

MOV P2,#00H ;将程序中的高位地址送入P2中

MOV R7,#06H ;将子程序的循环次数6送入R7中

MOV R0,#00H ;将程序中的低位起始地址送入R0中

;MOVX A,@Ri或MOVX @Ri,A 中i=0或1

;为R0指示的外部存储器赋值子程序

MOV A,#9DH ;送入一个数到A中,以观察后面效果

MOVR0: MOVX @R0,A ;将数据送入R0中存放的地址指示的外部存储器

INC R0 ;R0中存放的地址自加1

INC A ;将A自加1,以使效果明显

DJNZ R7,MOVR0 ;循环执行子程序

MOV R7,#06H ;将子程序的循环次数6送入R7中

MOV R0,#00H ;将程序中的低位起始地址送入R0中

MOV R1,#10H ;将最后存储数据的低位起始地址送入R1中

;转换子程序

MOVE1: MOVX A,@R0 ;将外部存储器中的内容送入A中

ANL A,#0FH ;先取A的低位进行转换

ADD A,#30H ;将A中的内容转完ASCII码,即与30H相加,4位进行一次 MOV B,A ;将A中的内容暂时存入B中

SUBB A,#3AH ;判断A中的内容是否小于10

JC NUM1 ;小于10,则跳转到数字子程序1

MOV A,B ;将B中的内容送回A中

ADD A,#07H ;将其转换成ASCII码的A-F中的一个

MOVX @R1,A ;将转换后的内容送回R1中存放的地址指示的外部存储器中

INC R1 ;R1中存放的地址自加1

MOVE2: MOVX A,@R0 ;将外部存储器中的内容送入A中

ANL A,#0F0H ;取A的高位进行转换

INC R1 INC R0 DJNZ

MOV

MOV

SJMP

NUM1: MOV

NUM2: MOVX INC R1 SJMP MOV ;R1中存放的地址自加1 ;R0中存放的地址自加1 R7,MOVE1 ;循环执行子程序 R7,#0CH ;将子程序的循环次数12送入R7中 R1,#10H ;将最后存储数据的低位起始地址送入R1中 MOVA ;跳到显示子程序 A,B ;将B中的内容送回A中,不能直接把B送回@R1中 @R1,A ;小于10则直接送到外部存储器中 ;R1中存放的地址自加1 MOVE2 ;跳到变换子程序2 A,B ;将B中的内容送回A中,不能直接把B送回@R1中 ADD A,#30H ;将A中的内容转完ASCII码,即与30H相加,4位进行一次 MOV B,A ;将A中的内容暂时存入B中 SUBB A,#3AH ;判断A中的内容是否小于10 JC NUM2 ;小于10,则跳转到数字子程序2 MOV A,B ;将B中的内容送回A中 ADD A,#07H ;将其转换成ASCII码的A-F中的一个 MOVX @R1,A ;将转换后的内容送回R1中存放的地址指示的外部存储器

MOVX @R1,A ;小于10则直接送到外部存储器中

INC R1 ;R1中存放的地址自加1

INC R0 ;R0中存放的地址自加1

DJNZ R7,MOVE1 ;循环执行子程序

MOV R7,#0CH ;将子程序的循环次数12送入R7中

MOV R1,#10H ;将最后存储数据的低位起始地址送入R1中

;观察效果子程序

MOVA: MOVX A,@R1 ;将R1中存放的地址指示的外部存储器中的数据送入A中 INC R1 ;R1中存放的地址自加1

DJNZ R7,MOVA ;循环执行子程序

STOP: SJMP STOP ;停止子程序

SJMP $ ;动态暂停

END ;汇编结束

这里将程序复杂化了,是将每个单元中的十六进制数转换成两个ASCII码后送回指定单元中。而这里由于用到的指令的类型很少,使程序很复杂,特别是为了不致出现没有转换到的错误而使这个子程序的顺序要安排得相当巧妙才可以。而且在适当的位置上还要加上“SJMP STOP”这样的语句,使程序不致进入死循环。当然这题不是实验中要求。拿出这题只是来说明一下当时的情况。

单片机书上也有类似的程序,比较简洁,可以作为参考。

在这里我为了观察效果而送进和送出具体的内容,那么有没有什么办法可以直接观察呢?

实验中虽然要求使用Proteus,但实验一完全是汇编程序,所以我当时主要是在Keil中进行的。通过查阅资料,对于单片机中的CODE、DATA、IDATA、SFR、XDATA作了初步的了解,而在Keil中也可以通过以“C:”、“D:”、“I:”、“X:”开头再加上相应的地址的方式观察指定的单元中的内容,这样便可以更方便地观察程序运行的结果。

对于实验一的思考题,我的认识如下:

1、为什么程序结束用“STOP:SJMP STOP”指令?有没有其他的停止方式?51单片机启动后,是否一直不断地在执行指令?

答:程序的结束还可以使用“SJMP $”,题中的结束指令和这个作用是类似的,是通过循环而使程序停留在此处,其实“SJMP $”是动态暂停,等待中断的到来。51单片机启动后,最后如果执行到此条指令,还是在不断地执行的,只不过看不出具体的效果。

2、比较“跟踪”、“单步”和“断点”调试方式的特点。

答:“跟踪”和“单步”的调试方式有很多相似之处,在大多数时候,它们都是一步步执行程序,但在调用子程序的过程中,“跟踪”会进入子程序,然后依然一步步地执行程序,而“单步”会将子程序一次执行完,相当于没有进入子程序内部;“断点”主要是指在某句程序处设置断点,这样程序便可一次执行到此处,观察运行的结果,在Keil中“断点”有很多使用方法,都是很好的调试手段,由于涉及到的内容较多,此处不再赘述。

在提前完成这个实验的过程中,我们小老师也进行了交流,对于可能出现的问题也尽量去解决,这样才能更好地作为小老师帮助其他同学。

以上主要是以第一个实验为例说明在实验之前的情况。下面将结合着实验说说遇到的一些问题和解决办法。

在本次单片机实验中,我是作为生医0804班郑卿杭和朱舟的小老师,当然在实际操作中,各位小老师还经常互相帮助,互相探讨问题的。

在第一次实验中,我们主要让同学们用Keil进行编程。部分同学对于Keil的使用还不是非常熟悉,我们和他们讲解了一下基本的使用和应该注意的问题。

下面对部分人在编程后无法创建目标进行归纳:

1、要养成良好的习惯。建立一个属于自己的单独的文件夹,一般以英文命名比较好,有些软件不兼容中文文件名,而且最好也不要出现纯数字命名的文件夹,在新建工程或ASM程序时命名也最好这样去做。另外命名中除扩展名前的“.”,其它地方最好不要再出现。

2、建立工程时的问题。我们使用的一般是Atmel公司的AT89C51,在新建工程时还是将STARTUP.A51添加进去比较好。虽然在后面可能因为它而出现3个警告,但有时没有它却可能导致目标无法创建。建立工程后记得将自己写好的ASM或C文件添加到工程中。

3、编程问题。很多时候无法创建目标都是因为在写具体的程序时出现了错误。最常见的错误是指令写错了。比如将SETB写成了STEB,这需要我们在编程时要十分细心,另外还要将指令的拼写记清楚。这种错误一般程序是不提示的。还有种类似的错误是可能将数字0和字母O混淆了。以上都是拼写的错误中。还有另一种错误是指令不匹配,比如说MOV和MOVX的混用,在作为地址时将地址值送入了除R0或R1之外的寄存器中,比如说R2。最后还有一种错误,这种错误会提示你某一句有语法错误,这时候我们也许会很奇怪:这么简单的句子,我都检查不下十遍了,哪里有错啊?这时你可以试着拖动横向的滚动条,看看很远的地方是不是还有一个句子,如果有,那就是它导致错误了。

4、如果你确定以上错误都排除了,但还是无法创建目标,那么可以从头来过,从新建一个英文文件夹开始。

在第一次编程中还遇到过其它问题,但由于是具体编程的问题,在过程中都有解决,而且编程主要还是要靠自己平时多写程序,所以在此处不再赘述。当时部分人没有提前进行很好地预习,在实验过程中无法写出其中某些程序,但在对照书上的例子后还是可以模仿着写出来,这也是一种学习的方法,但还是要注意预习和坚持去学习,不能写过之后就又全都放下了,要在模仿中学会编程,掌握方法。

后面三次实验有着很多共同之处,主要是要求同学们在理解的基础上,对照着给出的电路图来画出电路图,利用已给出的程序进行运行调试,观察实验的效果。因为这一点,后面三次的实验将放在一起进行总结。

因为在实验之前我们在做单片机作业时已经多次使用Proteus,所以大家对于Proteus的基本使用已经比较熟悉了。先看看实验中的思考题。

对于实验二的思考题,我的认识如下:

1、在七段LED显示中,如果设置20H为显示缓冲区,要显示的字段码送入显示缓冲区,反复调用显示子程序即可,试编写该显示子程序。

答:SHOW: MOV P1,20H

RET

这个程序与前面的例子并没有什么本质上的区别。有时候可能还要添加延时程序。

2、能否显示“H”、“L”、“P”、“U”的字形,试写出它们的字段码。

答:字出它们的字段码实际就是对照七段LED显示的每段的位置,以及是共阴极型还是共阳极型,将相应位置0或置1,然后用十六进制数表示出来。则“H”、“L”、“P”、“U”的共阴十六进制代码分别为76H、38H、73H、3EH;共阳十六进制代码分别为:89H、0C7H、8CH、0C1H。

对于实验三的思考题,我的认识如下:

1、分析用中断和查询方式编写的键盘程序在运行时会出现什么区别?

答:中断方式编写的键盘程序会等待中断的到来,然后执行相应的中断子程序;而查询方式是一直在运行程序,不断地进行扫描,如果达到条件便执行相应的子程序。同时中断方式还可能要将相应的内容送入和送出栈中,以保护现场。查询方式相对来说要简单一些,但是中断方式更加合理实用。当然这些东西都是相对来说的,没有绝对的说法。

2、当单片机进入中断后,其SP、PC 等特殊功能寄存器的内容会发生什么变化? 答:由于要进入中断子程序,则要保护现场,因为最后要返回主程序。保护现场就是将程序中的一些内容送入栈中,这时SP就要作相应的改变,以指向新的地址,以使最后能

够正确地返回。而根据指令的跳转,PC的内容也要作相应的改变,以使子程序能够得到正确地执行。

3、中断程序保护现场有何意义?

答:保护现场是指将主程序中需要保护的寄存器内容进行保护,这样在中断程序执行完毕之后就可以正确地恢复现场,返回主程序。这样一来就不会因为中断程序而影响其他程序的正常运行。

4、在程序中,读入按键端口状态后为什么要取反?

答:因为最开始时端口都是高电平,这样得出的数值并不是我们所想要的,而取反之后,正好与它们对应的数字相等,这样就可以更好地进行程序的编写。(最开始端口是高电平是使读入操作时不致出现误读。)

5、两种键盘输入电路中数码管的硬、软件驱动有何不同?

答:中断方式的电路中数码管和单片机之间只用了RX8,相当于加了电阻,起到限流的作用。查询方式中在RX8和单片机之间又加了74LS244,主要是增加电路的驱动能力。在程序中分别在送入数据到指定端口之前和之后进行了延时去抖动。

下面结合实验中大家遇到的一些问题进行总结。

由于实验中主要是画出电路图,所以也主要是针对这方面的一些问题:

1、首先最基本的是查找器件和连线。在Proteus的库中查找器件比较方便,只要输入相应的单词或其一部分就能快速定位。在连线时注意不要将两个元件的端脚直接相连,这样在很多时候实际上是没有连接上的。在连线时也要注意不要将不相干的线相交了或者将两条线完全重合了。

2、使用元器件一些注意事项。对于电阻、电容或者是它们的其他形式,如RX8等,要记得为它们设定值,否则系统可能将其设为默认值,大多数时候这样可能导致电路无法正常工作。要使用系统可以仿真的元件,如某些人在本来要用74LS系列的元件的地方使用了74ALS系列的元件,这样会导致无法进行仿真,也就看不出程序运行的结果。一些人在使用BUTTON时可能无法正常使用,一般情况下是将BUTTON锁定了,这时需要先将其解除锁定。很多时候感觉一切连接正常,但是无法得到理想的结果,这时候可以逐步排查,锁定某个元件,因为可能是因为你某个不经意的操作改变了元件的属性。

3、一些技巧。这里先以总线为例。使用总线时需要将其所连接的两端连线进行标号,并且需要一一对应,当然我们可以通过放置网络标号的方式进行,但这样效率太低了。我们可以在对总线相关部分操作后,点击:工具——属性设置工具,在字符串中输入“NET=P1#”(这里以对P1口连接的线进行分配为例,其它类似),先对某一边的连线进行分配,然后再重新点击,再进行另一边的连线的分配工作。在连接线路时,如果连接的线和上一次的相同,这时直接左键双击元件的端脚即可。这样的技巧还有很多,就不再一一赘述,这需要我们在实验中不断发现、总结、运用,如果掌握了这些技巧可以大大提高我们连接电路的速度。

4、有时候程序说没有载入代码,这时候应该是还没有添加hex文件。有时CPU无法实时、正确的仿真,可能需要我们在程序中加一些内容来调节一下。有时程序运行较快,我们可能需要将延时子程序延时的时间改得更长一点。

以上便是作为单片机实验小老师时同学们遇到的一些问题和解决方法,以及我自己的一点感想。

对于这种小老师的教学方式,同学们的交流更多了,在这过程中互相促进,共同进步了。但同学们对于自己的要求应该不仅仅局限于完成实验中的内容,而是要在实验中发现更多的问题,并且进行深层次的了解,最后进行总结、交流。只有这样才能达到实验的目的,只有这样这种教学方式才能发挥它的最大作用。


相关文章

  • C51单片机实验总结报告
  • HEFEI UNIVERSITY 单片机实验报告 系 别 电子信息与电气工程系 专 业 班 级 学 号 姓 名 指导 老师 完成 时间 实验一 构建单片机最小系统和实验环境熟悉 一.预习要求 1.构建单片机最小系统,熟悉51单片机的结构及编 ...查看


  • 智能避障小车实验报告与总结
  • 智能避障小车实验报告与总结 学 院: 电子信息工程学院 专业年级:机 电 1031 队员姓名: 余书奇.周稳.刘阳.邹超 智能避障小车实验报告与总结 摘要:本设计制作的是单片机控制的自动避障小汽车,以单片机为小汽车的"大脑&quo ...查看


  • 单片机活动课教学计划
  • 2016-2017第一学期<单片机>教学计划 一.指导思想 通过单片机教学学生亲身体验单片机的线路连接及软件编程实现各种控制的实践活动,尝试编程.单片机实验板或是模拟实验板的正确使用,以及对程序调试.单片机实现各种控制的体验过程 ...查看


  • 太原理工大学毕业设计题目及任务书
  • 毕业设计(论文)任务书-1 设计(论文)题目:温度调节仪表设计(液晶显示) 题目性质:一般设计 指导教师:牛昱光 毕业设计(论文)要求及原始数据(资料): 本题目属单片机应用开发类型.选题学生需自行购置一款带有液晶显示模块的单片机开发板和测 ...查看


  • 单片机原理实验实验报告册
  • 电子科技大学成都学院 实验报告册 课程名称: 姓 名: 学 号: 院 系: 专 业: 教 师: 年 实验一LED 流水灯 一.实验目的: 1. 掌握并口的使用 2. 掌握移位指令的使用 二.实验原理和内容: 实验原理: 1. 共阳LED ( ...查看


  • 单片机实验单片机
  • 单 片 机 实 验 报 告 班级:生物医学工程131 姓名:刘玉奔 学号:6103413018 目录 实验一:七段数码管显示 实验二:数码管动态显示 实验三:74HC595驱动数码管动态显示 实验一:七段数码管显示 流程图: 代码: ORG ...查看


  • 单片机原理及应用课程设计
  • 单片机课程设计 课题目 学 院 专业名称 班 级 学 号 姓 名 指导教师 串行通讯系统设计 工学院 机械设计制造及其自动化 机械11-4班 111014410 高尚 张超一 目 录 一.课程设计的任务和目的 ............... ...查看


  • 单片机原理与应用实验(实习.实训)报告
  • 北京联合大学 实验(实习.实训)报告 课程名称: 单片机原理与应用 专 业: 通信工程 班 级: 通信1404B 学 号:201408033.2014 指导教师: 胡字滢 姓 名: 成 绩: 2016年10月22日 实验一 一.实验设备:计 ...查看


  • 电子设计竞赛研究与实践
  • 电子设计竞赛的研究与实践 赵升,吴桂初 (温州大学物理与电子信息学院, 浙江 温州 325027) 摘要:本文介绍了全国大学生电子设计竞赛的赛前组织工作和辅导工作,并以"基于单片机和CPLD的数字频率计"为例说明学生进行 ...查看


热门内容