一、模块化编程
1.一般编程和模块化编程的比较
**一般编程方式:**所有的函数放在“.c”文件里。
(缺点:如果使用的模块功能较多,则文
件中有很多代码,不利于对代码的组织和
管理,影响代码的美观性)
模块化编程: 将各个模块的代码放在不同的“.c”文件里,
在“.h”文件里提供外部可调用函数的声明,
其它“.c”文件想使用其中的代码时,只需要#include "XXX.h"文
件即可。
(优点:极大的提高代码的可阅读性、可维护性、可移植性
等)
2.模块化编程的使用(以delay函数为例)
1先把delay函数的代码写进一个独立的“.c”文件里
2.建立一个“.h”文件来声明delay函数
3在需要调用delay函数的主函数前写入头文件,就可以调用delay函数
4.用到的“.h”文件必须放在编译器可以找到的地方(建议和主函数程序放在一起)
3. LCD1602(模块化编程演示)
LCD1602
已存在的内部函数
直接调用函数,来控制LCD1602
二、矩阵键盘
1.上拉电阻和下拉电阻
上拉电阻:
将一个不确定的信号(高电平和低电平),通过一个电阻和电源VCC相连,固定再高电平。
下拉电阻
将一个不确定的信号(高电平和低电平),通过一个电阻和地GND相连,固定在低电平。当上拉电阻和下拉电阻共同作用时,表现为接地低电平状态。
上图中画蓝色方块的就是上拉电阻
2.矩阵键盘原理图
**用矩阵键盘的原因:**和独立按键类似,当16个键盘和单片机连接时,每个按键都需要有I/O口,但是如果这样的话,就会占用过多的I/O口,所以单片机设计者引入了矩阵键盘。
**实现方式:**快速扫描。扫描有两种方式,分别时按行扫描和按列扫描。
因为单片机I/O口设计的问题,我们一般采用按列扫描。具体操作如下:
首先,让p17置低电平,p14-p16置高电平,同时检测p10-p13是否有电平被拉低,假如此时检测到p13有电平变化,则肯定是s1按键被按下了。同理,可以检测到任意一个按键是否被按下。
**原理:**读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果。
**优点:**省单片机IO
**缺点:**不能同时按下多个按键
3.代码的实现
三、定时器
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。
1.定时器作用:
1、用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作;
2、替代长时间的for循环Delay,提高CPU的运行效率和处理速度;
……
工作框图
计数器可以计算外部脉冲个数,定时器就是用计数的原始实现的。
2.STC89C52定时器资源:
定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。
注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。
STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
模式1工作框架图:
SYSclk:系统时钟,即晶振周期,本开发板上的晶振为11.0592MHz。
3.中断系统:
与定时器相互配合
定时器请求中断后,根据中断优先级执行任务。
寄存器补充:
定时器/结束器0/1控制寄存器TCON
定时器/计数器工作模式寄存器TMON
4.LED自动流水灯
按键
定时器
主函数