一、简介

在本教程中,我们将通过Proteus软件,详细展示如何设计并仿真一个基于AT89C52单片机的数字钟温度计。我们将介绍硬件电路设计、软件编程,并通过Proteus进行仿真测试。

二、 项目概述

数字钟温度计是一种集成了时间显示和温度测量功能的设备。本项目旨在设计一个具有以下特点的数字钟温度计:
(1)使用AT89C52单片机作为控制核心。
(2)采用DS18B20作为温度传感器。
(3)显示界面采用LCD显示屏。
(4)低功耗设计,适合长时间运行。

三、硬件设计

硬件设计包括单片机的选择、外围电路设计以及与传感器和显示屏的连接。

1 、单片机选择

我们选择了AT89C52单片机,因为它具有以下优点:
(1)丰富的I/O接口。
(2)内置8位CPU和至少8KB的可编程Flash存储器。
(3)工作频率可达12MHz。

2 、外围电路设计

以下是主要的外围电路设计要点:
晶振:使用XTAL1和XTAL2作为单片机的时钟源,频率为12MHz。
电源:VCC提供3.3V电源,确保系统稳定运行。
I/O接口:P1和P3端口分别用于与外部设备连接,如温度传感器和LCD显示屏。
复位电路:R1为4.7kΩ电阻,与单片机的RST(复位)引脚相连。

四、 Proteus仿真

我们将使用Proteus软件来仿真设计的电路,并验证其功能。

1、 创建新项目

在Proteus中创建一个新的项目,并添加AT89C52单片机组件。

2 、设计原理图

根据硬件设计要求,绘制电路原理图,包括单片机、传感器、显示屏和外围电路。
时钟信号:通过晶振提供的12MHz时钟信号驱动单片机工作。
电源供电:单片机通过VCC接入3.3V电源。
复位电路:确保单片机在上电或出现异常时能够正确复位。
I/O端口:用于连接外部设备,如温度传感器和LCD显示屏。
串行通信:通过RXD和TXD引脚与外部设备进行串行数据交换。
中断功能:通过INT0和INT1引脚响应外部中断,提高系统的响应速度。
定时器:使用定时器进行时间控制,如定时读取温度或刷新显示。

3 、仿真设置

  1. 单片机核心
    AT89C52:这是整个系统的核心,一个8位的单片机,具有8KB的内部存储器和丰富的I/O端口。
  2. 时钟电路
    XTAL1 和 XTAL2:这两个引脚是单片机的时钟输入端,通常连接一个晶振来提供基准时钟频率。
    FREQ=12MHZ:这表明晶振的频率是12MHz,这是单片机的工作频率。
  3. 电源
    VCC:单片机的正电源输入,通常为5V或3.3V,图中显示为3.3V。
    GND:代表地线,即0V电位参考点。
  4. 复位电路
    RST:复位引脚,通常需要通过一个电阻和一个电容连接到VCC来形成一个复位电路。
    R1=4.7k:这个电阻可能用于复位电路,与一个电容并联连接到RST引脚和VCC之间。
  5. 存储器扩展
    ALE:地址锁存允许(Address Latch Enable),用于扩展外部存储器时的地址锁存。
    EA:外部访问允许(External Access),用于选择单片机是使用内部存储器还是外部存储器。
  6. 输入/输出端口
    P1.0 至 P1.7:端口1的8个I/O引脚,可以用于连接各种外设。
    P3.0 至 P3.7:端口3的8个I/O引脚,通常用于更复杂的通信和控制功能。
  7. 特殊功能引脚
    RXD (P3.0) 和 TXD (P3.1):分别代表接收数据和发送数据,用于串行通信。
    INT0 (P3.2) 和 INT1 (P3.3):分别是外部中断0和外部中断1,用于响应外部事件。
    T0 (P3.4) 和 T1 (P3.5):分别是定时器0和定时器1的输入,用于定时和计数。
  8. 温度传感器
    DS18B20:一种常用于测量温度的数字传感器,它通过单总线(One-Wire)协议与单片机通信。
  9. 显示模块
    LCD:液晶显示屏,用于显示时间和温度信息。
  10. 其他元件
    R2:用于电流限制或分压。
    8k2:指一个8.2kΩ的电阻。

4 、仿真运行

运行仿真,观察电路的工作状态,并进行必要的调试。


五、编程实现

包含头文件

#include "reg51.h"

定义按键

sbit key0 = P1^0;

延时函数(delay函数接收一个无符号整型参数dd,并递减直到0,从而实现延时。实际的延时时间取决于单片机的时钟频率和编译器的优化。)

delay(unsigned int dd)
{
    while(--dd);
}

显示函数(disp函数用于在四位数码管上显示一个字符。它接收一个unsigned char类型的参数aa)
在函数内部,通过设置P2端口的不同位,选择数码管的各个段,然后通过P0端口发送要显示的数字或字符。数码管的显示是通过控制各个段的通断来实现的,每个段代表数码管上的一个笔画。

disp(unsigned char aa)
{
        P2 = 0xff;
        P0 = aa;
        P2 = 0x7f;

        delay(1000);

        P2 = 0xff;
        P0 = 0x06;
        P2 = 0xbf;
        delay(1000);    

        P2 = 0xff;
        P0 = 0x5b;
        P2 = 0xdf;

        delay(1000);

        P2 = 0xff;
        P0 = 0x4f;
        P2 = 0xef;
        delay(1000);    
        P2 = 0xff;
        P0 = 0x66;
        P2 = 0xf7;

        delay(1000);

        P2 = 0xff;
        P0 = 0x6d;
        P2 = 0xfb;
        delay(1000);    
}

主循环(main函数是程序的入口点。它初始化了一个计数器aa,然后进入一个无限循环)
在循环内部,程序检查key0是否被按下(即key0为低电平)。如果检测到按键,则aa的值增加。然后调用disp函数显示aa的当前值。

main()
{
    unsigned char aa=0;
    while(1)
    {
      if(!key0) aa++;
      disp(aa);
    }
}

程序逻辑
程序的逻辑是通过按键来递增一个数值,并将这个数值显示在数码管上。每次按键动作会使aa的值加1,并且新的数值会立即显示在数码管上。

注意事项
(1)这段代码没有考虑按键去抖动,实际应用中可能需要去抖动逻辑以避免误触发。
(2)disp函数中的显示代码是硬编码的,这意味着它只能显示特定的几个字符。如果需要显示不同的数字或字符,需要修改函数内部的代码。
(3)延时函数delay的精确性取决于单片机的时钟频率,且这种实现方式并没有考虑编译器优化的影响。

六、 结果分析

通过Proteus仿真,我们能够观察到数字钟温度计的实时温度显示功能。以下是仿真结果的截图:

从图中可以看到,单片机的晶振、电源、I/O端口等关键部分均已正确连接。LCD显示屏能够正确显示从DS18B20读取的温度值。

七、 总结与展望

本项目展示了如何使用Proteus软件设计并仿真单片机数字钟温度计。通过实践,我们验证了设计的可行性,并为进一步的硬件实现奠定了基础。