\插曲:文末有惊喜~///
P1=0xfe;//P1=11111110B,即P1.0输出低电平}
分析:通过这几行代码,可以使51单片机的P1.0引脚输出低电平。 首先,代码#include>是一个头文件,包含51单片机的寄存器定义。 51单片机是统一的寄存器和IO。 寻址,所以如果向相应的寄存器写入1,则相应引脚上会输出高电平,如果写入0,则会输出低电平。 我们知道51共有32个引脚用作IO端,所以只有4个A寄存器(一个寄存器是8位,具体取决于数据总线)。 如果打开头文件,你会发现地址P0和0X80是绑定的,所以编程的本质就是往内存中写入值,而由于单片机是数字设备,所以只能读取二进制,为什么是二进制? 由于0对应低电平0V,1对应高电平5V,就足够了。 没有第三个明确的状态。 注意粗体部分并仔细欣赏。 微控制器是控制器件而不是驱动器件。 由于输出电流很小,不足以驱动一些需要大电流的外设。
//例2:使用单片机控制灯的闪烁:了解单片机的工作频率
#include//包含微控制器寄存器的头文件
/************************************************
功能:延迟一定时间
**********************************************/
void delay(void)//两个void表示不需要返回值,也不传递参数。
unsigned int i;//定义无符号整数,最大取值范围为65535
for(i=0;i/ 执行 20,000 个空循环
;//什么都不做,等待一个机器周期
/******************************************************** ***** *****
Function函数:main函数(C语言规定必须有且只能有一个main函数)
****************************************************** * ******/
无效主(无效)
while(1)//无限循环
P1=0xfe; //P1=11111110B,P1.0输出低电平
延迟(); //延迟一段时间
P1=0xff; //P1=11111111B,P1.0输出高电平
延迟(); //延迟一段时间
分析:写程序是一个自下而上的过程,而读程序是一个自上而下的过程,所以写程序和读程序的过程是不同的。 从头开始编写程序时,我通常需要先构思它,然后一步步执行。 当然,我更喜欢修改代码来达到目的,所以提前准备好典型例子可以大大提高编程效率。 阅读代码是很常见的事情。 准备典型案例时,一定要了解。 毕竟理解是修改的前提。 事实证明,有些代码很难读,你永远也写不出来。 因此,你必须在不适当的时间阅读它们。 选择使用你的主观能动性是无知的表现。 你花一个月的时间也许达不到写代码的人的水平,但我明白,做修改也用不了多久。 在剩下的时间里,我分析了大量的案例,51个功能也得到了进一步的掌握。 这不是很棒吗? 不是我们不提倡创意,而是我们不提倡闭门造车。 创造力应该用在人类没有突破的地方。 只有更多的人达到这个阶段,才会有更多的希望。 每个人的人生经历都不同,所以每个人都有可能。 别人做不到,并不代表你也做不到。 他可能缺乏一点必要的经验,但只要有更多的可能性,就总会有人成功。 进步。
阅读程序时,可以直接看main函数,然后在外面寻找未定义的函数和变量。 其实编程也可以这样做,先制定计划再找人。 这段代码没什么好说的,还是在玩弄引脚。 在我的上一篇文章中,我说过编程就像做饭。 如果你还没有看过,可以先看一下。 这里的头文件是蔬菜库,4个IO口只占其中的4个。
//例3:分别发送P1口状态到P0、P2、P3口:了解I/O口引脚功能
#include//包含微控制器寄存器的头文件
/******************************************************** ***** *****
Function函数:main函数(C语言规定必须有且只能有一个main函数)
****************************************************** * ******/
无效主(无效)
while(1)//无限循环
P1=0xff; //P1=11111111B,关闭LED
P0=P1;//将P1口的状态发送到P0口
P2=P1;//将P1端口的状态发送到P2端口
P3=P1;//将P1口的状态发送到P3口
分析:只要没有代码改变内存值就会一直保留。 有关波特酒的四道菜全都在这里了。 当然IO口可以输入、写入,也可以输出。
//例4:使用P3口流量点亮8位LED
#include //包含微控制器寄存器的头文件
/************************************************
功能:延迟一定时间
**********************************************/
无效延迟(无效)
无符号字符 i,j;
对于(i=0;i
对于(j=0;j
/******************************************************** ***** *****
功能功能:主要功能
****************************************************** * ******/
无效主(无效)
同时(1)
P3=0xfe;//第一个灯亮
delay();//调用延迟函数
P3=0xfd;//第二个灯亮
delay();//调用延迟函数
P3=0xfb;//第三个灯亮
delay();//调用延迟函数
P3=0xf7;//第四个灯亮
delay();//调用延迟函数
P3=0xef;//第五个灯亮
delay();//调用延迟函数
P3=0xdf;//第六个灯亮
delay();//调用延迟函数
P3=0xbf;//第七个灯亮
delay();//调用延迟函数
P3=0x7f;//第八个灯亮
delay();//调用延迟函数
分析:只要注意二进制和十六进制的转换即可。 另外,这里的例子不影响操作。 别着急,下面还会有更多。
//例5:通过P3口地址的操作流水线点亮8位LED
#include //包含微控制器寄存器的头文件
sfr x=0xb0; //P3口在内存中的地址为b0H,8051内核单片机可以通过sfr来定义
//所有内部8位特殊功能寄存器,对地址x的操作也是对P1口的操作
/********************************************
功能:延迟一定时间
******************************************/
无效延迟(无效)
无符号字符 i,j;
对于(i=0;i
对于(j=0;j
; //使用循环等待几个机器周期,从而延迟一段时间
/********************************************
功能功能:主要功能
**********************************************/
无效主(无效)
同时(1)
x=0xfe; //第一个灯亮
延迟(); //调用延迟函数
x=0xfd; //第二个灯亮
延迟(); //调用延迟函数
x=0xfb; //第三个灯亮
延迟(); //调用延迟函数
x=0xf7; //第四个灯亮
延迟(); //调用延迟函数
x=0xef; //第五个灯亮
延迟(); //调用延迟函数
x=0xdf; //第六个灯亮
延迟(); //调用延迟函数
x=0xbf; //第七个灯亮
延迟(); //调用延迟函数
x=0x7f; //第八个灯亮
延迟(); //调用延迟函数
分析:sfr也可以在头文件之外使用。 虽然意义不大,但是你又学会了一个操作不是吗? 这里不需要包含头文件。
//例6:使用不同的数据类型来控制灯的闪烁时长
如何使用KEIL下载HEX文件?
熟悉KEIL的人都知道,KEIL在下载时使用的是axf格式的文件,其中不仅包含代码指令信息,还包含调试信息。 如果C代码和汇编代码的对应关系(这些信息不会下载到单片机,否则单片机可能无法安装,哈哈),地址信息等。
事实上,KEIL也可以下载HEX文件并将数据保存为HEX文件。
很多道友可能会问,既然有axf文件,为什么还需要学习如何下载HEX文件呢? 我们知道,出于保密或其他原因,本公司不会为您编译和下载源代码。 另一种可能性是微控制器有两个程序。 BOOT_LOADER程序可能是别人编写和维护的,只会给你HEX文件。 如果你掌握了KEIL的下载方法,那么你就不需要再去找其他工具来下载了,方便快捷(还有一种情况,代码是使用GCC编译的,文件格式是elf)。
因此,掌握KEIL下载HEX文件的方法还是很重要的。
那么今天Osprey就教大家如何使用KEIL下载HEX文件到单片机中。
首先复制一个STM32工程模板(如果没有,到Osprey公众号后台回复关键词获取)。
滚动浏览项目,查看是否选中了 HEX 文件生成功能:
勾选这个只是为了让项目生成一个HEX文件,方便我们测试。 在实际的 HEX 文件下载过程中无需检查这一点。
你会发现最终生成的文件的文件名和axf文件名一样,只是后缀不同,变成了hex:
所以可以在工程目录下搜索rtthread-stm32.hex文件。 为了更好的解释,Osprey将文件名改为rtthread.hex,这样大家就不会认为我们接下来下载的是axf文件。 。
下面是下载HEX文件最关键的两点:
最后,选择合适的调试器并配置下载axf文件的相关参数(即可以使用调试器正常下载axf文件)。
最后点击下载按钮即可完成下载。
是不是很简单呢?
如果经常需要下载hex文件,每次都要新建一个工程,翻转工程,然后修改参数,相当麻烦。 为了方便,我们可以在常用的项目中添加一个下载目标,即多目标项目,类似这样:
这样,只要提前设定好设置,切换目的,就可以快速完成下载,方便快捷。
什么,您还不知道如何建立一个多用途项目? 看这里:
《STM32工程模板构建的Simu目的》
《STM32工程模板构建的RAM用途》
好啦,Osprey就讲一下如何保存FLASH或者RAM数据。
有时,FLASH或RAM保存大量参数或代码。 如果通过串口助手等工具打印出来保存比较麻烦。 其实KEIL有一个命令可以帮助你快速将一段数据保存为HEX文件。 如果 Osprey 想要保存,从地址 0x0800 0000 开始,大小为 0xC00 的数据,只需在 KEIL 命令行输入以下命令即可保存。 方便快捷。 你应得的:
当然,你也可以在命令后添加以下参数(该参数后面加一个逗号)来实现不同的访问方式。 是不是很贴心呢?
如果命令执行正确(上图表示命令执行正确,不正确会报错),应该可以在项目目录下找到你需要的data.hex文件,然后使用HEX文件查看工具轻松查看,不再需要串口打印!
彩蛋:最近有同学向我要单片机的资料。 我花了几个月的时间总结了我10年的产品开发经验。 资料包几乎涵盖了C语言、微控制器、模拟和数字电子、原理图和PCB设计。 单片机等高级编程,非常适合初学者入门和进阶。 另外,我会在盒子底部泪流满面地分享我整理的22个热门开源项目,包括源码+原理图+PCB+文档。 它们不是市场上那种打包出售的课程。 我觉得教程太多不一定是好事。 10年前我自学速度很快,除了自己的执行能力之外,教程也很少。 不要羞于向聚会伸出援手,一个小红点正在等着你。 后期我也会组建一些纯粹技术交流的小圈子,让大家可以认识更多的大佬。 有了好的圈子,你对行业的了解一定是走在前列的。