目录
模块化编程:
1.1 模块化编程
•传统方式:所有的函数均放在main.c里,若使用的模块较多,则一个文件内会有很多代码,不利于代码的组织和管理,而且很影响编程者的思路。
•模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部调用函数的声明,其他.c文件想使用其中的代码时,只需要#include"XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。
(.h文件称为头文件)
1.2模块化编程框图
Delay函数模块化:
•#ifndef__DELAY_H__ 与 #define__DELAY_H__是预编译语句
1.3模块化编程的注意事项
•.h文件:函数、变量的定义
•.h文件:可被外部调用的函数、声明的变量
•任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
P.S. 实际上,也可以不定义就声明,编译器不会报错。
•使用到的自定义的.c文件必须添加到工程参与编译
•使用到的.h文件必须放到编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
1.4C预编译
•C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)
•此外还有#ifdef,#if,#else,#undef等
2.LCD1602调试工具
•使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实现观察单片机内部数据的变换情况便于调试和演示。
矩阵键盘:
1.1矩阵键盘的介绍
•在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
•采用逐行或逐列的"扫描",就可以读出任何位置按键的状态
1.2扫描的概念
•数码管扫描(输出扫描)
原理:显示第1位 → 显示第2位 → 显示第3位 → ······,然后快速循环这个过程,最终实现所有数码管同时显示的效果
•矩阵键盘扫描(输入扫描)
原理:读取第1行(列) → 读取第2行(列) → 读取第3行(列) → ······,然后快速循环这个过程,最终实现所有按键同时检测的效果
•以上两种扫描方式的共性:节省I/O口
1.3STC89C52的输出模式
•弱上拉,高下拉模式,即:输入1时,对I/O口的驱动能力弱,而输入0,驱动能力强.
定时器:
1.1定时器介绍:
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机的内部完成
1.2定时器作用:
•用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
•代替长时间的Delay,提高CPU的运行效率和处理速度
2.STC89C52定时器资源
•定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源
•N.B.定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有的51单片机共有的
3.1定时器框图
•定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔一段固定的时间,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
3.2定时器工作模式
•STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器
模式2:8位自动重装模式
模式3:两个8位计数器
•工作模式1框图:
•计数系统的最大值是65535,溢出的话就会重置为零,激活中断系统
3.3定时器时钟
•SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz
•时钟可以有两个来源:系统时钟 / 外部引脚
4.1中断系统
•中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
•请示CPU中断请求的请求源成为中断源,中断源有不同的优先级别,CPU总是优先响应级别较高的中断请求
4.2STC89C52中断资源
•中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3)
•中断优先级个数:4个
•中断号:
•N.B. 中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等
5.定时器相关寄存器
•寄存器是连接软硬件的媒介
•在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式
•寄存器相当于一个复杂机器的“操作按钮”
6.相关概念
•可位寻址:可位寻址的寄存器能够对其中的每一位单独赋值
•不可位寻址:不可位寻址的寄存器只能够整体赋值
•1 & x = x ; 0 & x = 0
•1 | x = 1 ; 0 | x = x
•与或式负责法:通过与、或的计算方式操作一个整体中的某些位而不影响其他位
•全局变量:可由多个函数应用,且每次使用完回到初值
局部变量:只能某些函数使用,但是每次使用完后会对变量进行销毁
静态局部变量:使用完后不会清除,仍然占据内存,可以保证退出函数后不丢失变量的值
•cror:循环右移
crol:循环左移
e.g. unsigned char a=0x01
a=_crol_(a,1); //a=0x02
循环移位的函数不需要进行移位的越界判断
串口通信
1.串口介绍
•串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的相互通信
•单片机的串口可以是单片机与单片机、单片机与电脑、单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力
•51单片机内部自带UART(Universal Asynchroncus Receiver Transmitter,通用异步收发器),可实现单片机的串口通信
2.硬件电路
•简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
•TXD与RXD要交叉连接
•当只需单向的数据传输时,可以直接一根通信线
•当电平标准不一致时,需要加电平转换芯片
3.电平标准
•电平标准是数据1和数据0的表达方式,是传输线揽中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
•TTL电平:+5V表示1,0V表示0
•RS232电平:-3~-15V表示1,+3~+15V表示0
•RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
4.接口及引脚定义
5.1常见的通信接口比较
•此外还有:CAN、USB等
5.2相关术语
•全双工:通信双方可以在同一时刻互相传输数据
•半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
•单工:通信只能有一方发送到另一方,不能反向传输(例如:电视和遥控器)
•异步:通信双方各自约定通信速率
•同步:通信双方靠一根时钟线来约定通信速率
•总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,是住户可以相互交流)
6.51单片机的UART
•STC89C52有1个UART
•STC89C52的UART有4种工作模式
模式0:同步移位寄存器
模式1:8为UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
7.1串口参数及时序图
•波特率(以数据字符为单位):串口通信的速率(发送和接收各数据位的间隔时间)
•比特率(以bit位单位):串口通信的速率(发送和接收各数据位的间隔时间)
•检验位:用于数据检验
常见校验方法有:奇校验、偶校验、0校验、1校验
•停止位:用于数据帧间隔
•串口通信是把数据一个一个发出,从低位开始发出,直至停止位,接收也是一位一位的法
7.2串口模式图
•SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
7.3串口和中断系统
7.4串口相关寄存器
8.数据显示模式
•HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
•文本模式/字符模式:以原始数据编码后的形式显示(即以ASCII码的形式显示)
LED点阵屏
1.1LED点阵屏介绍
•LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等,LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等
•LED点阵屏的分类
按颜色:单色、双色、全彩
按像素:8x8、16x16等(大规模的LED点阵通常由很多个小点阵拼接而成)
1.2显示原理
•LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
•LED点阵屏与数码管一样,有共阴和共阳两种解法,不同的接法对应的电路结构不一样
•LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
•LED点阵屏和数码管类似,无法对不同的LED分别进行赋值,只能够通过扫描的方法来进行LED的同时显示
2.74HC595
•74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展
•串行数据:一个一个的输入或输出
并行数据:多个同时输入或输出
•SER:串行数据
SERCLK:串行时钟,每接收到一个上升沿,数据就会向下移一位
RCLK:寄存器时钟,当RCLK有上升沿的时候会将8位数据一起搬运到输出缓存
•多片级联则可以通过QH这个引脚将数据传输到下一片74HC595,当数据储存完毕后,给RCLK上升沿,即可实现输出nx8位数据的效果
3.C51的sfr、sbit
•sfr(special function register):特殊功能寄存器声明
例:sfr P0 = 0x80;
声明P0口寄存器,物理地址为0x80
•sbit(special bit):特殊声明
例:sbit P0_1 = 0x81; 或 sbit p0_1 = P0^1;
声明P0寄存器的第一位
•可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量时寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以可位寻址的。对不可位寻址的寄存器,若只操作其中一位而不影响其他位时,可用“&=”、“|=”、“^=”的方法进行位操作
DS1302实时时钟:
1.1DS1302介绍
•DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能
•RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片
•单片机自带定时器与时钟芯片的区别:定时器的精度比时钟芯片低,它会占用单片机CPU的空间,并且不可以掉电运行;实时时钟芯片拥有备用电源,掉电之后它仍可保持进行
1.2引脚定义和应用电路
•直插封装:
•贴片封装 :
•两种封装方式只是外表不一样,其内部芯片的集成电路和引脚定义是完全相同的
•应用电路:
1.3内部结构框图
1.4寄存器定义
•1~6行:分别代表秒、分、时、日、月、年
•WP:“写保护” 打开后则只能读出无法写入
•应用的关键:在哪 写入 什么
在哪 读出 (什么)
•通过地址命令字来操作:第7位:默认为1
第6位:0:操作RAM;1:操作时钟
第5~1位:地址位
第0位:0:写入;1:读出
1.5时序定义
•单字节写:
1.CE置为高电平
2.I/O口写:命令字节+数据字节
命令字节:先发R/W 1还是0
将时钟置为0,然后再给一个上升沿,每一位都如此操作,直至8位全部发完
数据字节:从D0位开始,写一个给一个上升沿,每写完一个都要将时钟置0直至D7位写完
3.最后写完后将SCLK和CE置0
•单字节读:
1.CE置为高电平
2.给8个上升沿将命令字节发送给单片机
后面单片机会在紧跟着的一个时钟的下降沿将数据放在线上,这是单片机会将I/O 这个口释放掉,单片机不会再操作I/O这根线,开始读出数据
3.单片机继续控制时钟,在每一个下降沿读出一个数据,直至8个数据全部读出
4.最后将SCLK和CE置0
2.BCD码
•BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数
•例:0001 0011表示13,1000 0101表示85,0001 1010不合法
•在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
•BCD码转十进制:DEC=BCD/16*10+BCD%16;(2位BCD)
•十进制转BCD码:BCD=DEC/10*16+DEC%10;(2位BCD)