单片机介绍
单片机内部资源
(1)Flash—程序存储空间,类似于计算机硬盘。
(2)RAM—数据存储空间,类似于计算机的内存。
(3)SFR—特殊功能寄存器。
单片机最小系统的三要素就是电源、晶振和复位电路。
品振通常分为无源晶振和有源晶振两种类型,无源品振一般称之为 crystal(晶体),而有源晶振则叫作oscillator(振荡器)。无源晶振两侧通常都会有个电容,一般其容值都选在10~40pF 之间,如果数据手册中有具体电容大小的要求则要根据要求来选电容,如果手册没有要求,用20pF是比较好的选择,这是一个长久以来的经验值,具有极其普遍的适用性。
当这个电路处于稳态时,电容起到隔离直流的作用,隔离了十5V,而左侧的复位按键是弹起状态,下边部分电路就没有电压差的产生(没有电流流过就表示没有电压差),所以按键和电容C11以下部分的电位都是和GND相等的,也就是0V。
经验积累
不同数据类型间的相互转换
不同类型变量之间的相互赋值,短字节类型变量向长字节类型变量赋值时,其值保持不变,比如
unsigned char a=100;unsigned int b=700; b=a;那么最终b的值就是100了。
如果程序是unsigned char a=100; unsigned int b=700;a=b;那么a的值仅仅是取了b的低8位,首先要把700变成一个16位的二进制数据,然后取它的低8位出来,也就是188,这就是长字节类型给短字节类型赋值的结果,会从长字节类型的低位开始截取刚好等于短字节类型长度的位,然后赋给短字节类型。
bit类型的强制类型转换,是不符合上边讲的这个原则的,比如
bit a=0;unsigned char b; a=(bit)b;使用bit做强制类型转换,不是取b的最低位,而是它会判断b这个变量是0还是非0的值,如果b是0,那么a的结果就是0,如果b是任意非0的其他值,那么a的结果都是1。
字节操作修改位的技巧
对于二进制位操作来说,不管该位原来的值是0还是1,它跟0进行&运算,得到的结果都是0;而跟1进行&运算,将保持原来的值不变;不管该位原来的值是0还是1,它跟1进行|运算,得到的结果都是1,而跟0进行|运算,将保持原来的值不变。
PWM知识与实例
PWM(Pulse Width Modulation),它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果。
这是一个周期是 10ms、频率是100Hz的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是PWM 的本质。占空比是指高电平的时间占整个周期的比例。比如第一部分波形的占空比是40%,第二部分波形占空比是60%,第三部分波形占空比是80%,这就是 PWM 的解释。
51单片机RAM区域的划分
以下是几个Keil C51语言中的关键字,代表了RAM 不同区域的划分,
data:片内RAM从0x00~0x7F;
idata:片内RAM从0x00~0xFF;
pdata:片外RAM从0x00~0xFF;
xdata:片外RAM从0x0000~0xFFFF;
STC89C52共有512字节的RAM,分为256字节的片内RAM 和256 字节的片外RAM。一般情况下使用 data区域,data不够用了,就用xdata,如果希望程序执行效率尽量高一点,就使用pdata关键字来定义。其他型号有更大的RAM的51系列单片机,如果要使用更大的 RAM,就必须得用xdata来访问了。
点亮LED小灯
在实际单片机应用中存在一个问题。比如程序空间可以容纳 100行代码,但是实际上的程序只用了 50 行代码,当运行完了 50行,再继续运行时,第51行的程序不是自己想运行的程序,而是不确定的未知内容,一旦执行下去程序就会出错,从而可能导致单片机自动复位,所以通常在程序中加入一个死循环while(1),让程序停留在所希望的这个状态下,不要乱运行。
数码管
数码管共有a、b、c、d、e、f、g、dp 这么8个段,而实际上,这8个段每一段都是一个LED小灯,所以一个数码管就是由8个LED组成的。
数码管分为共阳和共阴两种,共阴数码管就是8只LED小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。同理,共阳数码管就是阳极接在一起。数码管上边有2个com端,这就是数码管的公共端。为什么有两个?一方面是2个可以起到对称的效果,刚好是10个引脚,另外一个方面,公共端通过的电流较大,用2个com可以把公共电流平均到2个引脚上去,降低单条线路承受的电流。
数码管动态扫描:
数码管消隐或者数码管鬼影解决:
关闭段或关闭位,关闭段相对来说简单一点,在P0赋值后,给个几毫秒延迟,再给P0赋值0x00(即清零)。
硬件基础知识
在设计数字电路的时候,在电源处的去耦高频电容,直接用这个0.1uF。
三极管一共有3个极,从上图来看,横向左侧的引脚叫作基极b(base),中间有一个箭头,一头连接基极另外一头连接的是发射极e(emitter),那剩下的一个引脚就是集电极c(collector)。
三极管的类型和用法口诀:**箭头朝内PNP,导通电压顺箭头过,电压导通,电流控制。**导通电压顺箭头过,电压导通的解释:**箭头的始端比末端高0.7V就可以导通三极管的e极和c极。**电流控制比较难理解,等具体用到再来复习回顾。
三极管应用示例:
如果P1.0由程序给一个高电平1,那么基极b和发射极e都是5V,也就是说e到b不会产生一个0.7V的压降,这个时候,发射极和集电极也就不会导通,那么竖着看这个电路在三极管处是断开的,没有电流通过,LED2小灯也就不会亮。如果程序给P1.0一个低电平0,这时e极还是5V,于是e和b之间产生了压差,三极管e和b之间也就导通了,三极管e和b之间大概有 0.7V 的压降,那还有(5-0.7)V的电压会在电阻 R47 上。这个时候。e和c之间也会导通了,那么 LED小灯本身有 2V的压降,三极管本身e和c之间大概有0.2V的压降,忽略不计。那么在 R41上就会有大概 3V的压降,可以计算出来,这条支路的电流大概是3mA,可以成功点亮 LED。
74HC245是个双向缓冲器,1引脚DIR是方向引脚,当这个引脚接高电平的时候,右侧所有的B编号的电压都等于左侧A 编号对应的电压(从左到右看)。比如A1是高电平,那么B1就是高电平,A2是低电平,B2就是低电平。如果DIR引脚接低电平,得到的效果是左侧A编号的电压都会等于右侧B编号对应的电压(从右到左看)。还有最后一个使能引脚,19引脚OE,叫作输出使能,这个引脚上边有一横,表明是低电平有效,当接了低电平后,74HC245就会按照刚才上边说的起到双向缓冲器的作用,如果OE接了高电平,那么无论DIR 怎么接,A和B的引脚是没有关系的,也就是74HC245 功能不能实现出来。
74HC138三八译码器,三八译码器就是把3种输入状态翻译成8种输出状态。74HC138有1~6一共是6个输入引脚,但是其中4、5、6 这三个引脚是使能引脚,4,5,6这三个使能引脚如果不符合规定的输入要求,Y0到Y7不管输入的1、2、3引脚是什么电平状态,总是高电平。所以要想让这个74HC138正常工作,ENLED那个输入位置必须输入低电平,ADDR3位置必须输入高电平。
上面这些芯片,统称驱动IC,加入这些驱动IC仅仅是电流驱动缓冲,不起到任何的逻辑控制效果。
电容:104意思是10 0000pF(10后面再加4个0)。
重点认识上图中的国外流行图形符号。
独立按键
电路逻辑:一开始单片机IO口从内部来看是一个高电平,以确保正常读取到按键状态。
当按键K1按下时,+5V通过电阻R1然后再通过按键K1最终进入GND形成一条通路,KeyIn1这个引脚就是个低电平(也即IO口为低电平)。
当松开按键后,线路断开,就不会有电流通过,KeyIn1和+5V就是等电位,是一个高电平。我们就可以通过KeyIn1这个IO口的高低电平来判断是否有按键按下。
按键抖动:对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
按位左移1位:0011 1100<<1 -> 0111 1000
按位右移2位:0011 1100>>2 -> 0000 1111
按位与(对应位都为1则为1):
0001 1000 & 0010 1010 -> 0000 1000
按位或(对应位有一个1则为1):
0001 1000 | 0010 1010 -> 0011 1010
按位异或(对应位相同为0,不同为1):
0001 1000 ^ 0010 1010 -> 0011 0010
按位取反:~0001 1000 -> 1110 0111
51单片机有一种特殊的变量类型就是bit型。比如unsigned char型是定义了一个无符号的8位的数据,它占用一个字节(Byte)的内存,而bit型是1位数据,只占用1个位(bit)的内存。8个bit型变量才相当于1个char型变量所占用的空间。
因此程序里面定义了一个unsigned char变量并赋值为0,该变量在单片机里表示为0000 0000。
LCD1602
使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。
本视频提供的LCD1602代码属于模块化的代码,使用者只需要知道所提供函数的作用和使用方法就可以很容易的使用LCD1602
矩阵键盘
矩阵键盘的电路逻辑和独立按键基本一致。
数码管扫描(输出扫描)原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果
矩阵键盘扫描(输入扫描)原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
以上两种扫描方式的共性:节省I/O口
定时器
1.时钟周期
时钟周期T是时序中最小的时间单位,具体计算的方法就是
时钟周期=时钟源频率的倒数(即时钟源频率分之1)
例如STC89C52单片机开发板上用的晶振是11.0592M,那么对于这个单片机系统来说,时钟周期=1/11059200秒。
2.机器周期
单片机完成一个操作的最短时间。
定时器开始计数后这个寄存器的值每经过一个机器周期就会自动加1,因此,机器周期为定时器的计数周期。就像钟表,每经过一秒,数字自动加1,而定时器就是每过一个机器周期的时间,也就是12/11059200秒,数字自动加1。
振荡周期(时钟周期):为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
状态周期:1个状态周期==2个振荡周期,用S表示。振荡周期又称S周期或时钟周期。
机器周期:1个机器周期6个状态周期12个振荡周期。
指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。
例如:外接晶振为12MHz时,51单片机相关周期的具体值为:T=1/f,f=12MHz
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;
从某一个初始值开始,经过确定的时间后溢出,这个过程就是定时的含义。
定时器的寄存器
标准的51单片机内部有T0和T1这两个定时器,T就是Timer的缩写,现在很多51系列单片机还会增加额外的定时器,在这里先讲定时器0和1。
TH0/TL0用于T0,TH1/TL1用于T1。
只要是硬件置1或者清0的,就是指一旦符合条件,单片机将自动完成动作,只要写软件置1或者清0的,是指必须用程序去完成这个动作。
对于TCON这个SFR,其中有TF1、TR1、TF0、TR0这4位需要理解清楚,它们分别对应于T1和T0。
以定时器1为例,定时器0同理。先看TR1,当程序中写TR1=1以后,定时器值就会每经过一个机器周期自动加1;当程序中写TR1=0以后,定时器就会停止加1,其值会保持不变化。TF1是一个标志位,它的作用是告诉大家定时器溢出了。比如定时器设置成16位的模式,那么每经过一个机器周期,TL1加1一次,当TL1加到 255后,再加1,TL1变成0,TH1会加1一次,如此一直加到 TH1和TL1都是255(即TH1和TL1组成的16位整型数为65535)以后,再加1一次,就会溢出了,TH1和TL1同时都变为0,只要一溢出,TF1马上自动变成1,告诉大家定时器溢出了,仅仅是提供给读者一个信号,让使用者知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。
TCON最后标注了“可位寻址”,而TMOD标注的是“不可位寻址”。意思就是说:比如TCON有一个位叫TR1,可以在程序中直接进行TR1=1这样的操作。但对TMOD里的位比如(T1)M1=1这样的操作就是错误的,要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD所有位操作,不能对其中某一位单独进行操作。也可以只修改其中的一位而不影响其他位的值,在后续内容中会进行学习。
可位寻址:可以对某一位进行赋值,也可对整体赋值
不可位寻址:只能对整体进行赋值
定时器的4种工作模式:其中模式0是为了兼容老的8048系列单片机而设计的,现在的51几乎不会用到这种模式,而模式3根据应用经验,它的功能用模式2完全可以取代,所以基本上也是不用的。
重点:模式1和模式2。
模式1,是 THn和TLn组成了一个16位的定时器,计数范围是0~65535,溢出后,只要不对THn和TLn重新赋值,则从0开始计数。
模式2,是8位自动重装载模式,只有TLn做加1计数,计数范围是0~255,THn的值不会变化,而会保持原来的值;TLn溢出后TFn就直接置1了,并且THn原先的值直接赋给TLn,然后TLn重新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,学习串口的时候要用到。
OSC框表示时钟频率,因为1个机器周期等于12个时钟周期,所以那个d就等于12。下边GATE右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路。图上可以看出来,下边部分电路是控制了上边部分,以定时器0为例。
(1)TR0和下边或门电路的结果要进行与运算,TR0如果是0的话,与运算完了肯定是0,所以如果要让定时器工作,那么TR0就必须置1。
(2)这里的与门结果要想得到1,那么前面的或门出来的结果必须也得是1才行。在GATE位为1的情况下,经过一个非门变成0,或门电路结果要想是1的话,那INT0即P3.2引脚必须是1的情况下,这个时候定时器才会工作,而INT0引脚是0的情况下,定时器不工作,这就是GATE位的作用。
(3)当GATE位为0的时候,经过一个非门会变成1,那么不管INT0引脚是什么电平,经过或门电路后都肯定是1,定时器就会工作。
(4)要想让定时器工作,就是自动加1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是C/T=0的时候,一个机器周期TL就会加1一次,当开关打到下边的箭头,即C/T=1的时候,T0引脚即P3.4引脚来一个脉冲,TL就加1一次,这也就是计数器功能。
定时器的应用
还是以定时器0为例,使用定时器的时候,需要以下几个步骤
第1步:设置特殊功能寄存器TMOD,配置好工作模式。(选定工作模式)
第2步:设置TCON,通过TR0置1来让定时器开始计数。
第3步:判断TCON寄存器的TF0位,监测定时器溢出情况。(确定TRn或TFn)
第4步:设置计数寄存器TH0和TL0的初值。(选定T0或T1)
加上中断,则有第5步:打开中断使能寄存器(IE)以及中断优先级寄存器(IP)
写程序之前,要先来学会计算如何用定时器定时时间。晶振是11.0592M,时钟周期就是1/11059200,机器周期是12/11059200。假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,下面来算一下x*12/11059200=0.02,得到x=18432。16位定时器的溢出值是 65536(因65535再加1才是溢出),于是就可以这样操作,先给TH0和 TL0一个初始值,让它们经过18432个机器周期后刚好达到65536,也就是溢出,溢出后可以通过检测TF0的值得知,就刚好是0.02秒。那么初值y=65536-18432=47104,转成十六进制就是0xB800,也就是TH0=0xB8,TL0=0x00。
单片机的中断系统
定时器和中断不是一回事,定时器是单片机模块的一个资源,实实在在存在的一个模块;中断是单片机的一种运行机制。
标准51单片机中控制中断的寄存器有两个,一个是中断使能寄存器(IE),另一个是中断优先级寄存器(IP)。
中断使能寄存器IE的位0~ 5控制了6个中断使能,而第6位没有用到,第7位是总开关。总开关就相当于家里或者学生宿舍里的那个电源总闸门,而0~5位这6个位相当于每个分开关。也就是说,只要用到中断,就要写EA =1这一句,打开中断总开关,然后用到哪个分中断,再打开相对应的控制位就可以了。
中断服务函数的书写格式是固定的,首先中断函数前边void表示函数返回空,即中断函数不返回任何值,函数名是InterruptTimer0(),这个函数名在符合函数命名规则的前提下可以随便取,取这个名字是为了方便区分和记忆,而后是interrupt这个关键字,一定不能错,这是中断特有的关键字,另外后边还有个数字1。
要使能第2行的T0中断,那么就要把它的中断使能位ET0置1,当它的中断标志位TF0变为1时就会触发T0中断了,这时就来执行中断函数,单片机靠中断向量地址来找到这个中断函数,所以interrupt后面中断函数编号的数字x就是根据中断向量得出的,它的计算方法是(x*8+3)等于向量地址。当然表中都已经给算好放在第一栏了,可以直接查出来用就行了。到此为止,中断函数的命名规则都搞清楚了。中断函数写好后,每当满足中断条件而触发中断后,系统就会自动来调用中断函数。
中断的优先级(IP寄存器)
中断优先级有两种,一种是抢占优先级,一种是固有优先级。
IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复位值都是0,当把某一位设置为1的时候,这一位的优先级就比其他位的优先级高了。比如设置了PT0位为1后,当单片机在主循环或者任何其他中断程序中执行时,一旦定时器T0发生中断,作为更高的优先级,程序马上就会跑到T0的中断程序中来执行。反过来,当单片机正在T0中断程序中执行时,如果有其他中断发生了,还是会继续执行T0中断程序,直到把T0中的中断程序执行完毕以后,才会去执行其他中断程序。
当进入低优先级中断中执行时,如又发生了高优先级的中断,则立刻进人高优先级中断执行,处理完高优先级中断后,再返回处理低优先级中断,这个过程就称为中断嵌套,也称为抢占。所以抢占优先级的概念就是,优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。当然反过来,优先级低的中断是不能打断优先级高的中断的。
既然有抢占优先级,自然就也有非抢占优先级了,也称为固有优先级。在表中断查询序列中的最后一列给出的就是固有优先级,请注意,在中断优先级的编号中,一般都是数字越小优先级越高。从表中可以看到一共有1~6共6级的优先级,这里的优先级与抢占优先级的一个不同点就是,它不具有抢占的特性,也就是说即使在低优先级中断执行过程中又发生了高优先级的中断,那么高优先级的中断也只能等到低优先级中断执行完后才能得到响应。
1s = 1000ms = 1000000us
#include <INTRINS.H> 这是一个函数库的头文件,里面有循环左移( _ crol _)和右移( _cror _)的函数
例:
unsigned char a=0x01;
a= _crol _(a,1);//0000 0001 -> 0000 0010
串口通信
初识串行通信
通信按照基本类型可以分为并行通信和串行通信。并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。比如前边用到的P0=0xFE;一次给 P0的8个IO口分别赋值,同时进行信号输出,类似于有8个车道同时可以过去8辆车一样,这种形式就是并行的,习惯上还称 P0、P1、P2和P3为51单片机的4组并行总线。
而串行通信就如同一条车道,一次只能一辆车过去,如果一个0xFE这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式就是 0-1-1-1-1-1-1-1-1,一位一位的发送出去的,要发送8次才能发送完一个字节。
由RXD和TXD组成的通信接口就叫作串行接口,简称串口。串口是一种通讯接口,可实现两个设备的互相通信。51单片机内部自带UART(Universal Asynchronous Receiver Transmitter)通用异步收发器。
简单双向串口通信有两根通信线:发送端TXD(transmit exchange data) 和接收端RXD(receive exchange data)。
图中,GND表示单片机系统电源的参考地,TXD是串行发送引脚,RXD是串行接收引脚。两个单片机之间要通信,首先电源基准得一样,所以要把两个单片机的GND相互连接起来,然后单片机1的TXD引脚接到单片机2的RXD引脚上,即此路为单片机1发送而单片机 2接收的通道,单片机1的RXD引脚接到单片机2的TXD引脚上,即此路为单片机 2发送而单片机1接收的通道。这个示意图就体现了两个单片机相互收发信息的过程。
当只需单向的数据传输时,可以只接一根通信线。
当电平标准不一致时,需要加电平转换芯片。
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
TTL电平:+5V表示1,0V表示0
RS232电平(负逻辑):-3 ~ -15V表示1,+3 ~ +15V表示0
RS485电平:两线压差+2 ~ +6V表示1,-2 ~ -6V表示0(差分信号)
当单片机1想给单片机2发送数据时,比如发送一个0xE4这个数据,用二进制形式表示就是0b11100100,在UART通信过程中,是低位先发、高位后发的原则,就让TXD首先拉低电平,持续一段时间,发送一位0,然后继续拉低,再持续一段时间,又发送了一位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把8位二进制数字0b11100100全部发送完毕。持续的“一段时间"是由波特率决定的。
波特率就是发送二进制数据位的速率,习惯上用baud表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机1和单片机2首先都要明确约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。
在UART通信的时候,一个字节是8位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位0表示起始位,然后发送8位数据位,数据位是先低后高的顺序(从低位开始发送),数据位发完后再发一位1表示停止位。这样本来要发送一个字节的8位数据,而实际上一共发送了10位,多出来的两位其中一位起始位,一位停止位。
接收方一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到8位数据位后(接收到的数据需要翻转一下才是发送的真实数据),然后检测到停止位,再准备下一个数据的接收。
IO口模拟UART串口通信
串口调试助手的实质就是利用计算机上的UART通信接口,发送数据到单片机,也可以把单片机发送的数据接收到调试助手界面上。
UART串口通信的基本应用
常用的通信从传输方向上可以分为单工通信、半双工通信和全双工通信三类。
(1)单工通信就是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥控器、收音机广播等都是单工通信技术。
(2)半双工通信是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一方,比如对讲机就是典型的半双工。
(3)全双工通信就发送数据的同时也能够接收数据,两者同步进行,就如同电话一样,说话的同时也可以听到对方的声音。
异步:通信双方各自约定通信速率(各自设定波特率,且波特率一致)
同步:通信双方靠一根时钟线来约定通信速率
总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
51单片机的UART串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成。
对于串口的四种模式,模式1是最常用的,就是前边提到的1位起始位,8位数据位和1位停止位。
一般情况下,编写串口通信程序的基本步骤如下所示:
(1)配置串口为模式1。
(2)配置定时器T1为模式2,即自动重装模式。
(3)根据波特率计算TH1和TL1的初值,如果有需要可以使用PCON 进行波特率加倍。
(4)打开定时器控制寄存器 TR1,让定时器跑起来。
在使用T1做波特率发生器的时候,一定不要再使能T1的中断了。
SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
SYSclk就是晶振频率。
波特率计算方式原理(其实更多应该是计算TH1初始值)举例:
当单片机工作在12T模式时,定时器1的溢出率 = SYScIk / 12 / (256 - TH1初始值),串口方式1,8位UART波特率可变,波特率 = 2的SMOD次方 / 32 ) * (定时器1的溢出率)
HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
文本模式/字符模式:以原始数据编码后的形式显示(就是以ASCII码表的字符显示)
例如:发送是HEX模式:0x41;接收是文本模式:接收到字符 ’ A '。
LED点阵屏
LED点阵屏分类
按颜色:单色、双色、全彩
按像素:8 * 8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)
LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。
LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同。
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示。
普中单片机,P00 ~ 07是列,D0 ~ D7是行。(正常是去测试出来)
74HC595
74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I0口扩展。
OE上面加一横,一般来说是低电平有效,所以使用的时候要用跳线帽把OE和GND连在一起。
用for循环执行8次
DS1302实时时钟
BCD码的概念
BCD码(Binary-Coded Decimal)亦称二进码十进制数或二-十进制代码。用4位二进制数来表示1位十进制数中的 0 ~ 9这10个数字,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷地进行。我们前边讲过十六进制和二进制本质上是一回事,十六进制仅仅是二进制的一种缩写形式而已。而十进制的一位数字,从0到9,最大的数字就是9,再加1就要进位,所以用4位二进制表示十进制,就是从 0b0000 到 0b1001,不存在 0b1010、0b1011、0b1100、0b1101、0b1110、0b1111 这6个数字。BCD 码如果到了0b1001(就是9),再加 1,数字就变成 0b0001 0000,相当于用了8位的二进制数字表示了2位的十进制数字。
SPI时序认识
SPI(Serial Peripheral Interface),串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,常用于单片机和E2PROM、FLASH、实时时钟、数字信号处理器等器件的通信。SPI通信原理比I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是 SSEL(片选,也写作 SCS)、SCLK(时钟,也写作 SCK)、MOSI(主机输出从机输入,Master Output/Slave Input)和MISO(主机输入从机输出,Master Input/SlaveOutput)。
SSEL:从设备片选使能信号。如果从设备是低电平使能,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。
SCLK:时钟信号,由主机产生。
MOSI:主机给从机发送指令或者数据的通道。
MISO:主机读取从机的状态或者数据的通道。
在某些情况下,也可以用3根线的SPI或者2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那么 MISO 就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那 MOSI就可以不要;当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么 SSEL,就可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和 MISO都可以不要;如果主机只读取从机送来的数据,SSEL 和 MOSI都可以不要。
但是当提及SPI的时候,一般都是指标准 SPI,都是指4根线的这种形式。
实时时钟芯片DS1302
DIP(Dual In-line Package)封装,就是双列直插式封装技术,开发板上的单片机,就是个典型的DIP封装,而74HC245、74HC138、DS1302用的都是SOP(Small Out-Line Package)封装,是一种芯片两侧引出工形引脚的封装技术。
1引脚Vcc2是主电源正极的引脚,2引脚X1和3引脚X2是晶振输入和输出引脚,4引脚GND是负极,5引脚CE是使能引脚,接单片机的IO口,6引脚I/O是数据传输引脚,接单片机的IO口,7引脚SCLK是通信时钟引脚,接单片机的IO口,8引脚Vcc1是备用电源引脚。
DS1302寄存器介绍
DS1302的一条指令一个字节共8位,其中第7位(即最高位)固定为1,这一位如果是0,那写进去也是无效的。第6位是选择RAM还是CLOCK的,前边讲过,这里主要讲CLOCK时钟的使用,它的RAM功能不用,所以如果选择CLOCK功能,第6位是0,如果要用RAM,那第6位就是 1。从第5到第1位,决定了寄存器的5位地址,而第0位是读写位,如果要写,这一位就是0,如果要读,这一位就是1。
DS1302的时钟寄存器
寄存器0:最高位CH是一个时钟停止标志位。如果时钟电路有备用电源,上电后,要先检测一下这一位,如果这一位是0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果Vcc1悬空或者是电池没电了,当下次重新上电时,读取这一位,那这一位就是1,可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。
剩下的7位,高3位是秒的十位,低4位是秒的个位,DS1302内部是BCD码,而秒的十位最大是5,所以3个二进制位就够了。
寄存器1:最高位未使用,剩下的7位中,高3位是分钟的十位,低4位是分钟的个位。
寄存器2:bit7是1的话代表是12小时制,0代表是 24 小时制;bit6固定是0;bit5在12小时制下0代表的是上午,1代表的是下午,在24小时制下和bit4一起代表了小时的十位,低4位代表的是小时的个位。
寄存器3:高2位固定是0,bit5和bit4是日期的十位,低4位是日期的个位。
寄存器4:高3位固定是0,bit4是月的十位,低4位是月的个位。
寄存器5:高5位固定是0,低3位代表了星期。
寄存器6:高4位代表了年的十位,低4位代表了年的个位。特别注意,这里的00~99指的是2000年-2099年。
寄存器7:最高位一个写保护位,如果这一位是1,那么是禁止给任何其他寄存器或者那31个字节的RAM写数据的。因此在写数据之前,这一位必须先写成0。