使用Proteus8仿真工具,零硬件成本学习51单片机嵌入式开发

什么是proteus8?


Protues8 是由 Lab Center Electronics 公司开发的电子设计自动化(EDA)软件,在电子工程领域应用广泛。它将电路仿真、PCB 设计和虚拟模型仿真等功能集成于一体,为电子设计提供了一站式解决方案,特别适合用于 51 单片机的仿真实验,能有效降低开发成本,缩短开发周期。​
在电路仿真方面,Protues8 支持模拟电路、数字电路以及混合信号电路的仿真。例如你想要设计一个简单的 51 单片机最小系统,就可以在 Protues8 中搭建电路,模拟其在不同条件下的运行情况,通过示波器、逻辑分析仪等虚拟仪器,观察电路中各节点的电压、电流以及信号波形 ,及时发现并解决电路设计中的问题。它就像是一个虚拟的电子实验室,让你无需实际搭建硬件电路,就能对设计进行验证和调试。​
在 PCB 设计功能上,Protues8 提供了从原理图到 PCB 布局的完整设计流程。当你完成电路原理图的设计和仿真后,可以直接将其转换为 PCB 设计。软件内置了丰富的元件库,包含各种常见的电子元件,你可以方便地进行元件布局和布线操作。而且,它还支持自动布线功能,提高了设计效率。​
虚拟模型仿真是 Protues8 的一大特色。它支持多种微控制器的仿真,其中就包括我们熟悉的 51 单片机。在进行 51 单片机项目开发时,你可以在 Protues8 中创建包含 51 单片机及其外围电路的虚拟模型,然后将编写好的程序下载到虚拟的单片机中进行运行和调试。通过这种方式,你可以在没有实际硬件的情况下,对整个系统进行功能验证和优化,这对于初学者来说尤其友好,能让他们在学习 51 单片机的过程中,更加直观地理解和掌握单片机的工作原理和应用开发。

为什么选择 Protues8 进行 51 单片机仿真?


丰富的元件库​


Protues8 拥有一个丰富的元件库,在这个元件库中,几乎可以找到进行 51 单片机实验所需的各种元件。例如常用的 51 单片机芯片,如 AT89C51、STC89C52 等。同时还有各类传感器,像温度传感器 DS18B20 ,它可以用于测量环境温度,并将温度数据传输给 51 单片机进行处理;光敏电阻传感器,能感知光线强度的变化,常用于智能照明等项目中。​
此外,电阻、电容、电感等基础元件也是一应俱全。不同阻值的电阻可以满足各种分压、限流等电路需求;不同容量的电容则可用于滤波、耦合等功能。以一个简单的 51 单片机最小系统为例,除了单片机芯片本身,还需要晶振提供时钟信号,两个电容配合晶振起振,以及一个复位电路,这其中的晶振、电容、电阻以及按键等元件,在 Protues8 的元件库中都能快速找到并使用,极大地方便了电路的搭建,让你无需为寻找元件模型而烦恼,能够专注于电路设计和功能实现。​

强大的仿真功能​


Protues8 的仿真功能十分强大,能够模拟各种电路的工作状态。以 51 单片机控制流水灯为例,在 Protues8 中搭建好包含 51 单片机、若干个 LED 灯以及相关电阻等元件的电路后,将编写好的控制程序下载到虚拟的 51 单片机中进行仿真运行。此时,你可以清晰地看到 LED 灯按照程序设定的顺序依次点亮和熄灭,就像在实际硬件中运行一样。​
不仅如此,Protues8 还提供了各种虚拟仪器,如示波器、逻辑分析仪等,可以深入分析电路的工作情况。比如在 51 单片机的串口通信实验中,使用示波器可以观察串口发送和接收信号的波形,通过分析波形的频率、幅值、相位等参数,判断通信是否正常,信号是否存在干扰等问题。逻辑分析仪则可以同时监测多个信号的逻辑状态,对于分析复杂的数字电路逻辑关系非常有帮助,能直观地了解 51 单片机与其他设备之间的数据传输和交互过程 ,从而更好地分析和优化电路设计,及时排查出电路中可能存在的问题。​

便捷的操作界面​


Protues8 的操作界面简洁直观,易于上手。软件采用了拖拽式的操作方式,你只需在元件库中找到所需的元件,然后用鼠标将其拖拽到工作区,再通过简单的连线操作,就可以完成电路的搭建。对于初次接触 51 单片机仿真的新手来说,这种简单易懂的操作方式降低了学习门槛。​
在工作区中,各种工具和选项的布局也十分合理,方便用户随时调用。例如,在绘制电路图时,你可以通过工具栏上的绘图工具轻松地绘制导线、添加节点等;对于元件的属性设置,只需双击元件,即可在弹出的属性对话框中进行修改,如设置电阻的阻值、电容的容值等。而且,Protues8 还提供了丰富的视图功能,你可以根据需要放大或缩小电路图,以便更清晰地查看细节;也可以切换不同的显示模式,如原理图模式、PCB 模式等,方便在不同的设计阶段进行操作和查看。​

与其他工具的兼容性​


Protues8 兼容常用的单片机编程软件,如Keil编程工具。在 51 单片机开发过程中,Keil 是一款广泛使用的编程软件,用于编写和编译 51 单片机的程序代码。而 Protues8 则专注于电路的设计和仿真。这两款软件的结合,实现了代码编写和电路仿真的无缝对接。​
当你在 Keil 中完成程序代码的编写和编译后,生成的 hex 文件可以直接导入到 Protues8 中的 51 单片机模型中进行仿真运行。在仿真过程中,如果发现程序存在问题,你可以随时切换回 Keil 进行代码的修改和调试,然后再次将修改后的 hex 文件导入到 Protues8 中进行验证,如此反复,直到程序和电路都能正常工作。

