目录可能有点bug,刷新下就好了

第1、2章 基本原理

MCS-51的 CPU

8位的CPU;
包括运算器和控制器两大部分;
具有面向控制的位处理功能。

标志寄存器PSW:8位寄存器用于保存指令执行结果的状态。

➢ C(PSW.7):进位标志位。
➢ AC(PSW.6):辅助进位标志位。
➢ F0(PSW.5):用户标志位。
➢ OV(PSW.2):溢出标志位。
➢ P(PSW.0):奇偶标志位(偶)。若累加器A中1的个数为奇数,则P置位;为偶数,则P清零。

程序计数器PC:
16位专用寄存器 ,用来存放下一条指令地址。
➢ 通电时复位,PC=0000H;系统的启动地址
➢ 具有自动加1功能。
➢ 不可访问。
➢ 寻址范围64KB

堆栈指针SP:
➢ 8位寄存器,指向栈顶,SP的内容是栈顶的地址。
➢ 51单片机的堆栈设在片内RAM中,
➢ SP的初值=07H. 程序中, SP需要重新赋初值!SP=60H
➢ 当子程序调用或者中断操作时,要用到堆栈

数据指针寄存器DPTR:
16位寄存器。访问外部存储器。
➢ 可分为2个8位寄存器使用:DPH、DPL

存储器

程序存储器(ROM)片内ROM:4KB 片外ROM:64KB 统一编址 存放程序、固定常数和数据表格

数据存储器(RAM)片内RAM:256B 片外RAM:64KB单独编址 存放变量及当做堆栈(片内RAM)

1)SFR 特殊功能寄存器区 功能:控制各功能部件。

2)用户RAM区 30H~7FH:80B。只能字节寻址。用来存放数据,可作为堆栈区。

3)位寻址区 20H~2FH:128位,16B。位、字节寻址 寻址地址范围:00H~7FH

51单片机的堆栈结构--向上生长型。
➢字节操作。
➢SP始终指向栈顶。

三类逻辑空间:

1、片内,片外统一编址(0000H—FFFFH)的64KB的程序存储器地址空间,用16位地址;

2、64KB片外数据存储器或IO地址空间,地址也从0000H—FFFFH,用16位地址;

3、256KB片内数据存储器地址空间,用8位地址

8051的指令系统设计了不同的数据传送指令符号以区别这三个不同的逻辑空间

并口结构

◼ P0口:地址(低位)(一般接锁存器)/数据口;通用I/O口;
◼ P1口:通用I/O口;
◼ P2口:地址(高位);通用I/O口;
◼ P3口:第二功能口;通用I/O口;

引脚

PSEN:片外程序存储器读选通信号(低有效)

ALE:地址锁存信号(接锁存器)

当访问片外存储器时,ALE=1,P0口传输的是地址信息;ALE=0,P0口传输的是数据信息

EA/VPP程序存储器选择信号,输入。
EA= 0,选外部ROM/Flash ;
EA=1,选内部ROM/Flash ,当程序计数器超过片内容量(4KB)时自动访问外部ROM/Flash

RESET复位信号,输入,高电平有效。高电平持续时间2个机器周期以上。按键复位;上电复位两种方式。

时序

时钟周期:基本单位 Tosc=1/Fosc(晶振频率)

机器周期:12个时钟周期

指令周期:1~4个机器周期

第4章 C51

数据类型

变量定义

绝对地址的访问

定义变量的绝对地址:将变量定义到存储器的某个具体单元。

1.关键字_at_ [存储器类型] 数据类型符 变量名 _at_ 地址常数;

2.预定义宏

3.指针

第5章 并口

LED数码管

显示方式:静态显示、动态显示(位选线、段选线)

键盘扫描

(1)判断是否有键按下?
向行线输出全0,读入列线状态。如果有键按下,总有一列线被拉至低电平,从而使列输入不全为1。

(2)识别哪一个键被按下?
①查找按下键所在的行。依次给各行线送低电平,查列线状态。全为1,则所按下的键不在此行;否则按下的键必在此行。
②查找按下键所在的列。读入列值,从第0位开始逐位判断,找出为0的位号,即为按下键的列号。

(3)求取键值
键号=行首号+列号=行号×4 + 列号

