问题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单片机 程序分析,请求前辈的指导,、单片机步进式电机程序分析、单片机一道程序分析题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)