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

单片机考试压轴题代码深度解读---献给正被单片机QJ的你_第1张图片
为何我的心口,隐隐作痛?因为,我要考单片机

开篇语

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

题目

单片机考试压轴题代码深度解读---献给正被单片机QJ的你_第2张图片
这是我复习的第一套试卷的最后一题,难度杠杠滴
单片机考试压轴题代码深度解读---献给正被单片机QJ的你_第3张图片
这是第一题的题目配套的图片,也是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所指地址
       
绝望的怒吼

整整61行代码。而且我们的单片机试卷还有两个这种压轴题,还有不少的小题和大题,当然比起这个不值一提。。绝望~~但还是要学习~!!!

单片机考试压轴题代码深度解读---献给正被单片机QJ的你_第4张图片
天绝地灭版的笑声

不多废话了。刚刚是学得累了。玩会电脑补充下战斗力,现在,继续与单片机斗争,看是谁QJ谁!!

单片机考试压轴题代码深度解读---献给正被单片机QJ的你_第5张图片
战场一角!!!!

你可能感兴趣的:(单片机考试压轴题代码深度解读---献给正被单片机QJ的你)