一、使用51单片机编程点亮LED并使用Proteus软件仿真
第一步,先下载所需的proteus和keil软件,并完成相关设置。
然后打开keil新建工程,并完成对相关代码的编译工作
再生成相关的hex文件,由于本人生成hex文件的图片丢失并且工程也已被删除的情况下,这里就不放相关截图了。
然后打开protues并完成电路的设计,点击选择的51芯片把生成的hex文件导入,然后点击界面左下角的运行按钮,运行仿真电路,即可获得如视频所示的效果。
test
二、使用STM32点亮led
一、仿真调试
1、本次实验所选用的芯片为STM32F103RB,先新建一个keil的工程,并选择所要求的芯片,在选择之后完成相关设置,再然后生成相关文件main.c,如图:
然后需要右键点击右侧一栏中的Source Group 1,点击Add Existing Files to Group...并选中main.c文件,也就是把main.c文件添加到Source Group 1下。之后对其进行编译,点击左上角的编译按钮,此时显示0错误0警告标识成功。
2、stm32程序仿真测试。
(1)首先点击上面所说的生成hex文件的魔法棒,选择其中的Debug,勾选Use Simulator再选择ULINK2/ME Cortex Debugger,并点击Settings。(2)然后便可以开始调试了,点击带有红色d的放大镜开始调试,调试结果如下图所示。
二、点亮LED
使用proteus软件完成仿真,并把程序导入芯片中,点亮LED。
此处的程序与上面展示的程序有区别,但我做完仿真之后找不到程序了,就没有放相关图片。
三、嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?
相同点:
- 都需要通过特定的语法和函数来进行操作,例如使用赋值语句修改变量的值,使用特定的寄存器访问函数来操作外部设备。
- 都需要考虑访问权限和数据类型的匹配,确保正确地读写变量或操作外部设备。
- 都需要考虑并发访问的问题,例如使用互斥锁或者信号量来保护共享资源的访问。
差异点:
- 对内存中的变量的修改操作是在CPU和RAM之间进行的,而对外部设备的操作是通过寄存器和相关管脚进行的。
- 对内存中的变量的修改操作通常是直接的,可以随时进行读写操作,而对外部设备的操作通常需要遵循特定的时序和协议,例如设置特定的寄存器位或发送特定的命令序列。
- 对内存中的变量的修改操作通常是瞬时的,而对外部设备的操作可能需要持续的控制和监测,例如控制一个LED的亮灭或者读取一个传感器的数值。
- 对内存中的变量的修改操作通常是软件控制的,而对外部设备的操作可能需要硬件支持,例如使用特定的外设接口或者中断来进行操作。
四、为什么51单片机的LED点灯编程要比STM32的简单?
51单片机的LED点灯编程相对于STM32来说更简单的原因有以下几点:
-
体系结构简单:51单片机采用的是8位体系结构,而STM32则是32位体系结构。8位体系结构相对较简单,指令集较小,编程难度较低。
-
开发环境简单:51单片机的开发环境相对来说更简单,通常使用Keil C51等集成开发环境,编程工具和调试器较为简单易用。而STM32则需要使用较为复杂的开发环境,如Keil MDK或者STM32CubeIDE,需要配置复杂的工程和调试环境。
-
资源限制少:51单片机的资源限制相对较少,一般只有几个KB的RAM和几十KB的Flash存储器。相比之下,STM32拥有更多的资源,包括更大的RAM和Flash存储器,以及更多的外设和功能模块。资源限制少的情况下,编程相对简单,不需要考虑过多的内存管理和资源分配问题。
-
传统广泛应用:51单片机是一种传统的单片机,广泛应用于各种嵌入式系统和电子设备中。因此,关于51单片机的编程资料和案例较为丰富,学习和使用起来相对容易。而STM32是一种相对较新的单片机,尽管也有很多相关资料和案例,但相对来说还不如51单片机那么丰富和成熟。
需要注意的是,虽然51单片机的LED点灯编程相对简单,但STM32拥有更强大的处理能力和更多的功能模块,适用于更复杂的应用场景。所以在选择单片机时,需要根据具体的需求和项目要求来决定使用哪种单片机。
五、与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。
register关键字用于提示编译器将变量存储在CPU的寄存器中,以便快速访问。它是一个建议,编译器可以选择性地将变量存储在寄存器中。这可以提高程序的执行速度,特别是对于频繁访问的变量。
volatile关键字用于告诉编译器,该变量的值可能会被意外的改变,因此在每次访问该变量时都需要从内存中读取。这是因为嵌入式系统中,变量的值可能会被中断处理程序或其他并发操作修改。
下面是使用register和volatile关键字的C代码示例:
#include <stdio.h>
int main()
{ register int x = 10; // 将变量x存储在寄存器中
volatile int y = 20; // 告诉编译器y的值可能会被意外的改变
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0; }
在上面的示例中,变量x被声明为register int类型,这样编译器可以将其存储在寄存器中,以便快速访问。变量y被声明为volatile int类型,这样每次访问y时都会从内存中读取其最新的值,以防止意外的改变。
请注意,register关键字只是一个建议,编译器可以选择忽略它。而volatile关键字则确保每次访问变量时都会从内存中读取最新的值。