[应用相关] STM32和C51程序编译并基于Proteus仿真

[复制链接]
2273|62
 楼主| 实际测量不符 发表于 2022-4-29 22:32 | 显示全部楼层
5.编写代码(LED闪烁)




  1. #include "stm32f10x.h"  
  2. #include "stm32f10x_gpio.h"
  3. /*

  4.     *由于STM32的GPIO工作模式有8种(输入4种+输出4种)
  5.     *在GPIO输出之前要先对要操作的GPIO进行配置
  6.     知识点:
  7.     一个结构体
  8.                     typedef struct//结构体
  9.                 {
  10.                     uint16_t GPIO_Pin;
  11.                     GPIOSpeed_TypeDef GPIO_Speed;
  12.                     GPIOMode_TypeDef GPIO_Mode;
  13.                 }GPIO_InitTypeDef;
  14.     三个函数:
  15.     1、GPIO_Init(GPIOB,&GPIO_InitTypeDef);
  16.     2、GPIO_ResetBits(GPIOB,GPIO_Pin_5);  这里的意思是给端口5高电平
  17.     3、GPIO_SetBits(GPIOB,GPIO_Pin_5);   把GPIO引脚设置低电平(红LED灯亮)
  18.     */

  19. //驱动程序:GPIO初始化设置
  20. int led_gpio_init_()
  21. {
  22.     GPIO_InitTypeDef GPIO_InitTypeDef;//定义一个结构体变量

  23.     /*使能GPIO的rcc时钟*/
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  25.     /*配置GPIO引脚*/
  26.     GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_0|GPIO_Pin_1;//使用操作符可以一次使用多个引脚,端口0是绿色  1是蓝色    5是红色
  27.     GPIO_InitTypeDef.GPIO_Speed  = GPIO_Speed_50MHz;//设置输出速率50MHz
  28.     GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  29.     /*初始化*/
  30.     GPIO_Init(GPIOB,&GPIO_InitTypeDef);//参数一选择GPIO外设(ABCDE)参数二指向GPIO_InitTypeDef的指针
  31. }

  32. //延时函数
  33. void delay()
  34. {
  35. int i = 10000000;
  36.     while(i--);
  37. }

  38. //主函数
  39. int main(void)
  40. {
  41.     led_gpio_init_();//调用GIPO初始化函数

  42.     /*循环给高低电平实现闪烁*/
  43.     while(1)
  44.     {
  45.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  46.         delay();
  47.         GPIO_SetBits(GPIOB,GPIO_Pin_5);
  48.         delay();

  49.         GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  50.         delay();
  51.         GPIO_SetBits(GPIOB,GPIO_Pin_0);
  52.         delay();

  53.         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
  54.         delay();
  55.         GPIO_SetBits(GPIOB,GPIO_Pin_1);
  56.         delay();
  57.     }
  58. }
 楼主| 实际测量不符 发表于 2022-4-29 22:33 | 显示全部楼层
6.代码讲解

对GPIO的配置是通过各种函数实现的, 这点和51有所不同,51是直接操作寄存器,其实库函数的本质还是操作寄存器,只不过官方将它封装成了各种函数,来方便操作寄存器,毕竟STM32的寄存器要比51多很多,要记住每个寄存器的名称是不容易的,而通过各个函数就可以简单的操作各个寄存器了,在MDK开发环境中可以通过右键Go to definition of 'xxx’来查看各个函数是如何操作寄存器的。
 楼主| 实际测量不符 发表于 2022-4-29 22:34 | 显示全部楼层
 楼主| 实际测量不符 发表于 2022-4-29 22:34 | 显示全部楼层
从初始化配置时,要先使能GPIO的时钟,指定引脚,设定输出速率和工作模式,这些是必不可少的。
 楼主| 实际测量不符 发表于 2022-4-29 22:35 | 显示全部楼层