Protues8 在 51 单片机仿真中的应用实例


流水灯实验​


打开 Protues8 软件,新建一个工程。在元件库中找到 AT89C51 单片机,将其拖拽到工作区。接着,添加 8 个 LED 灯和 8 个电阻,将 LED 灯的阳极通过电阻连接到 + 5V 电源,阴极分别连接到单片机的 P1 口的 8 个引脚(P1.0 - P1.7)。这样,硬件电路的搭建就完成了 。​
接下来编写控制程序。使用 Keil 软件编写如下 C 语言代码:​

#include <reg51.h>​
#include <intrins.h>​
​
void delay(unsigned int time) {​
unsigned int i, j;​
for (i = 0; i < time; i++)​
for (j = 0; j < 1275; j++);​
}​
​
void main() {​
while (1) {​
P1 = 0xfe; // 1111 1110,点亮第一个LED​
delay(500);​
P1 = 0xfd; // 1111 1101,点亮第二个LED​
delay(500);​
P1 = 0xfb; // 1111 1011,点亮第三个LED​
delay(500);​
// 以此类推,按顺序点亮每个LED​
P1 = 0x7f; // 0111 1111,点亮第八个LED​
delay(500);​
}​
}​


在这段代码中,delay函数用于实现延时,通过调整time参数可以改变 LED 灯点亮的时长。在main函数中,通过循环依次向 P1 口写入不同的二进制值,来控制 LED 灯依次点亮 。​
代码编写完成后,在 Keil 中进行编译,生成 hex 文件。回到 Protues8,双击 AT89C51 单片机,在弹出的属性对话框中,将生成的 hex 文件加载到单片机中。点击仿真运行按钮,就可以看到 LED 灯按照程序设定的顺序依次点亮和熄灭,呈现出流水灯的效果。

温度采集系统仿真​


案例结合 51 单片机与温度传感器 DS18B20,来仿真一个温度采集系统,并将采集到的温度值在数码管上显示出来。​
先搭建硬件电路。在 Protues8 中,从元件库中添加 AT89C51 单片机、DS18B20 温度传感器、共阴极数码管以及一些电阻、电容等元件。将 DS18B20 的 DQ 引脚连接到单片机的 P3.2 引脚,用于数据传输。数码管的段选引脚连接到单片机的 P0 口,位选引脚连接到 P2 口,并通过电阻进行限流 。​
使用Keil工具编写程序。程序主要包括 DS18B20 的初始化、温度读取、数据处理以及数码管显示等功能。以下是一段示例代码:​

#include <reg51.h>​
#include <intrins.h>​
​
sbit DQ = P3^2; // 定义DS18B20的数据引脚​
unsigned char code segCode[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管段码​
unsigned char code digitCode[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; // 数码管位码​
​
void delay(unsigned int time) {​
unsigned int i, j;​
for (i = 0; i < time; i++)​
for (j = 0; j < 1275; j++);​
}​
​
bit initDS18B20() {​
bit presence;​
DQ = 1;​
_nop_();​
DQ = 0;​
delay(750); // 拉低480-960us​
DQ = 1;​
delay(15); // 拉高后等待15-60us​
presence = DQ;​
delay(250); // 等待60-240us​
return presence;​
}​
​
unsigned char readByte() {​
unsigned char i, dat = 0;​
for (i = 0; i < 8; i++) {​
DQ = 0;​
dat >>= 1;​
DQ = 1;​
if (DQ) {​
dat |= 0x80;​
}​
delay(4);​
}​
return dat;​
}​
​
void writeByte(unsigned char dat) {​
unsigned char i;​
for (i = 0; i < 8; i++) {​
DQ = 0;​
DQ = dat & 0x01;​
delay(5);​
DQ = 1;​
dat >>= 1;​
}​
}​
​
unsigned int getTemperature() {​
unsigned char lowByte, highByte;​
initDS18B20();​
writeByte(0xCC); // 跳过ROM操作命令​
writeByte(0x44); // 启动温度转换​
delay(100); // 等待转换完成​
initDS18B20();​
writeByte(0xCC);​
writeByte(0xBE); // 读取温度寄存器​
lowByte = readByte();​
highByte = readByte();​
return (highByte << 8) | lowByte;​
}​
​
void displayTemperature(unsigned int temp) {​
unsigned char digit1, digit2, digit3, digit4;​
digit1 = temp / 1000;​
digit2 = (temp % 1000) / 100;​
digit3 = (temp % 100) / 10;​
digit4 = temp % 10;​
​
P2 = digitCode[0];​
P0 = segCode[digit1];​
delay(500);​
P2 = digitCode[1];​
P0 = segCode[digit2];​
delay(500);​
P2 = digitCode[2];​
P0 = segCode[digit3];​
delay(500);​
P2 = digitCode[3];​
P0 = segCode[digit4];​
delay(500);​
}​
​
void main() {​
unsigned int temperature;​
while (1) {​
temperature = getTemperature();​
displayTemperature(temperature);​
}​
}​
​

在这段代码中,initDS18B20函数用于初始化 DS18B20;readByte和writeByte函数分别用于读取和写入一个字节的数据;getTemperature函数负责启动温度转换并读取转换后的温度值;displayTemperature函数将温度值分解成各个数位,并通过数码管显示出来 。​
将编写好的程序在 Keil 中编译生成 hex 文件,然后加载到 Protues8 中的单片机中进行仿真。运行仿真后,可以看到数码管上实时显示出当前的温度值。