/*键盘扫描程序 */
scankey()
{
   uchar KeyNo=16,Tmp;//16是无按键返回标志
   delay(20);
   P3=0x0f; //高4位置零,低四位置1
   Tmp=P3;
   Tmp=Tmp&0x0f;//低4位数
    switch(Tmp) //判断哪行被按下,并为按键赋行初始值
 { 
 case (0x0e): KeyNo=0;break; //0000 1110
 case (0x0d): KeyNo=4;break; //0000 1101
 case (0x0b): KeyNo=8;break; //0000 1011
 case (0x07): KeyNo=12;break; //0000 0111
 default:KeyNo=16; //无键按下 
 } 
   P3=0xf0; //高4位置1,低四位置0
   Tmp=P3;
   Tmp=Tmp&0xf0;//低4位数
 switch(Tmp) //判断哪列被按下,并加上对行初始值的偏移量
 { 
 case (0xe0): KeyNo+=0;break; //1110 0000
 case (0xd0): KeyNo+=1;break; //1101 0000
 case (0xb0): KeyNo+=2;break; //1011 0000
 case (0x70): KeyNo+=3;break; //0111 0000
 } 

 return KeyNo;
}

第6章 中断

中断源

➢外部中断0(INT0,P3.2引脚):中断请求标志为IE0 

➢外部中断1(INT1,P3.3引脚):中断请求标志为IE1 

➢T0溢出中断(T0):中断请求标志为TF0

➢T1溢出中断(T1):中断请求标志为TF1

➢串行口中断(Rx或Tx):中断请求标志为发送中断TI或接收中断 RI

中断相关的寄存器

1)中断控制寄存器IE

EA:中断允许总控位。( 1:中断开放 、0:对应中断关闭)

ET2:定时器/计数器T2的中断允许位

ES:串行口中断允许位

ET1:定时器/计数器T1的中断允许位

EX1:外部中断 INT1的中断允许位

ET0:定时器/计数器T0的中断允许位

EX0:外部中断

INT0的中断允许位

设置方法:字设置或者位设置

2)中断优先级控制寄存器IP

作用:设置优先级,共两级优先级。(1:对应中断为高优先级、0:对应中断为低优先级)

*默认值为0,原因:上电复位,绝大多数寄存器为0,(复位非0的寄存器:SP 07H、P0-P3 FFH)

①同优先级中断优先规则

外中断0 > T0 > 外中断1 > T1 > 串行口 > T2

多个同级中断不能够嵌套中断

②不同优先级中断优先规则

多个中断同时请求:先响应高级中断请求

多个中断不同时请求:可以中断嵌套。(能对其它中断源产生中断嵌套的:高优先级的中断)
3)中断标志&触发相关的寄存器TCON

作用:外中断请求、定时器溢出标志和外中断触发方式设置。

外中断触发方式:IT1、IT0 (1:外中断下降沿触发、0:外中断低电平触发)

外中断请求标志:IE1、IE0 (1:有外中断请求信号、0:无外中断请求信号)

定时器中断溢出标志:TF1、TF0 (1:定时器计数结束,产生溢出、0:定时器计数未结束,没有溢出。或者没有计数。)

4)中断标志相关寄存器SCON

作用:串口中断标志。

RI:串口接收中断标志。TI:串口发送中断标志(1:表示收&发数据完成、=0:收&发数据未完成。或者无数据收发。)

中断标志位必须及时撤销

(1) 串口中断标志RI、TI必须编程撤销。除串口中断外的可以自动撤销。

(2) 定时器溢出中断标志TF1、TF0,如果采用程序查询方式,需编程撤销

(3) 外部中断请求为低电平时 中断请求标志自动撤销。 但请求信号的低电平可能继续存在,因此,还需在中断响应后把中断请求 信号输入引脚从 低 强制变高 。

中断响应过程:

(1)查询中断源并置标志,CPU在每个机器周期的S5P2期间, 顺序对中断源查询、置中断请求标志;

(2)查询中断标志,CPU在每个周期的S6状态,按优先级顺序 查询中断标志,但本周期所置标志下次才能查到;

(3)响应中断。

①PC的内容(即断点地址)进栈。先低位地址,后高位地址。

②硬件自动生成长调用指令LCALL addr16, addr16为各中断源 的中断程序入口地址。

③将中断源的中断入口地址装入程序计数器PC,执行中断服务程 序。

中断源中断入口
外部中断00003H
定时器/计数器0000BH
外部中断10013H
定时器/计数器1001BH
串行口0023H
定时器/计数器2002BH

中断响应时间:

通常,中断的响应时间最短为3个机器周期,最长为8个机器周期。

例:12MHz: 机器周期 1us( 12个时钟周期=1机器周期),最短相应时间3us

C51中断服务函数的一般形式为:

