从今天起我们来玩玩51单片机。
之前最早玩51单片机用的是非常经典的STC89C52,当时编程用的还是操作寄存器,这样实际上是很麻烦的,因为你不可能记住全部的寄存器,所以一边敲代码还要一边翻手册看寄存器每一位的含义。
如今的STC已经推出了库函数(STC89C52好像还是没有)
我们直接进官网下载即可。
深圳国芯人工智能有限公司-库函数https://www.stcai.com/khs找到自己对应芯片的库函数下载。
我前几天开源了自己设计的STC的板子,上面用了STC32和STC8两个芯片,所以库函数的这个系列我就以这两类芯片为例。
其实STC里的不同芯片之间我们使用库函数编程的话,是大差不差的。
用库函数最大的好处就是编程容易不用再频繁地查看手册和方便移植,所以其实我们只需要学习一种芯片库函数的使用,到时候再用其他芯片是一通百通的。
STC32是32位的8051单片机,STC8是8位的8051单片机。
如果有学弟学妹问我应该如何入门学习,那么我会选择让他们学完基础知识之后直接自己画一块PCB或者用洞洞板焊一个STC8G1K08A-SOP8的核心板,因为STC8的外围电路只需要两个电容就行(甚至不加都行,我在淘宝看到一个STC8G1K08ASOP8的最小核心板,它只是把引脚接到排针上,然后在VCC上接个LED灯,售价14元还不包邮!!!这钱真好赚),自己再买一个USB转串口的模块就可以直接烧录程序了。
反正我们学习51单片机的目的是了解寄存器的用法,现在STC8不仅可以对寄存器编程来控制,学会寄存器的用法之后还可以用官方的库函数来简化我们的编程(虽然库函数底层也还是操作寄存器吧)。
闲话说多了(没看出我在水文章吧),我们来看看环境如何搭建。
我们先下载Keil,到官网下载就行,不用魔法。
Keil Product Downloadshttps://www.keil.com/download/product/
STC8就下载C51,STC32就下载C251。
两个都有就都下载,可以安装在同一个目录下。
比如说我在D盘建一个Keil的目录,那么我安装的路径就可以选择D:/Keil,两个都可以,Keil会自己分配好空间,然后根据我们打开的项目去选择它是运行C51还是C251甚至是MDK,你只管下载就行。
下载完之后还需要激活,至于怎么激活嘛……你们自己一搜就有,我这边不方便说。
破解完之后我们还要下载一下STC的烧录程序。
深圳国芯人工智能有限公司-工具软件https://www.stcai.com/gjrj
下载完之后我们打开选择Keil仿真设置。
选择好对应的型号之后点击添加型号和头文件到Keil中。
我们选择路径就选我们Keil安装目录下的C51或者C251,具体可以参考烧录软件里的提示。
添加的时候记得选关闭Keil。
添加完之后我们就可以在Keil中创建STC32或者STC8的工程了。
接下来我们以STC32为例创建一下工程文件。
选择new一个Project。
路径和工程名填完之后,在选择设备的时候,我们再软件包那一栏选择STC MCU Database。
选择完之后,下面芯片的型号就变了。
有AI和STC,最近STC好像在强推AI系列,不过我们先选STC的。
可以搜索,也可以直接在列表里找,它是按照名字大小排序的。
比如说我选创建STC32的文件(STC8的也是同理)。
创建完之后我们就有了一个空白工程。
我们先在Source Group这个组里创建一个main.c文件,组名可以改,而且文件也不一定要建在组里,在Target1下也可以,Keil里的组看起来像是文件夹,但实际上并不是,仅仅是为了让我们工程里的文件看起来更有条理,同一个组里的文件可能在你电脑上存储的位置相隔十万八千里。
然后我们打开main.c文件,找个空白地右键,添加头文件。
因为我们创建工程的时候选择的是STC32,所以默认添加的头文件也是这个,如果选择的是STC8,那么头文件就会是STC8的,STC8的先别急着添加,因为默认加的是STC8G.h,但是库函数里用的是STC8H.h,都包含的话会造成宏定义冲突。
到目前为止,我们就成功创建好了STC的工程文件,添加完头文件之后,如果我们选择直接自己对寄存器操作,那么就可以开始了。
不过我们要使用库函数的话还需要几个步骤。
我们在一开始的时候就下载好了库函数……了吧?没有的再回到开头点击链接下载,选择自己对应的芯片型号。
下载完之后解压。
我们复制library,粘贴到我们的工程文件夹里。
接下来回到我们的Keil中。
按照下图红框框出来的添加一下头文件目录,把library加进去。
如果是STC8的话那么第二个红框里的就不是C251而是C51。
添加完之后我们新加一个分组。
名字随意,我这边就直接叫library和本地存储的名字一样就行。
接下来比如说我要点个灯,那我就给library这个分组添加进GPIO和Delay这俩.c文件。
添加完之后记得点击OK保存。
那么为什么我不一次性把库文件全部加进去呢?答案是全部编译的话STC8吃不消,太大了,所以我们按需来选择文件添加。
如果我真的需要这么多库文件呢?那我劝你善良,真能用到那么多功能,那还是换个芯片吧。
等到左侧文件栏能看到之后就算成功了。
接下来我们编译。
然后就发现了俩警告。
意思就是俩函数编译了,但是我们没有使用,这样会导致我们空间的浪费,这个其实没关系,警告不影响我们程序的运行。
如果看不顺眼这个警告呢?
那我们设置一下忽略这个警告就行。
按照上图,找到对应位置,把REMOVEUNUSED这个填进去。
如果是STC8的话还需要多一个步骤。
最后一步,我们在下图对应位置找到生成.HEX文件,勾选,这样子编译过后就会给我们生成可以烧录的文件了。
接下来为了验证我们的环境是否搭建完,我们编译下面代码,把程序烧进去。
在烧录的时候记得选择24MHz的频率,STC32和STC8都选24MHz,因为它们内部默认的时钟都是24MHz的。
#include <STC32G.H>
#include "STC32G_Delay.h"
#include "STC32G_GPIO.h"
void main(void){
WTST = 0;
EAXSFR();
CKCON = 0;
P3_MODE_IO_PU(GPIO_Pin_3);
while(1){
P33 = !P33;
delay_ms(500);
}
}
代码什么意思先不用管,后续文件会讲解,我们在P33这个引脚上接个LED,就可以发现LED以一秒为周期进行亮灭(500ms切换一次高低电平)。
如果是STC8的那么我们编译下面的代码。
#include "STC8G_H_GPIO.h"
#include "STC8G_H_Delay.h"
void main(void){
P3_MODE_IO_PU(GPIO_Pin_3);
while(1){
P33 = !P33;
delay_ms(250);
delay_ms(250);
}
}
如果一切正常,那么我们就完成了环境的搭建,后续我还会继续编写库函数的使用。
接下来我们看看官方的例程,其实官方给的例程就在我们下载的库函数里。
我们以STC8的库函数文件为例,因为它是中文的,而STC32是英文的,其实内容是一样的。
官方例程有俩文件夹,一个是独立程序,另一个是综合程序。
综合程序我们先不看,太大了。
我们主要看独立程序。
可以看到基本上把库函数里的函数都用了个遍。
所以我们学习库函数的时候,第一个看的是库函数文档,第二个看的就是官方的例程,这样学习才能事半功倍,因为有些内容实际上库函数文档里没写,还得看官方例程结合着芯片文档来看的。
甚至我们大多数情况下是可以直接把官方例程复制一部分下来改改使用的。
那么今天的内容就到这里了,后续库函数的使用也会马上更新的。