单片机考试压轴题代码深度解读---献给正被单片机QJ的你

2019-04-15 18:26发布

3810775-86b0c196c9c5de41.jpg 为何我的心口,隐隐作痛?因为,我要考单片机

开篇语

在我复习的不可自拔的时候。突然想起,简书的单片机版块~~好吧,根本就没有这个版块,但是我想写点关于单片机相关的东西,让大家见识到这个生活中隐藏在我们各种各样机器内的核心器件。也是很多点子物品的灵魂所在。当然,不是科普单片机。其实,好吧,这就是我复习的时候写一点笔记。。。下周三就考试了。我还是很慌的,所以把自己的一些思绪理清,正好简书是个不错的记笔记的好家伙~~~嘿嘿嘿~~所以,就有了这个了。待会投稿都不知道投到哪儿去~。不过,如果你正在被单片机苦苦折磨,最后一道大题想不清楚怎么搞,那么,我这篇笔记一定可以帮到你的。。

题目

3810775-cb7047eb67800740.jpg 这是我复习的第一套试卷的最后一题,难度杠杠滴 3810775-550cb3ef959a3353.jpg 这是第一题的题目配套的图片,也是8051单片机的一个扩展电路
接下来让我逐条解读,做好笔记~~

题目答案

ORG 0000H AJMP MAIN ORG 000BH LJMP TIMER0 ORG 0030H 一堆伪代码,还有无条件跳转指令。为的,是在对的时间,遇到对的中断,把它带到对的地方,其中MAIN是主函数,属于预备阶段;TIMER0是中断到来之后执行的中断服务程序~
MAIN: MOV SP,#60H %初始化堆栈地址 CLR RS1 CLR RS0 MOV R0,#100 %由R0计数,一百次读入两个数值并且求平均 MOV R1,#0 %记录最小值是一百次中的第几次 MOV R4,#0FFH %存入最小值的初值 MOV R5,#0 %最小值低字节的地址记录 MOV TL0,#30H %% MOV TH0,#0F8 %% MOV TMOD,#21H %% 这个是定时器,由计数原理算出来的初值赋值,对了是定时方式一 16位定时器 SETB ET0 %% SETB TR0 %% SETB EA %% 开中断控制位 SJMP $ %预备工作完毕,等待中断到来 TIMER0:PUSH ACC %% PUSH PSW %% PUSH DPH %% PUSH DPL %%保护现场 CLR RS0 CLR RS1 MOV DPTR,#2000H %% MOVX A,@DPTR %% 读入第一次读数的其中一个数,地址是2000H 对应74LS245 MOV R2,A %把读入的数据存入R2寄存器 MOV DPTR,#4000H %% MOVX A,@DPTR %%读入第二个数据 ADD A,R2 %读入的两数相加 RRC A %%右移A ,等同于A/2 即为求均值 MOV DPH,#10H %% MOV DPL,R1 %%将DPTR指针指向1000H 即6264中的一个地址 MOVX @DPTR,A %将第一次求得的均值存入6264指定地址 MOV R3,A %保留此次求得的均值,以便与下一次读入的数据的均值进行比较 CLR C %清除Cy 为后面的计算做准备 SUBB A,R4 %把第一次求得的均值与初始化的最小值(0FFH,这他么其实是最大的,后面随便来个数都会顶替掉的)进行比较(比较方式是使用借位减法,使用起对Cy的不同赋值来判定那一个数大) JC T0A %如果一开始的数大(即Cy=1),那么直接跳转到T0A MOV R4,03H %如果求得的均值大,那么Cy=0,进行这一步,就是用R3(03H其实就是R3的地址)种存储的本次求得的均值替代掉原来R4中存储的最小值 MOV R5,01H %然后把R1(01H)中的地址赋给R5 T0A: DEC R0 %上面不管是直接跳过来还是经过几步再过来,反正都会过来,R0=R0-1 代表接受数据一次 INC R1 % R1=R1+1 代表均值存储地址变为下一个地址 MOV A,R0 %取得求均值进行的次数 JNZ T0EX %判断A是否等于0,等于0则直接往下走,不等于0就跳转到T0EX MOV DPTR,#2000H %运行到这儿就代表着A(也就是R0计数器为0了)等于0,运行了一百次,那么,接下来就要输出了,这一句的意思是把输出地址定位为1#74LS373 MOV A,R5 %由上面的中断服务程序的最后,可以知道,R5是记录最小值的低字节地址,也就是R0的,只有在新求的均值小于上一步求出来的均值的时候,才把下一步的均值放到R5种存储,这样R5种存储的永远是最小值的地址,此时取出R5中的地址数据 MOVX @DPTR,A %输出最小值低字节地址数据 MOV DPTR,#6000H %% MOV A,#10H %% MOVX @DPTR,A %%将最小值高字节地址输出到2#74LS373 MOV R0,#100 %% MOV R1,#0 %% MOV R4,#0FFH %%再次对计数器,最小值,最小值低字节地址,最小值进行初始化,准备下一步的运行 T0EX: POP DPL %% POP DPH %% POP PSW %% POP ACC %% RETI %%恢复现场,进入中断前的主程序,也就是SJMP那一段的PC所指地址 3810775-5e89861568ff80c3.gif 绝望的怒吼
整整61行代码。而且我们的单片机试卷还有两个这种压轴题,还有不少的小题和大题,当然比起这个不值一提。。绝望~~但还是要学习~!!!
3810775-f04997d016d43ce9.jpg 天绝地灭版的笑声
不多废话了。刚刚是学得累了。玩会电脑补充下战斗力,现在,继续与单片机斗争,看是谁QJ谁!! 3810775-fc585913b326dba4.jpg 战场一角!!!!