学习51单片机与STM32程序设计,实现LED灯点亮

51单片机和STM32程序设计与仿真(点亮LED灯)

  • 1.Proteus使用教程并仿真51程序——LED流水灯
  • 1.1安装Proteus仿真软件
  • 1.2创建一个51单片机的仿真模拟工程
  • 1.3 编写程序
  • 1.4 开始仿真
  • 2.使用keil5 MDK 通过寄存器方式点亮STM32LED灯
  • 2.1 安装keil5 MDK
  • 2.2 创建一个stm32工程并开始编码
  • 2.3查找手册配置寄存器
  • 2.4编译烧录代码并查看结果
  • 3.嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?
  • 4.为什么51单片机的LED点灯编程要比STM32的简单?
  • 1.Proteus使用教程并仿真51程序——LED流水灯

    1.1安装Proteus仿真软件

    (1)将下载后的安装包解压缩,打开 Proteus 8.9 SP2 Pro 应用程序。

    (2)这里选择合适的安装路经进行安装,点击Next

    (3)点击Next > 进行安装

    这样就安装完成了


    汉化完成后打开软件

    1.2创建一个51单片机的仿真模拟工程

    1)有两个方法可以新建工程,如下图所示。

    2)自定义工程名、保存路径,勾选 New Project ,再点击 Next 。

    (3)创建原理图(如果不需要创建原理图,可以勾选 Do not create a schematic),然后默认选择 DEFAULT ,再点击 Next

    (4)创建 PCB(如果不需要创建PCB,可以勾选Do not create a PCB layout),默认选择 DEFAULT ,再点击 Next
    (4)连续点击 下一步


    (5)勾选 创建固建项目 ,选择芯片 AT89C51 ,再点击 下一步。
    (6)点击 完成 ,工程创建完毕。

    工程创建完成之后,在固件库搜索AT89C51 芯片放置于原理图中
    接下来我们放置LED灯,在右侧的固件库中搜索 LED-YELLOW,点击选中LED灯,顺时针旋转元件,将8个LED灯摆放成如下图的模样,放置电阻,将电阻值从10k改为300,以便等可以亮起来,接下来链接管脚,电源

    一个51单片机的流水灯原理图就创建好了

    1.3 编写程序

    (1)编写51程序需要使用到Keil C51来编写程序,需要先下载Keil软件,有关Keil软件下载,请参考:https://blog.csdn.net/ssj925319/article/details/108919862
    下载完Keil软件后,需要添加C51的pack,下载链接如下:
    链接:https://pan.baidu.com/s/1eu03YgLM83IJ2d5FrRheOA
    提取码:eela
    下载完成后,解压缩,并点击安装,安装完成后,Keil 软件就自动添加了 C51 的pack。

    (2)接下来我们打开keil软件,创建一个新的工程

    选择合适的文件夹存放工程文件


    进入下面界面,下拉选择第二个
    接下来在搜索框中输入搜索选中AT89C51芯片
    点击ok,完成工程的创建
    接下来我们新建一个main.c文件
    复制以下代码

    
    ```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文件(一定要加.c后缀,不然就不是C文件了),再点击保存。

    接下来生成.hex文件
    点击魔术棒,勾选Create HEX file 选项

    点击Group1选择添加新项目,将我们刚刚编写的main.c文件导入


    接下来点击编译,main.c文件下自动生成两个文件

    1.4 开始仿真

    (1)回到Proteus软件的原理图内,双击 AT89C51 芯片后,在弹出的窗口的 Program File 一栏从刚才 keil 软件编译后的路径中添加 .hex 文件,再点击 OK 。

    2.使用keil5 MDK 通过寄存器方式点亮STM32LED灯

    2.1 安装keil5 MDK

    一,下载安装包
    上KEIL官网下载,如下图点击“Downloads”即可;
    二、打开安装包
    打开资源包的“mdk528a.exe”,开始安装;

    三,下载过程

        按图的顺序一步一步往下点击,点击"Next";
    




    取消勾选"Show Release Notes.“,点击"Finish”;

    直接关闭所有窗口

    进行在线安装各种pack

    2.2 创建一个stm32工程并开始编码

    1、新建工程
    (1)打开 Keil uVision5 ,并新建一个工程。

    (2)在左侧的窗口内选择STM32芯片,这里我们选择STM32F103RB,并保存。

    (3)勾选相应的选项,并点击OK,这样工程创建完毕。

    工程创建完成之后进入以下界面

    2.3查找手册配置寄存器

    接下来我们需要去stm32的手册查找寄存器的地址等信息

    我们可以看到,要点亮PC13口的LED灯,我们需要配置总线AHB的使能时钟
    要配置AHB的时钟,我们需要找到AHB的起始地址
    左边是起始地址,右边是终止地址
    然后我们找APB2外设使能时钟寄存器的偏移地址,复制偏移地址,加上面AHB的寄存器时钟地址,得到0x40021018,这个地址,然后我们配置CPIOC的使能时钟,先把刚才的地址置“1”后进行位操作(移动4位),就可以得到时钟C的地址,然后我们通过强制转化将其转化为指针类型,在进行取地址的操作

    接下来和上面一样,我们找到GPIOC13口的起始地址

    接下来我们配置GPIOC13口
    因为我们配置的是GPIOC13口是高配置,查找手册

    所以要选择GPIOP以10MHz推免输出,即0x0010,再位操作20位,及以下代码

    (unsigned int *) 0x40011004 I= 0x0l << 20 ;
    

    接下来我们配置GPIOC13的低电平
    查找手册

    通过上述手册我们可以看到偏移地址是0ch,即端口输出数据寄存器地址为 0x4001 1000+0ch=0x4001 100c
    得到以上信息我们可以得到如下代码

    (unsigned int *) 0x4001100c &=~ (0x0l < <13);
    

    2.4编译烧录代码并查看结果

    查找完我们需要的信息之后我们可以得到如下三行代码

    因为没有接入硬件设施,所以只能先进行程序的编译和仿真测试,而没有办法下载到硬件上运行,这个LED灯闪烁的代码不用深入了解,因为我也是初学者慢慢学习的路上

    3.嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?

    嵌入式C程序代码对内存(RAM)中的各变量的修改操作和对外部设备(寄存器)的操作有以下几个相同点和不同点:

    相同点:

    1.都需要通过代码进行控制:在C语言中,无论是修改内存中的变量还是操作外部设备,都需要通过相应的代码来完成。

    不同点:

    1.操作对象不同:内存中的变量是抽象的数据,而外部设备是物理硬件组件。

    2.数据处理方式不同:内存中的变量操作主要通过读写数据来进行,而外部设备的操作可能需要考虑更多的细节。

    3.访问速度不同:内存的访问速度通常比外部设备要快得多。对内存中的变量进行读写操作可以在微秒级别完成,而对外部设备的操作可能需要毫秒甚至秒级别的时间。

    4.错误处理方式不同:当内存中的变量出现错误时,通常可以通过异常处理或者错误码等方式进行处理。而外部设备操作如果出现错误,可能需要通过硬件复位、断电等方式进行处理。

    在实际的嵌入式开发中,需要根据具体的需求和硬件环境来选择合适的操作方式。

    4.为什么51单片机的LED点灯编程要比STM32的简单?

    51单片机的LED点灯编程相对于STM32来说更简单,主要有以下几个原因:

    1.硬件差异:51单片机和STM32具有不同的硬件结构和接口,STM32具有更多的外设和接口,因此编程时需要考虑更多的细节和特性和差异。
    2.软件差异:51单片机通常使用汇编语言或C语言进行编程,而STM32则支持更多的编程语言,例如C、C++和Python等。不同的编程语言具有不同的语法和特性,因此需要根据具体情况选择合适的编程语言。
    3.开发环境差异:51单片机和STM32的开发环境也有所不同。STM32的开发环境通常更加复杂,需要更多的设置和配置,而51单片机的开发环境则相对简单。
    4.程序设计差异:由于51单片机的硬件结构相对简单,因此程序设计相对简单,而STM32的硬件结构复杂,程序设计需要更多的考虑和技巧。

    总之,51单片机的LED点灯编程相对于STM32来说更简单,主要是因为其硬件和软件相对简单,开发环境也更加友好。

    作者:Chen纳尔

    物联沃分享整理
    物联沃-IOTWORD物联网 » 学习51单片机与STM32程序设计,实现LED灯点亮

    发表回复