Keil Proteus中的数字时钟仿真

时间:2018-01-02 08:50:08

标签: c keil 8051 real-time-clock

这个C程序应该模拟一个数字时钟。 Proteus程序中将有3个7段显示小时,分钟和秒(如数字时钟)

#include<reg51.h>

void main()
{
int t, i, j, k, a, b, c, d, e;
e = 0;
P3 = 0x00;
P2 = 0x00;
P0 = 0x00;
while (1)
{
    P0 = 0x00;
    for (c = 0; c<3; c++)
    {
        for (d = 0; d<10; d++)
        {
            for (a = 0; a<6; a++)
            {
                for (b = 0; b<10; b++)
                {
                    for (t = 0; t<6; t++)
                    {
                        for (i = 0; i<10; i++)
                        {
                            for (k = 0; k<1000; k++)
                                for (j = 0; j<142; j++);
                            P3++;
                        }
                        P3 = P3 + 0x06;
                    }
                    P3 = 0x00;
                    P2++;
                }
                P2 = P2 + 0x06;
                }
                P2 = 0x00;
                P0++;
                if (P0 == 0x24){
                    P0 = 0x00;
                    e = 1;
                }
                if (e == 1)
                    break;
            }
            if (e == 1){
                e = 0;
                break;
            }
            P0 = P0 + 0x06;
        }
    }
}

如果有人解释代码会没关系吗?我不了解代码开头的嵌套for循环?而且,这些增加了什么?

P2 = P2 + 0x06;

什么是0x06?最后,e应该在这段代码中做什么?

1 个答案:

答案 0 :(得分:1)

以下代码段没有副作用

for (k = 0; k<1000; k++)
    for (j = 0; j<142; j++);

因此它可能被用作绝望的人的延迟,最内层的3个循环可以转换为此

for (i = 0; i<10; i++)
{
    delay(142000);
    P3++;
}
P3 = P3 + 0x06;

根据我的猜测,P3是3个数字的单位数字的BCD输出。每142000个循环增加1个。一旦增加10次,即发生溢出,将向总和添加0x06以调整BCD添加(将进位移动到下一位)作为I explained here

如果您在每个周期后以十六进制编写P3,则更容易获得0x00 0x01 0x02 0x03 ... 0x08 0x09 0x10 0x11 ... 0x19 0x20:在10个周期后,我们将获得0x0A + 0x06 = 0x10

但是,如果我们继续下一行

P3 = 0x00;
P2++;

我们可以看到P3在10个周期后复位,因此这意味着只有最低有效位的低4位存储在P3中,下一个数字将存储在P2的低半字节中。为什么?因为分钟的十位数范围仅为0到5(由t计算)。 P2和P0的增加和携带方式也与P3相同。

最后P0在达到24时重置为0,所以P0包含整个小时

if (P0 == 0x24){
    P0 = 0x00;
    e = 1;
}

现在您可以猜出e用于