此处放几张截图,来自STM32f10固件库使用手册中文版手册,有很大帮助。
97803626bf798089f4.png
 楼主| 实际测量不符 发表于 2022-4-29 22:35 | 显示全部楼层
 楼主| 实际测量不符 发表于 2022-4-29 22:36 | 显示全部楼层
 楼主| 实际测量不符 发表于 2022-4-29 22:36 | 显示全部楼层
7.编译成功
74436626bf7f3c7df2.png
 楼主| 实际测量不符 发表于 2022-4-29 22:37 | 显示全部楼层
8.调试
13115626bf814f14bc.png
 楼主| 实际测量不符 发表于 2022-4-29 22:38 | 显示全部楼层
三、安装并熟悉Proteus 电路仿真软件
1.安装及遇到的问题

文件来自老师分享,不便提供,安装过程不做赘述。当安装完毕后,建立工程,然后准备进入元器件库,出现了一个棘手的问题,提示找不到元器件库。
 楼主| 实际测量不符 发表于 2022-4-29 22:38 | 显示全部楼层
 楼主| 实际测量不符 发表于 2022-4-29 22:39 | 显示全部楼层
解决办法是,右键Proteus 8 Professional文件夹,选择属性,按照图示,勾选允许完全控制、修改,点击应用。\

56534626bf8a6c8558.png
 楼主| 实际测量不符 发表于 2022-4-29 22:40 | 显示全部楼层
问题解决。
71378626bf8bc050b3.png
 楼主| 实际测量不符 发表于 2022-4-29 22:41 | 显示全部楼层
2.配置电源线

82965626bf8db8a0c2.png

design–power rial configuration–更改name为GND–分别添加VDDA、VSSA
 楼主| 实际测量不符 发表于 2022-4-29 22:42 | 显示全部楼层
3.连接组件
27241626bf933e923c.png
连线如图所示
 楼主| 实际测量不符 发表于 2022-4-29 22:42 | 显示全部楼层
4.开始仿真

27489626bf94cec568.png
56100626bf9536bc53.png
可以看到出现高低电平,但是灯没有亮,猜测是电阻值的问题,目前没有得到解决,但是可以得知仿真成功。
 楼主| 实际测量不符 发表于 2022-4-29 22:43 | 显示全部楼层
四、C51程序的设计和仿真
1.keil c51的安装

我在网上找到一个c51的安装包,打开安装程序后,生成的安装目录跟MDK5所在目录一样

74709626bf9893d7b0.png

然后出现了一个C51文件夹,这里我不是很懂,是否是keil c51与mdk5共存了,后续我也没遇到问题,但是看网上教程没有这么简单啊,有点迷惑,但是也算搭建成功了。

 楼主| 实际测量不符 发表于 2022-4-29 22:44 | 显示全部楼层
2.建立c51工程–实现led流水灯效果

前面选择芯片那些步骤之前都做过,这里选择了AT89C51,然后添加启动文件,新建main文件,这里不做截图一一展示了,最终创建的界面如下。

77379626bf9c758861.png
 楼主| 实际测量不符 发表于 2022-4-29 22:45 | 显示全部楼层
3.写入代码
  1. #include <reg51.h>
  2. void delay(void)
  3. {
  4. unsigned char i ,j;
  5. for(i=0;i<250;i++)
  6. for(j=0;j<250;j++);
  7. }
  8. void main(void)
  9. {
  10. while(1)
  11. {
  12.    P0=0xfe;
  13.   delay();
  14.   P0=0xfd;
  15.   delay();
  16.   P0=0xfb;
  17.   delay();
  18.   P0=0xf7;
  19.   delay();
  20.   P0=0xef;
  21.   delay();
  22.   P0=0xdf;
  23.   delay();
  24.   P0=0xbf;
  25.   delay();
  26.   P0=0x7f;
  27.   delay();
  28. }
  29. }
 楼主| 实际测量不符 发表于 2022-4-29 22:46 | 显示全部楼层
4.生成hex文件
89911626bfa3888a83.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部