数码之家

 找回密码
 立即注册
搜索
查看: 1038|回复: 9

[C51] 学习使用STC15系列库函数和模块化编程,废话小记。

[复制链接]
发表于 2023-9-8 16:20:46 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学习使用STC15系列库函数和模块化编程,废话小记。
书接上回,废话开始,说是无聊手痒,没咋可拆,有些同类型的玩意,拆多了更显的没意思,瞎搞一通,学习下官方STC15系列的库函数和例程以及模块化编程,记录一下,以便查阅。
①,delay库文件,dalay_ms函数,参数是unsigned char型最大256,如需要更大数,需改为unsigned int。
②,config库文件,内有时钟晶振的宏定义,选用什么样时钟需在这里更改,把其他的//注释掉,编译输出HEX文件时也要改,使用内部时钟时下载时也要在STC-ISP上修改相关选项,3者要统一。另外此处还#include了STC15Fxxxx的头文件,使用时必须先#include "config.h"下,在库函数使用参考文档开头有明确说明。(当然了如果没用到时钟的,大可直接include下STC的头文件便可,但是何必呢,几乎所有库函数都与时钟有关,干活还是要严谨点好)。
2.1,STC头文件里主要是所有特殊寄存器地址的定义和位定义,还宏定义了一些别名,如u8,u16无符号型,引脚名P10这种,中断号别名,enabled/disable,true/false,位的取值等等。另外此处还#include <intrins.h>,宏定义了调用多次空函数的别名,如NOP10()或NOP(10)表示调用10次空函数。
2.2,STC头文件里的有一些宏定义,在不想使用对应的库函数情况下可以直接调用就完成赋值了,例如它定义的这条#define                Timer0_16bitAutoReload()         TMOD &= ~0x03        ,那么在定时器0初始化时直接调用Timer0_16bitAutoReload();就完成了定时器0的16位自动重装模式的配置,可以看出这类种类型的定义有个明显的特征就是后面都是带括号的。
2.3,习惯上都会先把dalay,config,STC15Fxxxx的.c.h文件放在工程里 。
③,GPIO库文件,开始以为一个结构体里只能配置任意一组P口中的任意几个引脚("|"操作)或者全部GPIO_Pin_All为哪种模式。又回到上前几回书说到的玄学问题,真实就只是与PWM相关的引脚复位后默认的值不是双向IO模式,例如我要p1^0,p1^1为高阻模式来做ADC用,又要p1^6,p1^7(外部晶振脚,或pwm相关脚)为准双向IO模式,就不能在一个初始化函数里完成,只能写2个函数。当然不同组的P口,也还是要对应写另一个函数。例如下图,
IMG_20230901_202000.jpg
后来翻翻其他例程,发现其实原来并不是这样,在这个结构体里是可以多次赋值,以实现不同引脚模式的配置的。例如下
  1. void GPIO_config()
  2. {
  3.    GPIO_InitTypeDef GPIO_InitStructure;   
  4.    GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7;
  5.    GPIO_InitStructure.Mode = GPIO_PullUp;   
  6.    GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);     

  7.    GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1;
  8.    GPIO_InitStructure.Mode = GPIO_HighZ;   
  9.    GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);
  10. }
复制代码

