使用STM32和C51实现LED闪烁(仿真+程序)

这篇具有很好参考价值的文章主要介绍了使用STM32和C51实现LED闪烁(仿真+程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

51单片机LED闪烁(程序+仿真)

一、keil程序编写

1、新建程序(如下图)

先点击project,在单击new uvision project。
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

2.命名文件

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

3.生成main文件

(右键source group再点击Add new item…)
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
点击c File (.c)

4.在main.c项目中输入以下代码

#include <reg52.h> //包含头文件
sbit led1 = P2^0;


void Delay(int ms)  //延时函数根据变量 ms 可以确定延时多长时间
{
	int i,j;       //定义两个变量
	for(i=0;i<ms;i++)     //for循环语句
		for(j=0;j<110;j++); //延时1ms
}

main()            //主函数
{
	while(1)    //死循环
	{
		led1 = 0;    //点亮P20引脚连接的灯
		Delay(500);  //调用延时函数,延长500毫秒
		led1 = 1;    //熄灭P20引脚连接的灯
		Delay(500);  //调用延时函数,延长500毫秒
	}
}

5.生成 .hex 文件

魔术棒-> Output -> 勾选Create HEX File -> ok

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

二、proteus仿真

1.上传.hex文件到proteus

双击芯片>在program file 中选择刚刚keil生成的.hex文件
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

2.仿真运行

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

完成stm32的通过寄存器方式实现LED闪烁

主要使用工具:proteus、keil5、stm32最小开发板、mcuisp烧录软件

一、原理图的会制

1.打开proteus8.15 -> 新建项目 -> 改名 -> 一直next
鼠标右键 -> 放置 -> 元件 -> From Libraries
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
2.搜索Stm32 -> 选择stm32f103c8
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
提示,各元器件搜索:
主控芯片:stm32
电阻:res
LED灯:led
鼠标右键 -> 放置 -> 元件 -> From Libraries

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

二、keil软件配置

1.新建一个工程模板

这里采用正点原子提供的工程模板
复制工程模板,改名为1.点亮一个LED

2.打开新建的项目

在点亮一个LED > user文件夹 > .uvprojx文件
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

3.程序编写

1)寄存器说明

来自stm32详细参考手册
提取码:4qij
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件GPIOB_ODR地址 = 0x40010C00(GPIOB初始地址) + 0x0C(偏移地址) = 0x40010C0C

2)代码

led.c代码

#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
	//声明一个结构体,名字是GPIO_InitStructure
	GPIO_InitTypeDef GPIO_InitStructure;
	//使能GPIOC的时钟,ENABLE代表使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//GPIOC
	//设置引脚为推挽输出Out_PP
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	//定义引脚为哪一号引脚,GPIO_Pin_13就是13号引脚
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; 
	 //设置引脚的速度50MHz
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	 //初始化GPIO,初始化哪个引脚就对应哪个
	GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIOC,所以引脚对应PC13
	GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13引脚拉高电平
}

led.h代码

#ifndef __LED_H  //头文件的格式
#define __LED_H
	void LED_Init(void); //函数的声明
#endif

main.c代码

#include "stm32f10x.h"
#include  "led.h"  //led的头文件
#include "delay.h"

int main(void)
{ 
	delay_init();
	LED_Init();		
	while(1){  //主循环
		//由原理图,拉低电平-> LED灯亮
		GPIO_ResetBits(GPIOC,GPIO_Pin_13); 
		delay_ms(500);
		//拉高电平-> LED灯灭
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		delay_ms(500);
	}
}

设置生成hex文件(同c51生成hex操作)
魔术棒-> Output -> 勾选Create HEX File -> ok
然后编译之。
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

3)将.hex文件加载进proteus(同上)

仿真情况如下,无报错。单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

4)利用mcuisp将程序烧录到stm32开发板上
使用USB转TTL CH340串口模块来烧写程序

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

第一步:与stm32F103c8t6最小系统开发版连线

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件

第二种模式简易理解就是我们串口下载的所需要的模式
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
stm32–usb to ttl
GND–GND
3.3V–3V3
PA9–RXD
PA10–TXD

第二步:使用mcuisp烧录

单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
1.点击port选择CH340所在端口
2.调整bps为256000
3.读器件信息,建立连接
4.上传.hex文件
5.开始编程
单片机32个led灯交替闪烁程序,stm32,单片机,嵌入式硬件
运行情况与仿真一致。

总结

刚开始使用stm32编译功能还是有点难操作的,相较于51知识更复杂。
问答题:
一:1)嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器—>对应相关管脚)的操作有哪些相同与差别?2)为什么51单片机的LED点灯编程要比STM32的简单?
二:. (理论概念-常见嵌入式岗位面试题) 与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明。

1:在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。由于51单片机结构相对简单,所以通常多使用汇编语言和C语言编程。而STM32系列的开发工作,不会采用汇编语言,因为工程量巨大,寄存器太多了,位数也多。 51单片机的任何器件只需要配置寄存器打开就可以进行编程,而STM32系列单片机则需要先打开对应的时钟,包括开启后打开外部时钟(晶振)才开始工作。 STM32的内部资源(寄存器和外设功能)较普通的51单片机都要多,基本上接近于计算机的CPU了,所以在程序编写上能有更多的选择。
2:register:在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率
volatile: 这个是嵌入式开发必须知道的。用volatile修饰变量或地址,相当于告诉编译器这个值会随时发生变化,每次使用都要去内存中重新读取它的值。如果不用volatile,编译器会有优化操作:在同一进程中当上一次对这个地址操作的值在该进程中没有被修改时候,它会自动把上次读的数据取出来,而不是重新从这个地址取内容。在嵌入式开发中对寄存器或I/O端口的操作都要用volatile。文章来源地址https://www.toymoban.com/news/detail-764054.html

