任意启动停止的电子秒表,用proteus8和emu8086编译

**步骤1:AT89C51单片机的引脚布局**

首先,我们需要知道AT89C51单片机的引脚布局。

| 引脚编号 | 引脚名称 | 功能描述                                                     |
| -------- | -------- | ------------------------------------------------------------ |
| 1        | EA       | 外部存储器地址                                             |
| 2        | AVDD     | 正电源                                                       |
| 3        | ALE      | 地址锁定信号                                                 |
| 4        | PSEN     | 外部程序存储器时钟                                         |
| 5        | AD7      | 8位双向数据总线                                             |
| 6        | AD6      |                                                              |
| 7        | AD5      |                                                              |
| 8        | AD4      |                                                              |
| 9        | AD3      |                                                              |
| 10       | AD2      |                                                              |
| 11       | AD1      |                                                              |
| 12       | AD0      |                                                              |
| 13       | VSS      | 负电源                                                       |
| 14       | XTAL1    | 晶振输入                                                     |
| 15       | XTAL2    | 晶振输出                                                     |
| 16       | RESET    | 复位端口                                                     |
| 17       | P3.0     | 端口3.0                                                      |
| 18       | P3.1     | 端口3.1                                                      |
| 19       | P3.2     | 端口3.2                                                      |
| 20       | P3.3     | 端口3.3                                                      |
| 21       | P3.4     | 端口3.4                                                      |
| 22       | P3.5     | 端口3.5                                                      |
| 23       | P3.6     | 端口3.6                                                      |
| 24       | P3.7     | 端口3.7                                                      |
| 25       | RST      | 复位端口                                                     |
| 26       | P1.0     | 端口1.0(T2)                                                |
| 27       | P1.1     | 端口1.1(T2)                                                |
| 28       | P1.2     | 端口1.2(INT0)                                              |
| 29       | P1.3     | 端口1.3(INT1)                                              |
| 30       | P1.4     | 端口1.4                                                      |
| 31       | P1.5     | 端口1.5                                                      |
| 32       | P1.6     | 端口1.6                                                      |
| 33       | P1.7     | 端口1.7                                                      |
| 34       | VCC      | 正电源                                                       |
| 35       | P0.0     | 端口0.0                                                      |
| 36       | P0.1     | 端口0.1                                                      |
| 37       | P0.2     | 端口0.2                                                      |
| 38       | P0.3     | 端口0.3                                                      |
| 39       | P0.4     | 端口0.4                                                      |
| 40       | P0.5     | 端口0.5                                                      |
| 41       | P0.6     | 端口0.6                                                      |
| 42       | P0.7     | 端口0.7                                                      |

**步骤2:电子秒表的设计**

接下来,我们需要设计电子秒表。我们将使用AT89C51单片机的定时器功能,以及数码管和按钮。

首先,让我们定义一些常量和变量:

#include 

#define DISPLAY_PORT P0
#define BUTTON_PORT P1

unsigned int ms_counter = 0;
unsigned char seconds = 0;
unsigned char minutes = 0;
unsigned char hours = 0;
unsigned char display

接下来,我们需要编写一些初始化和显示函数。以下是初始化函数:

void init()
{
    // 设置定时器1为16位自动重装模式,并设置计数器初值
    TMOD = 0x10;
    TH1 = 0xFC;
    TL1 = 0x66;

    // 打开定时器1中断,并打开总中断开关
    ET1 = 1;
    EA = 1;

    // 初始化按钮端口为输入模式,上拉电阻使能
    BUTTON_PORT = 0xFF;
    P1M0 = 0x00;
    P1M1 = 0xFF;

    // 初始化数码管端口为输出模式
    DISPLAY_PORT = 0x00;
    P0M0 = 0xFF;
    P0M1 = 0x00;
}

接下来,我们将编写显示函数。

void display_time()
{
    unsigned char digits[4];

    // 将小时、分钟和秒分别转换为BCD码,并存储在数组中
    digits[0] = hours / 10;
    digits[1] = hours % 10;
    digits[2] = minutes / 10;
    digits[3] = minutes % 10;

    // 循环显示每个数码管的数字
    for (display = 0; display < 4; display++)
    {
        // 显示当前数码管的数字
        DISPLAY_PORT = ~(1 << display);
        P0 = digits[display];

        // 稍微延时一下,以便人眼能够观察到显示效果
        for (unsigned int i = 0; i < 100; i++);
    }

    // 将数码管全部关闭
    DISPLAY_PORT = 0xFF;
}

最后,我们需要编写定时器中断函数和主函数。

定时器中断函数需要在每毫秒更新ms_counter,并检查按钮的状态。如果按钮按下,则相应地更新时间。

void timer1_isr() interrupt 3
{
    // 更新计数器值
    ms_counter++;

    // 如果计数器达到1秒,那么更新时间,并将计数器清零
    if (ms_counter == 1000)
    {
        seconds++;
        if (seconds == 60)
        {
            minutes++;
            seconds = 0;
            if (minutes == 60)
            {
                hours++;
                minutes = 0;
                if (hours == 24) hours = 0;
            }
        }

        ms_counter = 0;

        // 显示时间
        display_time();
    }

    // 检查按钮状态
    if (~BUTTON_PORT & 0x01)
    {
        hours++;
        if (hours == 24) hours = 0;
        display_time();
        while (~BUTTON_PORT & 0x01);
    }
    else if (~BUTTON_PORT & 0x02)
    {
        minutes++;
        if (minutes == 60) minutes = 0;
        display_time();
        while (~BUTTON_PORT & 0x02);
    }
    else if (~BUTTON_PORT & 0x04)
    {
        seconds++;
        if (seconds == 60) seconds = 0;
        display_time();
        while (~BUTTON_PORT & 0x04);
    }
}

最后,我们需要编写一个简单的主函数,只需调用初始化函数即可。

void main()
{
    init();

    while (1);
}

**步骤3:在Proteus中模拟电路**

现在我们已经编写了AT89C51单片机的程序,接下来我们将使用Proteus进行模拟。首先,打开Proteus,并创建一个新的电路图。从元件库中选择AT89C51单片机,并添加至电路图中。然后依次添加数码管和按钮元件,并连接它们到单片机引脚上。最终,你的电路图应该看起来像这样:

**步骤4:编译代码并进行仿真**

现在,我们需要将AT89C51单片机程序编译到HEX文件中。使用Keil C51编译器将代码编译为HEX文件。确保您选择正确的单片机型号,并且编译选项设置正确。

完成编译后,在Proteus中打开AT89C51单片机属性对话框,并选择HEX文件作为程序存储器。然后运行仿真即可。

在仿真时,你可以单击按钮模拟按下按钮。数码管将实时更新显示时间,同时你可以通过模拟按钮来测试秒表的启动和停止效果。

你可能感兴趣的:(单片机,单片机,嵌入式硬件)