有时想想,以其写那么一堆,还不如直接P1M0,P1M1直接赋值来得快,再转头一想,如果是大工程从可读性和可移植性,多方合作的似乎还是有一定的必要,自己耍的话那还不是爱什么来就什么来,没有筷子还能不会吃饭了。
④,time库文件,初始化配置函数是带有返回值的,可根据具体情况通过这个返回值来判断定时器设置完成等一些其他操作。此库仅限使用time0,1,2,配置完成后返回0,空操作返回1,错误返回2。
4.1,内有定时中断函数,自己按需求写,time2中断函数有个P10脚取反的(应该是模拟时钟输出的,time2初值化配置也不同)
4.2,关于初值的计算,可直接用公式或外挂软件小工具等。例如官方:1ms-1T-16bit重装-计数模式:
初值=65536UL-Main_FOSC/1000UL,12T的话就是12分频,就是晶振多除个/12,一样的公式.由于Main_FOSC定义是长整型,加UL使用时要统一。这有关系统时钟周期,机器周期,指令周期的相关概念此处就不废话了。
另外在"STC15Fxxxx.H"也有多个关于初值的宏定义,看情况可调用。如Timer0_Load_us(n)调用就完成TH0,TL0的取值,n为参数。
⑤,SPI库文件,官方并没有把这个库跟其他的库统一放在一起,但是在库函数例程文件夹里有使用例子,看看研究半天,没太明白TxBuffer[ ],RxBuffer[ ],数据
缓冲区之间的程序流程,更何况给的例子是2个mcu之间和pc间传送又串口回传给PC输出显示。本次只是用于LCD12864,于是干脆干掉这些参数,只用它初值化结构体,再重写发送数据函数。
5.1,参数相关略过,前几回书已废过。有人建议用SPI中断,看了网上别的程序,是在中断函数里,清除标志,Bit SPI_FLAG取值,拉高CS脚,再在发送数据函数里用while判断SPI_FLAG值,那这样看起来什么感觉还是和查询法一样呢??前后我尝试修改过几次没成功,只好保留查询法。
⑥,自建lcd12864库文件,ST7565驱动,本次只是把前几回书的程序,独立出来形成.c.h罢了,并简单整合修改把数字显示不同大小修改为可选参数输入模式。
⑦,自建charcode.h字库头文件,在lcd12864.c中include,要显示函数来配合使用,取模数组内的数据的位置如果改变会直接影响到显示的不同。取模方式:列行式,倒序。
⑧,ADC库文件,官方ADC取值用的也是查询法,函数原型:u16        Get_ADC10bitResult(u8 channel),通过参数选择不同ADC脚。且官方给出的单独控制ADC电源控制位的函数,这就很方便取样后,调用开关。(官方初始化结构体有个注释感觉是错别字,我的个强迫症了,我怕你估计是洋文硬翻译过来的吧)
Screenshot_20230906_203806.jpg
8.1,关于ADC转为真实电压值,计算方法,STC技术手册中已经很清楚了。ADC=2^n乘Vin/Vcc
⑨,自建timeadcshow库文件:时钟参数计算ADC计算并显示库,没咋可记,仅一些分,时,天,月,年计算,与显示位置选择罢了。
9.1,关于ADC转换电压,取小数点后几位如何处理显示,此处参考网上此帖,
关于单片机AD或者测量时候,小数的计算和表示方法。
改改,拿来就用
Screenshot_20230906_205200.jpg
⑩,自建ntc库文件:NTC查表法并显示温度值,记录下折腾过程。
10.1,网上的ntc手册中的有阻值温度对应表,但是想要扣出其中的数据,发觉真有点废劲,有些是pdf格式有些是图片格式的,又有马赛克的,加上对于office办公软件也不什么懂的太难了,找了半天,复制粘贴出来的数据排列不是想要结果,后来想到可以放到网上用正则匹配出来,得亏学过一点正则表达式,再后来也找到了复制方便的了,最后放到Excel里,来计算处理,不说了,Excel里几个简单操作几乎是查找一次操作一次。就这水平,还敢在提能熟练使用办公软件呢。(不知各位有咋好办法从网页上扣出这种一列数据的办法?)
10.2,期间尝试过用一些网上的小软件,和复制别人程序的数据,要么不什么好用,要么不什么对应,误差有点大,也是真不太敢乱下度娘出来的网页推荐软件,稍微不谨慎,各种全家桶分分给你安排上。
10.3,初次接触学会使用二分法查询。
10,4,ADC分辨率和NTC串联分压电阻的大小界定了温度大小范围。
NTC阻值温度电压ADC对应表:
IMG_20230907_215916.jpg
NTC阻值温度ADC表.zip (51.75 KB, 下载次数: 0)
本回最终成果:
IMG_20230907_221945.jpg
本回用的所有.c.h文件,有喜欢的请自建工程自行编译自行研究。
test0906.zip (27.24 KB, 下载次数: 0)
这回就先耍到这了,本回负温度显示还没处理,下把有空再来耍按键菜单的处理,精度调节,IAP,EPROM,PWM,串口,电压电流表这些之类的,亦或移植到15W408AS上,8K和56K的毕竟还是差太多。期间遇到不少问题编译报错等都最终解决了,新手上路往往容易多处包含头文件多处声明定义等编译时多重定义报错等等,研究学习半天,其他排错就不说了,有次在一个在显示上的错误,坑了我很久,总得来说这都是因果关系,要学会通过结果现象找到程序问题出在哪个点上才能快速解决,下载次数也是从200多干到600多。
注意在同工程不同文件夹(不同组)时,需要把include路径添加下,要不然编译会报找不到头文件。
IMG_20230908_160836.jpg
本回收获颇多,了解结构体的用法,以及指针地址等相关的一些知识,以及移位运算的神奇之用,还有取反,与赋值等等,其次还是对exturn,struct的相关含义有些模糊不清。
扩展阅读,放2链接,
1,extern 用法,全局变量与头文件(重复定义)
2,MDK 的编译过程及文件类型全解
第二条链接,100多万的阅读可见还是很多人查询的
Screenshot_20230906_213117.jpg
一般人不研究的话有些文件用不上,看着还挺讨厌的,网上有个专门删除的批处理文件,同理只要设置在编译输出的几个选项X掉也干净了好多。如下图,list清单全X掉,输出只选HEX。
IMG_20230907_204200.jpg IMG_20230907_204226.jpg
坐在电脑前是真废火因草,时不时总想喷云吐雾,所以有时习惯把程序复制到手机上来研究,而一些库程序和网上的程序用的是中文简体编码,在手机上常常是乱码,所以还是习惯用默认utf-8写程序,找找有个小巧的转码的软件也挺好用,可以整个文件夹的转。编码转化软件:
IMG_20230907_221432.jpg UltraCodingSwitch.zip (466.11 KB, 下载次数: 0)
不久前在嘉立创上撸的板一直没空来看,今日一搞,才发现几处错误,把AS1117的背面上输出脚当成GND了,LCD屏排线线序左右搞反了且有条GND没连上,按键之间距离与外壳有差,也没几条线,当初画pcb的咋那么粗心呢,飞上线将就下也能用。顺带下了开源广场的万能点屏板,也是看都没看直接撸的,到手,再查电路图,发现主控脚与手里15W408AS有点点差别,用是可以用,但开始主要只是想用下它屏排线的接口焊点接口而已,没有什么是不可以原谅的,大姑娘,头一回,也算走下流程熟悉下立创EDA的各功能,良心企业呀!
IMG_20230907_165932.jpg IMG_20230907_170046.jpg
就这样,收工,谢谢观看。