中断调用与标准C的函数调用是不一样的,当中断事件发生后,对应的中断函数被自动调用,中断函数既没有参数,也没有返回值。由于C51编译器在编译时对声明为中断服务程序的函数自动添加了相应的现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段, 因而在编写中断函数时可不必考虑这些问题

编程使用

中断初始化

设置中断优先级

设置中断触发方式(外中断)

开中断源中断

开中断总控制位

函数类型 函数名(形式参数表) interrupt m using n

m取值范围:0~4

0:外中断0

1:T0

2:外中断1

3:T1

4:串口中断

第7章 定时/计数器

51 单片机有两个16位的可编程定时器计数器 T1 、T0 。(T2)。加1计数。

每个定时/计数器既可以对系统时钟计数实现定时,也可以对外部信号计数实现 计数功能,通过编程设定来实现。

T0有四种工作方式;T1有三种工作方式。

当每个定时/计数器定时计数时间到会产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理

TMOD:方式寄存器。设置工作方式。

TCON:控制寄存器。计数运行控制和计数溢出标志。

TH1、TL1:计数器

TH0、TL0:计数器

TMOD:方式寄存器

C/T* : 计数器模式和定时器模式选择位 (0:定时器工作模式 ;1:计数器工作模式)

(当工作在计数器模式时,D2:T0(P3.4引脚),D6:T1(P3.5引脚)。每来一个脉冲,计数寄存器加1。)

GATE:门控位

0:仅由运行控制位TRn来控制定时器计数器运行。 (常用)

1:由外中断引脚 INT0* 或 INT1*与运行控制位 TRn 共 同控制定时器计数器运行

TCON:控制寄存器

TF1、TF0:计数溢出标志位。当定时/计数器T1计满时,由硬件使它置位。

 =0,计数没有溢出。

 =1,计数溢出

用于中断请求标志位或者查询位。当用作中断请求标志位时,硬件自动清0。当用作查询标志位时,要用软件清0

TR1、TR0:计数运行控制位。

=0,停止计数。

=1,启动计数

工作方式1的编程

初值计算

初值计算 计数初值:X=2^16-N=65536-N 计数范围:1~65536。

定时初值:X=2^16-T/机器周期。T:定时时间。 初值要分成2个字节分别送入THi、Tli

工作方式2:将上式16次方改为8次方

例:初值计算 若要求定时器T0工作于方式1,定时时间为1ms,当晶振为6 MHz时,求送入TH0和TL0的计数初值各为多少?应怎样送入TH0 和TL0?

(1)计算机器周期: 2us

(2)计算初值 X=216-t/Tcy =216-1×10-3/2×10-6 =65536-500=65036 =FE0CH

编程使用

1.根据要求选择方式(TMOD)

2.计算初值

TH0=(计算结果)/256; /*装载计数初值*/

TL0 =(计算结果)%256

3.设置TCON

4.开启定时计数器中断(查询方法不需要,但是要把标志位TF1或TF0手动撤销)

第8章 51单片机串口原理及应用

8.1基本概念

1)并行通信:速度快

2)串行通信:传输距离长,引脚数量少

2.异步串行通信与同步串行通信

1)同步~:(效率高、硬件成本高)靠同步字符进行握手(定时),由同一个时钟为双方提供通信信号

2)异步~:(更灵活、硬件成本低)数据帧含起始位、停止位,数据帧的帧间隔任意(无数据传输线路为高电平)

异步~帧格式:起始位(1位低电平)、数据位、奇偶校验位(可选)、停止位(高电平)

3.校验方式:奇偶校验、代码和校验、循环冗余码校验

4.波特率:每秒传送的二进制位数,单位bps

1波特=1位/秒 异步通信常用每秒传送字节数Bps表示

波特率(bps)=1个字符的二进制位数×字符/秒(Bps)

波特率越高,传输距离越短

5.收/发时钟:用来控制通信设备接收/发送字符数据速度。

收/发时钟与波特率的关系:收/发时钟= n × 波特率

8.2 MCS-51单片机串口结构

两个逻辑同名、物理分开的接收、发送缓冲器SBUF。

起始、停止位由发送控制器自动产生,接收控制器自动舍弃。

串口中断不能自动撤销,需要判断是发/收中断

1.串行口控制寄存器SCON

发送时校验位(第9位)放入TB8 接受时会把校验位数据放入RB8。

双机通讯时一般作为奇偶校验位

双击通信时表示地址/数据帧,TB8=1为地址帧,TB8=0为数据帧。