{
	
	......
	
}
 
for(register int i=1;i<=1000000;i++)
{
	
	......
	
}
在第一个 for 循环中,变量 i 存储在内存中,cpu 每次要从内存中取出变量 i,这样 cpu 就要来回读取10000次,只是很低效的。

        而在第二个 for 循环中,cpu每次都会直接去寄存器上读取变量i,而不用再去内存读取,因此,代码的效率也会大大提高。

volatile是防止编译器优化,如果是高频繁的变量编译器会自动将变量放到寄存器中,但是有的变量需要实时更新不能间断,放到寄存器中会隔一段时间再去获取变量,导致变量的值不在准确。
在这里插入代码片


int main()
{
volatile int i = 10;
int a = i;
printf("%d", i);

//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm
{
	mov dword ptr[ebp - 4], 20h
}
int b = i;
printf("i=%d", b);
return 0;


到了这里,关于使用STM32和C51实现LED闪烁(仿真+程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机点亮LED灯以及实现2盏LED灯的交替闪烁

    点亮LED灯,根据单片机原理图 将LED灯1和LED灯2介入单片机的口设为低电平即可 代码如下: #include “reg52.h” sbit led1= P3^7; void main() { led1 = 0;//给led1一个低电平,点亮 } 结果图: 图中有一盏LED灯为我这个51单片机自带的电源接通灯,被代码点亮的只有一盏 实现2盏LED灯的交替闪烁

    2024年02月07日
    浏览(32)
  • STM32F103 点亮LED闪烁与仿真

    今天给大家分享一下STM32 流水灯简单的仿真吧,我感觉这个提供有用的,但是自己也是第一次使用,主要是感觉曲线很高级。在PWM中查看脉宽很有用。 code: led.c #include \\\"led.h\\\" #include \\\"delay.h\\\" /* GPIO的控制寄存器的配置 1、配置输出引脚 2、打开对应的输出的寄存器的时钟 3、配置

    2024年02月16日
    浏览(29)
  • C51单片机——通过使用定时器控制LED闪灭

    目录 0 引言 1 定时的原理 1.1 生活中的定时 1.2单片机中的定时器 2 C语言程序设计 2.1 定时器的内部功能 2.2 设置寄存器 2.3 实验程序 3 有两个小问题(算是延伸吧) 3.1 只能0.05s闪一次吗? 3.2 每次都要在草稿纸手算初始值好麻烦

    2024年02月06日
    浏览(59)
  • STM32/51单片机编程入门(点亮LED)

    目录 一、Proteus电路仿真软件上的C51程序设计及仿真 1.原理图绘制 2.Keil5上的51程序编写 3.仿真 二、安装mdk5软件和stm32包,完成一个stm32的简单程序 1.mdk5软件中编写程序 2.stm32仿真程序调试 三、STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置的一般步骤

    2024年02月02日
    浏览(48)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(46)
  • STM32--实现LED闪烁

    目录 使用的开发板是:奋斗版STM32开发板V2​ 一、参考开发手册 二、GPIO功能描述 三、GPIO寄存器概念 2.3.1 端口配置低寄存器(GPIOx_CRL) (x=A..E) 2.3.3 端口输入数据寄存器(GPIOx_IDR) (x=A..E) 四、开始实现LED灯闪烁

    2024年02月09日
    浏览(28)
  • stm32按键实现LED的闪烁

    首先,需要准备如下硬件设备: STM32F103C8T6单片机开发板 4个LED灯 4个220欧姆电阻 4个按键 接下来,我将讲解如何连接硬件设备。 将4个LED灯连接到STM32单片机的PB0、PB1、PB2、PB3引脚上。 将4个220欧姆电阻连接到PB0、PB1、PB2、PB3引脚上,防止电流过大损坏LED灯。 将4个按键连接到

    2024年02月08日
    浏览(34)
  • 学习笔记|基于Delay实现的LED闪烁|模块化编程|SOS求救灯光|STC32G单片机视频开发教程(冲哥)|第六集(下):实现LED闪烁

    在模块化编程里,函数使用分为如下三步: 返回值 函数名称( 入口参数 ) { 函数要执行的功能 } @返回值:没有返回值就是void @函数名称:避开(IDE中标蓝),不重复,非特殊字符随便取 @入口参数:类型+名称,多个参数“,”分开,空就写void 返回值 函数名称( 入口参

    2024年02月12日
    浏览(38)
  • (STM32基础)STM32实现LED闪烁&LED流水灯&蜂鸣器

    1、按照新建工程步骤创建工程,新建start、library、user三个文件夹,从固件库添加相应文件 2、keilkil小程序用来清理listings和objects文件夹中编译产生的中间文件,以后需要打包工程的话可以先用keilkill先清理,这样文件夹会大大缩小所占内存。 在library中可以查看外设函数库,

    2024年02月07日
    浏览(41)
  • 51单片机——一个独立按键控制LED的闪烁和熄灭

    目录 一、要求 二、实现 三、总结 消除按键的机械抖动         当按下按键,LED灯闪烁,再按下,LED熄灭。。。。循环操作。         编译环境:keil4         单片机:STC89c516RD 消除按键的机械抖动         按键的机械抖动会影响单片机对按键按下次数的判断。消除抖动的

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包