打赏

参与人数 1家元 +30 收起 理由
jf201006 + 30 謝謝分享

查看全部打赏

发表于 2023-9-8 16:42:57 | 显示全部楼层
哇,又会画板,又懂编程,你就是我心目中的大神
回复 支持 反对

使用道具 举报

发表于 2023-9-8 20:09:38 | 显示全部楼层
谢谢楼主的技术分享,有空也试用一下STC的STC15系列库函数。
我一般也是自己写代码,从来没有用过STC的库函数,因为觉得库函数更复杂。
不过使用库函数是发展的趋势,就像STM32一样,使用库函数方便快捷。
回复 支持 反对

使用道具 举报

发表于 2023-9-9 09:36:14 | 显示全部楼层

现在STC的库函数在下载软件上就可以直接下载:
1694223321723.jpg

回复 支持 反对

使用道具 举报

发表于 2023-9-9 11:02:29 | 显示全部楼层
gpio配置有点类似arm的了,要对IO初始化
回复 支持 反对

使用道具 举报

发表于 2023-9-10 01:05:14 | 显示全部楼层
这种库函数 和stm32的 非常相似 ,,,
回复 支持 反对

使用道具 举报

发表于 2023-9-10 19:33:06 | 显示全部楼层

哇,又会画板,又懂编程,你就是我心目中的大神
回复 支持 反对

使用道具 举报

发表于 2023-9-10 20:59:20 | 显示全部楼层
soma 发表于 2023-9-9 11:02
gpio配置有点类似arm的了,要对IO初始化

估计STC的工程师都用惯了STM32
回复 支持 反对

使用道具 举报

发表于 2023-9-10 21:00:32 | 显示全部楼层
soma 发表于 2023-9-9 11:02
gpio配置有点类似arm的了,要对IO初始化

image.png

有自动化工具
回复 支持 反对

使用道具 举报

发表于 2023-9-13 18:20:53 来自手机浏览器 | 显示全部楼层
感谢分享,谢谢大神
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-4 10:57 , Processed in 0.124800 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表