高分悬赏:51单片机 程序分析,请求前辈的指导,

高分悬赏:51单片机 程序分析,请求前辈的指导,,第1张

问题1:这个程序确实分了10段,初始时K=5,而J的值是反复从0到9在变化。当K=5,则在J=0-4期间输出高电平,5-9期间输出低电平

问题2:K=10和K=0这个确实是为了限制K的范围,防止程序出现异常(当K成了负值,K就永远不能大于J了,然后输出一直是低电平;K大于9以后也是一样的)

问题3:TH0和TL0等于多少与你的晶振频率有关,这个是为了计算时间方便。比如用110592MHZ的晶振,定时器计满一次用时(1/11059200)12256ms,计时满1秒需要3600次定时器计满。程序是取值56,然后还计时满5000次,实际用时1秒。这个程序实际运行后LED灯估计能看到很明显的闪烁。如果你想实现255级调光,这个程序不能胜任(我估计是按照书上套下来的程序,这个程序时间误差很大)。其实我也自己写有这种模拟PWM的程序,255级调光,其实很容易,自己多想想。建议:定时器中断里面只执行一个i++就可以了,剩下的事情全放到中断外面执行(不仅是这个程序,以后写别的程序也要尽量让中断里面的程序尽可能的少,这样CPU可以有时间多执行主程序,不影响程序整体的运行)

这个需要知道几个数据的值才能计算。

首先要知道步进电机是几相几拍,步进角是多少(也就是每一步所走的角度);

然后要知道延时程序的延时时间是多少,这样就可以计算了。

举个例子:有一款四相四拍步进角为75℃的步进电机,以四相八拍工作,每一步延时时间是10ms。

那么,每步转角度为375℃,就是说电机每转一圈需要的步数=360/375=96步

1s中走一百步,一分钟就是6000步,那么一分钟转的圈数=6000/96=625

所以转数为625r/min

(A)=83H,(R0)=20H,(20H)=A2H执行下列程序后

ANL A,#9FH ; A=83H

ORL 20H,A ; (20H)=A3H

XRL, A, @R0 ; A=20H

CPL A ;A=DFH

结果:(A)=DFH, (20H)=A3H

MOV @R0 , #11H 给@R0即20H赋值11H MOV A , R2 给A赋值20H ADD A , 20H 20H地址内的数加A存入A,执行完A为31H MOV PSW , #80H 将进位位置1 SUBB A , P0 带进位减法执行完A为0 XRL A , #45H A与45H异或执行完A为45H MOV 40H , A 所以A最后为45H 已经过keil检验的、、、

第一题:

(20H)=20H,(21H)=91H,(22H)=A0H,(23H)=01H

Cy=0, A=0A0H, R0=23H, R1=28H

至于第二题吗,你们老师可真变态,好好的SUBB不让用,要用CJNE

程序如下:

;BLOCK为地址起始位

;LEN为数据数量位

;MINI为最小数据

整个编程的思路是这样的:

先设一个基准数,从最大的0FF设起,再把这些数据与基准数比较是否一致,如果一致,则先把这个数(也就是基准数)存起来,这一行就不用再往下比较了。然后把基准数减一,再执行上面的程序,如果亦有相同的,则把现在的基准数存起来,覆盖原来存的数据。就这样一直减,减到0后,停止,存起来的最后一个基准数就是最小值。

MOV R0, #BLOCK ;将地址起始位置存入R0中

MOV R1, #MINI ;将最后结果存储地址存入R1中

MOV R2, LEN ;数据数量

MOV R3, #0FFH ;比较的基准数

LOOP:

MOV A, @R0 ;读入数据

CJNE A, 03H, NEXTLOOP ;和基准数相比较,不等于则转移

MOV A, @R0 ;等于基准数了,先存起来,如果将基准数减小后,再没有和基准数相等的了,那么这个数就是最小的。

MOV @R1, A

CLR C

MOV A, R3 ;如果基准数已经减到00H了,那么,就不用再减一比较了,因为已经从0FF开始至00结束,全比较过了

JZ WAIT

SUBB A, #01H ;基准数减1

MOV R3, A

MOV R0, #BLOCK

MOV R1, #MINI

MOV R2, LEN

LJMP LOOP

NEXTLOOP:

INC R0

DJNZ R2, LOOP

WAIT:

LJMP $

按你的修改,再修改结果

(20H)=20H,(21H)=91H,(22H)=0D0H,(23H)=00H

Cy=0, A=0D0H, R0=22H, R1=28H

int1() interrupt 2

{

EA = 0;//关中断

P26 = 1;

delay1();//发生中断后延迟一定时间(补充一下,从这里来看,这里的外部中断唤醒方式应该是霍尔开关0唤醒,即低电平唤醒,而不是负跳变唤醒,不然随着车速度的变化这个延迟时间很难掌握)

if(P33 == 1)//延迟后如果霍尔开关输出跳变为1,表明车轮在转,并且产生了新输出,就是转了一圈了

{MileAge = MileAge + 19/2;}//车轮转了,那么小钱钱就要增加,mileage在英文中有运费的意思,如果这个霍尔开关是接在车轮上数圈圈的话,这个表达式的意思大概就是车轮转一圈加95,尼玛,如果是元的话,这个车非好贵。当然,mileage也有总里程的意思,这里也可能是加里程,车轮转一圈大概也就是一米不到,不管是什么吧,反正意味着加钱。

count1 = 0;//清零等待时间,这就是自动切换到里程状态了。

count2 = 0;//同上

count3 = 0;//同上

P26 = 0;//这个应该是P26接了一个外围元件,没有图不好说是什么东西。

EA = 1;//开中断

}

//定时器中断0

void t0(void) interrupt 1 using 0

{

EA = 0;

TH0=(65536-50000)/256; //12M晶振下50ms定时,记住这个程序必须用12M晶振,不然定时就不是想像那样了。其实这个程序写得不大好,这个看起来是定时器使用自动重装模式,没必要在这里再装一次,初始化的时候弄好就行了。

TL0=(65536-50000)%256;//同上

count1++;//50ms单位定时计数+1

if(count1 == 20)//50ms20=1s,1秒到了

{

count1 = 0;//清除50ms单位定时计数

count2++;//秒计数+1

if(count2 == 60)//60s,就是说1分钟了咩?

{

count2 = 0;//1分钟了,秒计数清零

count3++;//分钟计数+1

if(count3 == 1)//等了1分钟了么?

{count3 = 0;InterVal += unit price; }//如果等了1分钟了,那么,加钱钱。相信我,这个程序如果你用12M晶振的话,绝不是你说的5分钟加小钱钱,而是1分钟就加小钱钱了,你绝对打不到5分钟才加钱的出租车的。当然,如果你把晶振换成24M的,那就是5分钟加。

}

}

EA = 1;}

另外说一句,这个程序在最后结束的时候,也就是算钱的时候,是需要把InterVal和MileAge加一下得到最后的价钱的。

以上就是关于高分悬赏:51单片机 程序分析,请求前辈的指导,全部的内容,包括:高分悬赏:51单片机 程序分析,请求前辈的指导,、单片机步进式电机程序分析、单片机一道程序分析题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9395104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存