标志位需要手动清0,TI=1表示发送结束,此时应该将其清零以便下一次发送。

RI=1表示收到数据,此时应该将其清零以便下一次接收。

2.串行口控制寄存器PCON

8.3 MCS-51单片机串口工作方式

常用:方式1、3

8.3.1方式0:

用于并口不够用的情况,没有起始、停止位

RXD:输入或输出引脚。

TXD:移位脉冲输出。

波特率固定为:fosc/12 (fosc:晶振频率)

串入并出:164芯片

CLK端为同步脉冲输入端CLR为控制端,

① 当CLR=0时,允许串行数据从A和B端 输入但是8位并行输出端关闭;

② 当CLR=1时,A和B输入端关闭,但是 允许74LS164中的8位数据并行输出。

并入串出:165芯片

SH/LD:低电平时将并行数据装入,高电平时禁止并行数据读入。

例:编写程序控制8个发光二极管轮流点亮。

*可以同时使用164、165

#include <reg51.h>
#include <stdio.h>
sbit P1_0=0x90;
xdata char nSendByte;
delay( );
main( )
{ 
SCON=0x00; //设置串行口为方式0
EA=1; //全局中断允许
ES=1; //允许串行口中断
nSendByte =1;
SBUF=nSendByte;//点亮第一个LED
P1_0=0;
While(1)
}
void Serial_Port( ) interrupt 4 using 0//串口中断
{
 if(TI==1)/*发送完成,可省,因为该例只有发送结束进入该中断,如果有接收则写if(TI==1)&if(RI==1)*/
{   
P1_0=1; //数据输出(CLR)
delay(500);
P1_0=0; //允许串行数据输入(CLR)
nSendByte<<=1;//移位操作
if(nSendByte==0) nSendByte =1;
SBUF=nSendByte;
	 }
TI=0;//标志位需要手动清0
 } 
void delay( ) { int nCounter; for(nCounter=0;nCounter<128;nCounter++); }

8.3.2方式1:

起始位:1位  数据位:8位  停止位:1位

8.3.3方式2&3:

起始位:1位  数据位:9位(第9位:校验位)  停止位:1位

8.4波特率设置

波特率要选择标称值,由于TH1的初值是整数,为了减小波特率计算误差,晶振频率要选为11.0592MHz。

方式1、3波特率与TH1初值对应关系

8.5串口初始化

确定T1的工作方式(TMOD)

计算T1的初值,装载TH1、TL1

启动T1(置位TR1)

确定串行口工作方式(SCON)

串口中断设置(IE、IP)

8.6串口应用

串行通信接口标准:

1、UART(通用异步串行通信接口)(51采用该标准)

2、RS-232C(属于物理层,首发数据直接被CPU接收,异步、规定了电气特性)

RS-485(差分信号,抗干扰强)

3、USB(通用串行总线接口)(属于数据层)

4、I2C(集成电路间的串行总线)

5、SPI(全双工同步串行外设总线)

6、CAN总线(控制器局域网)

TTL(晶体管-晶体管逻辑电平)计算机和单片机常用。分为标准TTL、高速型TTL(H-TTL)、低功耗型TTL(L-TTL)、肖特基型TTL(S-TTL)、低功耗肖特基型TTL(LS-TTL)五个系列。

RS-232C采用负逻辑电平,规定:

(-3~-25V)为逻辑“1”, (+3~+25V)为逻辑“0”。

第9章 51单片机系统扩展

9.1 系统并行扩展技术

9.1.1片外三总线结构

1.数据线:由P0口提供

2.地址线(16bit):采用P0(低位)口复用方式,在ALE信号时序匹配下,通过外置的数据锁存器,在总线访问前半周期从P0口送出低8位地址,后半周期从P0口送出8位数据。高8位地址则通过P2口送出

“片选”和“单元选择”都是单片机通过地址线一次发出的地址信号来完成选择的。

3.控制线:

PSEN*:作为外部扩展的程序存储器的读选通控制信号(低有效);

RD*和WR*:作为外部扩展的数据存储器和I/O接口寄存器的读、 写选通控制信号;

ALE:作为P0口发出的低8位地址的锁存控制信号。当访问片外存储器时,ALE=1,P0口传输的是地址信息;ALE=0,P0口传输的是数据信息

EA*:为片内、片外程序存储器访问允许控制端

9.1.2地址空间分配

原则:使一个存储单元只对应一个地址

方法:

(1)线选法:直接利用单片机某一高位地址线作为存储器芯片(或I/O接 口芯片)的“片选”控制信号。

电路简单,但是地址空间不连续,存储单元地址不唯一,适用于外扩芯片数目不多的单片机系统的系统扩展。

(2)译码法:使用译码器对51单片机的高位地址进行译码,将译码器的译 码输出作为存储器芯片的片选信号。能有效地利用存储器空间,适于多芯片的存储器扩展。

9.1.3地址锁存器

51单片机受引脚数的限制,P0口兼用数据线和低8位地址,为 了将它们分离出来,需要在单片机外部增加地址锁存器。

9.2程序存储器扩展

EPROM芯片与51单片机的接口设计。
(1) 51单片机的地址线、数据线分别与EPROM芯片的地址线、数
据线相连。
(2) 51单片机的ALE:用于低8位地址锁存控制。
(3) 51单片机的PSEN:片外程序存储器“读选通”控制信号。 接EPROM的OE脚。
(4) EPROM的片选端控制CE*:可采用线选法或译码法

只有一片 CE直接接地即可。

若多片,剩下的P2口作片选。剩下的接口富裕:片选法;不富裕:译码法。

OE固定接入PSEN。

外扩4片16KB的EPROM 27128的电路

A:低地址 B:高地址

例:第一个芯片地址0x0000~0x3fff

9.2数据存储器扩展

线选法扩展

译码法扩展

将片外数据存储器中4000H~40FFH单元全部清“0”

unsigned char xdata databuf [256] _at_0x4000;
void main(void)
{ unsigned char i;
for(i=0; i<256; i++)
databuf [i]=0;

第10章 51单片机与D/A转换器接口

1.分辨率

输入给DAC的单位数字量变化引起的模拟量输出的变化,通常定义为输出满刻度值与2n之比,用1LSB表示。

I0~DI7:8位数字信号输入端
CS: 片选端。 ILE: 数据锁存允许控制端,高电平有效。 WR1:输入寄存器写选通控制端。当CS=0、ILE=1、WR1=0时,8位输入寄存器接收信号(直通);若有一个条件不满足,则锁存数据。
XFER:数据传送控制。 WR2 :DAC寄存器写选通控制端。XFER=0,WR2 =0时,为直通方式;XFER=0,WR2 =1锁存方式。
IOUT1:电流输出1端,输入数字量全“1”时,IOUT1最大, 输入数字量全为“0”时,IOUT1最小。
IOUT2:D/A转换器电流输出2端,IOUT2+IOUT1=常数。
Rfb:外部反馈信号输入端,内部已有反馈电阻Rfb,根据需要也可外接反馈
电阻。
Vcc:电源输入端,可在+5V~+15V范围内。
Vref:参考电源输入端,-10V~+10V。
AGND:模拟信号地。DGND:数字信号地。

接口方法:

单缓冲型接口方法
两个数据缓冲器一个直通,另一个受控。在不要求多路输出同步的情况下,可采用单缓冲方式。
双缓冲型接口方法
两个数据缓冲器都受控。输入寄存器和DAC寄存器各自分配有地址

第11章 51单片机与A/D转换器接口

A/D转换器参数

分辨率:

ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示

量化误差

ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。
量化误差:是由于有限位数字量对模拟量进行量化而引起的误差。
量化误差理论上规定为一个单位分辨率的-1/2 ~ +1/2LSB

ADC0809是CMOS型逐次逼近型A/D转换器,
具有8路模拟量输入通道,数字量输出为8位;
模拟输入电压范畴为0~+5V

ADC0809

最大可以轮流采集8路模拟信号

地址线C是高位 即ADDc ADDb ADDa

START:A/D转换启动信号,高电平有效。

EOC:A/D转换结束信号,输出。0:正在进行转换;1:转换完成。
OE:输出允许信号,高电平有效。OE有效时,三态输出锁存器的转换结果送上数据总线,被CPU读取。

VREF+、VREF-:基准电压输入端。决定输入模拟量的范围。典型值分别为+5V和0V

ADC0809的工作流程:
输入3位地址,使ALE=1,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。
送START高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
当转换结束时,转换的结果送入到输出三态锁存器,EOC信号变为高电平,通知CPU已转换结束。
当CPU执行读数据指令,使OE信号为高电平,从输出端D0~D7读出数据。

A/D转换器与单片机接口设计

A/D转换结束后数据的传送

①定时传送方式;不需接EOC引脚。
②查询方式;测试EOC引脚的状态。
③中断方式:EOC引脚接INT。