如何用单片机编写一个八位循环计数器程序

如何用单片机编写一个八位循环计数器程序,第1张

x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。

按下x0后,m0得电为1并自保持,此时1秒计时器T0计时,1秒后T0常开点闭合1秒计时器T1计时,再过1秒T1计时结束常闭点断开T0线圈,

T0失电复位并断开T0常开点,此时T1线圈也失电复位,T1常闭点又闭合,T0得电重复上述计时过程。

第二个程序块:

当M0为1时,在T0触点的上升沿来时k3M10这个二进制数乘以2再写入k3M10中。

K3M10代表M10~M21共12个辅助继电器的组合,那么可以将K3M10看作是一个二进制数。程序未启动时,M10~M21均为0,那么这个二进制数为0;当程序启动时,在下一个程序块中利用了M0的上升沿置位M10,此时M10~M21为1,当T0触点的上升沿来时k3M10(此时为1)这个二进制数乘以2再写入k3M10中(写入后为2),2在二进制数中为10,此时M10失电,M11得电,可以认为M10把"1"交给了M11,以此类推。当第8个M17得电时,完成了一次循环。下一个T0上升沿来到时,M18得电,M17失电。此时下面的程序块利用了M18的上升沿重新置位M10并且将M18复位。这样程序又从M10得电开始循环下去了。

这个程序块的作用就是每次T0的上升沿来到时,“1”在M10~M17之间转移。

#include <stdio.h>

int IsCircle(int n)    //判断n是不是循环数

{

    int cir[6],cirtemp[6]   //本题中输入最大为6位数

    int i=0,j,k=0,count=0

    while(n>0)        //把n的每一位一次放入数字cirtemp中(反序)

    {

        count++     //计数

        cirtemp[i++]=n%10

        n=n/10

    }

    for(i=0i<counti++)   //把顺序还原回来(直接用反序也可以,只是还原回看后面的代码会好理解些)

        cir[i]=cirtemp[count-i-1]

    

    for(i=0i<counti++)   //是几位数总共就要循环几次

    {

        j=cir[k]     //向前右j步      

        k=(k+j)%count    //走完后的下标

    }

    if(k==0)       //循环完刚好回到第一个数,这个数是循环数

        return 1

    else

        return 0

}

int main()

{

    int n,i=0

    printf("请输入一个数(9<这个数<999589):\n")    //按题意这行可以删去

    scanf("%d",&n)

    while(1)

    {

        if(IsCircle(n+i)==1)

        {

            printf("%d\n",n+i)

            break

        }

        else if(IsCircle(n-i)==1)

        {

            printf("%d\n",n-i)

            break

        }

        i++

    }

    return 0

}

严格来说我这个程序还不严谨,IsCircle中判断k是否遍历了0,1,2,……count这些自然数来判断是否是循环数更准确,毕竟可能会有巧合使得循环完后回到了第一个数(下标k=0)但是却在中途有一个数没有作为起点和终点(只是觉得有可能,具体是否可能需要证明)。

其实也不难把k的每一个值都加起来如果=1+2+3+……+count,且最后k=0就可以了

还有就是输入的时候最好判断一下输入是否规范  9<数<999589


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

原文地址: http://outofmemory.cn/yw/11724011.html

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

发表评论

登录后才能评论

评论列表(0条)

保存