文章目录
一、Proteus 简介
Proteus 是一款知名的电子设计自动化 (EDA) 软件套件,主要用于电路设计、仿真和 PCB 布局设计。它由英国Labcenter Electronics公司开发,广泛应用于电子工程师和学生的电路设计和原型开发过程中。
Proteus 软件具有直观的用户界面和强大的功能,可以帮助用户快速设计和验证电路原型。它提供了多种设计工具,包括电路图编辑器、仿真引擎和PCB布局编辑器。
通过Proteus,用户可以绘制电路图并进行仿真,以验证电路的功能和性能。它支持模拟和数字电路的设计和仿真,并提供了各种电路元件和器件模型,以便用户可以准确地模拟和测试他们的设计。
二、C51程序设计和仿真
1、绘制原理图
1)添加元件
- 在元件列表中选择需要的芯片和元件,这里我们选择AT89C51芯片、绿色LED灯和300欧姆阻值电阻
- 选择八个灯泡,八个电阻,将各个元件依次摆放
2)连接线路
-
在芯片和LED灯泡之间建立总线
-
连接各元件,选择电源(如图所示),注意给连线编号,将电源类型设置为VCC
2、编写C51程序
1) 创建工程文件
- 在keil软件中点击project->new uversionproject创建工程文件
- 选择AT89C51芯片完成创建
2) 编写main.c文件
- 在file中新建txt文件,编写main.c代码如下
#include<reg51.h>
#include<intrins.h>
//延迟函数
void delay_ms(int a){
int i,j;
for(i=0;i<a;i++){
for(j=0;j<1000;j++){ _nop_();}
}
}
void main(void){
while(1){
P0=0xfe;
delay_ms(50);
P0=0xfd;
delay_ms(50);
P0=0xfb;
delay_ms(50);
P0=0xf7;
delay_ms(50);
P0=0xef;
delay_ms(50);
P0=0xdf;
delay_ms(50);
P0=0xbf;
delay_ms(50);
P0=0x7f;
delay_ms(50);
}
}
- 保存该文件,重命名为main.c,在工程文件Source Group中添加main.c文件
3) 生成.hex文件
在project->options for target->output中选择.hex格式文件并生成
3、仿真效果
双击芯片,导入生成的.hex文件,开始仿真,仿真效果如下:
三、MDK简介
四、MDK编译简单stm32程序
Keil MDK,它是一款嵌入式软件开发工具,由德国公司Keil Software开发和提供。
Keil MDK提供了一套完整的开发环境,用于开发基于ARM、Cortex-M和其他嵌入式处理器的应用程序。它包括了集成开发环境(IDE),C/C++编译器,调试器和仿真器等工具,可以极大地简化嵌入式软件开发过程。
Keil MDK提供了丰富的软件库和组件,使开发者能够快速构建可靠和高效的嵌入式应用。它支持多种编程语言,包括C和C++,并提供了强大的调试和优化功能,帮助开发者加速调试和优化代码。
1、创建工程文件
- 编写main.c文件
//宏定义,用于存放stm32寄存器映射
#define PERIPH_BASE ((unsigned int)0x40000000)//AHB
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8
//定义typedef类型别名
typedef struct
{
volatile unsigned int CR;
volatile unsigned int CFGR;
volatile unsigned int CIR;
volatile unsigned int APB2RSTR;
volatile unsigned int APB1RSTR;
volatile unsigned int AHBENR;
volatile unsigned int APB2ENR;
volatile unsigned int APB1ENR;
volatile unsigned int BDCR;
volatile unsigned int CSR;
} RCC_TypeDef;
#define RCC ((RCC_TypeDef *)0x40021000)
//定义typedef类型别名
typedef struct
{
volatile unsigned int CRL;
volatile unsigned int CRH;
volatile unsigned int IDR;
volatile unsigned int ODR;
volatile unsigned int BSRR;
volatile unsigned int BRR;
volatile unsigned int LCKR;
} GPIO_TypeDef;
//GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
void LEDInit( void )
{
RCC->APB2ENR|=1<<2; //GPIOA 时钟开启
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;
}
//粗略延时
void Delay_ms( volatile unsigned int t)
{
unsigned int i,n;
for (n=0;n<t;n++)
for (i=0;i<800;i++);
}
int main(void)
{
LEDInit();
while (1)
{
LED0=0;//LED熄灭
Delay_ms(500);//延时时间
LED0=1;//LED亮
Delay_ms(500);//延时时间
}
}
- 建立工程文件及在工程文件中添加main.c文件步骤如前文所示。
2、stm32的仿真测试
在右上角的build的按钮点击编辑,左上角的红色放大镜开始调试
五、理论概念
1、嵌入式C程序对内存和变量操作和外部设备的区别
嵌入式C程序在内存和变量操作以及外部设备方面与传统的桌面应用程序存在一些区别。以下是一些主要的区别:
内存限制:嵌入式系统通常具有较小的内存容量。因此,在编写嵌入式C程序时需要更加注意内存的使用。开发者需要优化代码,减少内存消耗,并使用适当的数据类型和数据结构来最大程度地利用可用的内存。
变量访问:在嵌入式系统中,对变量的访问可能会受到限制。有些嵌入式处理器的架构可能会限制对特定内存地址的访问权限,因此,开发者需要注意遵守这些限制,并确保正确地声明和使用变量。
外部设备交互:嵌入式系统通常需要与各种外部设备进行交互,如传感器、执行器、通信接口等。这需要使用特定的外设编程接口和协议来实现与这些设备的通信。开发者需要了解硬件规格和设备驱动程序等相关知识,并使用适当的库和API来与外部设备进行交互。
实时性要求:很多嵌入式系统需要满足实时性要求,即在特定的时间范围内响应外部事件或产生输出。在编写嵌入式C程序时,需要考虑到实时性要求,例如使用中断、定时器和任务调度等机制来实现对实时事件的响应。
总的来说,相较于传统的桌面应用程序,嵌入式C程序在内存和变量操作以及外部设备交互方面需要更加谨慎和灵活。开发者需要充分了解目标嵌入式系统的特点和要求,并使用相应的技术和方法来开发稳定、高效且可靠的嵌入式应用。
2、为什么51单片机的LED灯点亮比STM32的简单
51单片机和STM32是两种不同的嵌入式系统平台,它们的硬件架构和功能特性有所不同,因此在点亮LED灯上可能存在一些简单程度的差异。
-
硬件架构:51单片机是传统的8位单片机,而STM32是基于ARM Cortex-M处理器的32位微控制器。STM32的硬件架构更加先进,具有更大的内存和更快的处理能力,使得它在处理复杂任务和高速运算方面更具优势。
-
开发环境和软件库支持:STM32平台拥有丰富的开发环境、软件工具和软件库支持,例如Keil MDK和STM32Cube等。这些工具和库提供了丰富的API和示例代码,使得开发者能够更轻松地进行嵌入式应用开发。相比之下,51单片机的开发环境和软件支持相对有限,需要开发者手动编写底层代码。
-
外设和接口的复杂性:STM32平台提供了较多且功能更丰富的外设和接口,如定时器、USART、SPI、I2C等,这些外设和接口的配置和使用可能会相对复杂一些。相比之下,51单片机通常具有较少的外设和接口,因此在点亮LED等简单任务上可能会更加简单直接。
请注意,以上只是一般情况下的观察,并不适用于所有情况。实际上,无论是51单片机还是STM32,都可以用于各种不同的应用场景,并且在不同的方面都有其优势和特点。具体哪个平台更简单或更复杂,取决于具体的应用需求和开发者的经验水平。