慕司板编程说明 -- 慕司板IAP15

千言万语说不尽,一切尽在代码中。不过,有些注意事项还是要说明一下的,至于寄存器之类的,虽然特别重要,我们只在LKB一节中引用一下手册,其余的寄存器在此省略,因为芯片手册中都有,必须学会看芯片手册,因为,碰到例程中没有的,或者暂时解决不了的怎么办?肯定还是要看芯片手册,所以,还不如一边学,一边熟悉芯片手册。

说是例程,倒不如说是我学习的过程,程序几乎总是变的,以后面的例程(演示例程)为准,一边学习,一边发现问题,一边解决问题,这样挺好,我把这样的经历记录下来,而不是追求完美,是因为,不犯错,怎么进步?比如,2013年刚拿到IAP15这个片子时,我死活仿真不到33.1776MHz,还以为是芯片Bug,当时在博客上妄下结论,但到了2014年,一个偶然的机会我才发现,原来使用PL2303只能到6M,使用CH340却是可以仿真到33.1776MHz!困扰了我一年的问题也解决了,后来又发现仿真时串口1切换到P36/P37还可以照常使用,这不又进了一步!敢于正视错误,敢于面对错误,尽力解决,永远没有终点,也永远没有完美吧!

芯片手册和下载软件

芯片手册好比产品的说明书,是一定要看的,实现什么功能,那些不懂的原因,一般都可以在芯片手册中找到。单片机的各种资料和勘误一般会在官网给出,如宏晶官网:www.stcmcu.com 给出了各种开发STC单片机的参考资料。

学习各种单片机,一个是配置寄存器,实现底层驱动;另一个是时序。注意了这两个,再参考着例子学习,会很快的。

不特别说明,手册默认STC15和IAP15是等价的。STC15的芯片手册,给出了各个模块寄存器的介绍以及例程,稍微修改即可拿来应用,真正比较贴近说明书了,看着说明书一步步来,一般无大错。

STC的下载软件这两年更新很频繁,基本每半月左右就会更新一次,依然免安装,虽然小,功能确实越来越强大了,软件全屏:串口助手、仿真说明、牛X的范例程序(我学习IAP15单片机就是把这些程序复制出来,比着芯片手册一行行看寄存器定义,再按照编程规范改成自己的函数,还有不懂的,官网有STC15库函数,参照这个,程序基本不用自己写了)、选型/价格/样品(单片机有多少资源一目了然,双击单片机的名字,就能下载单片机的芯片手册)、头文件(stc15f2k60s2.h就是从这复制过来的)……各种好东西啊:

编程约定

记得当初初进实验室,感觉收获最大的,是一篇“亚太电子组书写规范”,是当时石队长给的,虽然这么多年来没有完全遵守,但也确实明白了编程规范的重要性。有时甚至见到学了单片机一两年了,还是一个main.c从头写到尾,成千上万行代码写到一个.c文件,很是不可思议。这里随手写一些编程约定,便于对例程的理解,并不强制要求,因为,每个人的编程规范大多在变,而且,不同人的编程习惯也不一样,黑猫白猫,抓到老鼠就是好猫吧:

  • 所有文件的命名为小写字母。
  • 全局变量在.c文件中定义,如果只一个.c用,可以用static声明,如果其他.c文件也用,就在相应的同名.h文件用extern声明。结构体的类型定义放在.h文件中,结构体变量的定义在.c文件中,结构体变量的声明在.h文件中。
  • .h文件书写如下:
第一部分为:文件说明注释(好多我偷工减料了)
第二部分为:防止重复定义语句
#ifndef __AA_H__
#define __AA_H__
第三部分为:包含公用头文件、.c文件定义全局变量的extern声明、函数声明(省略了extern)
最后为:#endif
  • config0.h是配置头文件,包含了所用单片机的头文件(#include “stc15f2k60s2.h”),定义了诸如系统时钟、引脚连接、多个.c文件引用的全局变量(不知道放哪好就放这里吧)等,大多数.h文件都包含了config0.h,大多数.c文件再包含同名.h文件,这样,就相当于大多数.c文件包含了单片机的头文件”stc15f2k60s2.h”.
  • interrupt.c是放置了各种中断服务函数:定时器中断、外部中断、串口中断、PCA中断等等的中断服务函数。

至于函数的命名之类的,在此就不多说了,好多库函数的命名是比较规范的,我们也就沿用了。

编程思想(消除ms级Delay)

除了第一个例程之外的所有的例程,初始化后在while里是看不到Delay_ms这样的函数的,例程中把按键消抖放在了定时器中断里,比如说10ms中断一次,那刚好这次中断检测有没有按键按下、在下次中断判按键值,中间的10ms正好用来做消抖时间。如果有数码管的刷新等没有几行代码的任务,也是甩到定时器中断里,这样,就不会出现诸如按一下按键,数码管闪一下这样的情况发生。但有人说,我想实现1s点一次灯怎么办?一张图就明白了:
慕司板编程说明 -- 慕司板IAP15_第1张图片
程序中大量使用全局变量标志位,每一个任务给一个标志位,在定时器中断中进行调度,在while中执行任务。

原作于 2014年10月
CSDN发表于2016年4月
weifengdq

你可能感兴趣的:(编程,慕司板,消除Delay,IAP15L2K61)