8051单片机的基本组成
(1)一个 ** **8 ** **位微处理器 ** **CPU ** **。
(2)片内数据存储器 ** **RAM ** **和特殊功能寄存器 ** **SFR ** **。
(3)片内程序存储器 ** **ROM ** **。
(4 )两个定时/计数器 ** **T0 ** **、 ** **T1 ** **,可用作定时器,也可用以对外部脉冲进行计数。
(5)四个8位可编程的并行 ** **I/O ** **端口,每个端口既可作输入,也可作输出。
(6)一个串行端口,用于数据的串行通信。
(7)中断控制系统。
(8)内部时钟电路。
01 CPU
CPU内部组成;主要由三极管组成的逻辑电路;构成运算器;控制器
三极管原理
** **三极管在cpu中主要作用:开关 ** **(构成逻辑门电路)
三极管的集电极电流在一定范围内随基极电流呈线性变化,这就是放大特性。当基极电流高过此范围时,三极管集电极电流会达到饱和值 (导通),基极电流低于此范围时,三极管会进入截止状态(断路), 这种导通或截止的特性在电路中可起到开关作用;
三极管共有有三种工作方式,根据其可搭建逻辑门电路
** **逻辑非 ** **
** **逻辑与 ** **
** **逻辑或 ** **
根据逻辑门可搭建简单加法器;
1位加法器(也称之为半加法器),
在此基础上可实现全加法器。
在计算机中负数以补码表示;
原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
如单字节的5的反码为:0000 0101;-5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为:0000 0101;-5的原码为1111 1011。
在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。
负数用补码表示,如单字节-5,在计算机中表示为1111 1011。
乘法运算;除法运算均可转化为“+”运行算;最终将数学运算转换成逻辑运算;
运算器
运算器以算术逻辑单元ALU为核心,加上累加器ACC、暂存寄存器TMP和程序状态字寄存器PSW等所组成。ALU主要用于完成二进制数据的算术和逻辑运算,并通过对运算结果的判断影响程序状态字寄存器PSW中有关位的状态。
控制器
控制器包括程序计数器PC、指令寄存器、指令译码器、数据指针DPTR、堆栈指针SP、缓冲器以及定时与控制电路等。控制电路完成指挥控制工作,协调单片机各部分正常工作。
**程序计数器 ** **PC ** : 当一条指令按PC所指向的地址从程序存储器中取出之后,PC的值会自动增量,即指向下一条指令。
**堆栈指针 ** **SP ** : 用来指示堆栈的起始地址。80C51单片机的堆栈位于片内RAM中,而且属于“上长型”堆栈,复位后SP被初始化为07H,使得堆栈实际上由08H单元开始。
指令译码器: 当指令送入指令译码器后,由译码器对该指令进行译码,CPU根据译码器输出的电平信号使定时控制电路产生执行该指令所需要的各种控制信号。
**数据指针寄存器 ** DRTR: 它是一个16位寄存器,由高位字节DPH和低位字节DPL组成,用来存放16位数据存储器的地址,以便对片外64kB的数据RAM区进行读写操作。
02 存储器
程序存储器
程序存储器用于存放用户程序、数据和表格等信息。
STC89C51RC系列单片机内部有
512字节的数据存储器,其在物理和逻辑上都分为两个地址空间:内部RAM(256字节)和内部扩
展RAM(256字节)。另外,STC89C51RC/RD+系列单片机还可以访问在片外扩展的64KB外部
数据存储器。
单片机内部集
成了4K~64K字节的Flash程序存储器。STC89C51RC/RD+系列各种型号单片机的片内程序Flash
存储器的地址如下表所示。
单片机复位后,程序计数器(PC)的内容为0000H,从0000H单元开始执行程序。 STC89C51RC/RD+单片机利用EA引脚来确定是访问片内程序存储器还是访问片外程序存储器。当EA引脚接高电平时,对单片机首先访问片内程序存储器,当PC的内容超过片内程序存储器的地址范围时,系统会自动转到片外程序存储器。当若EA引脚接高电平,单片机首先从片内程序存储器的0000H单元开始执行程序,当PC的内容超过3FFFH时系统自动转到片外程序存储器中取指令。此时外部程序存储器的地址从4000H开始。
中断服务程序的入口地址(又称中断向量由于相邻中断入口地址的间隔区间(8个字节)有限,一般情况下无法保存完整的中断服务程序,因此,一般在中断响应的地址区域存放一条无条件转移指令,指向真正存放中断服务程序的空间去执行。)也位于程序存储器单元。在程序存储器中,每个中断都有一个固定的入口地址,当中断发生并得到响应后,单片机就会自动跳转到相应的中断入口地址去执行程序。外部中断0的中断服务程序的入口地址是0003H,定时器/计数器0中断服务程序的入口地址是000BH,外部中断1的中断服务程序的入口地址是0013H,定时器 /计数器1的中断服务程序的入口地址是001BH等。
内部RAM(数据存储器)
内部RAM共256字节,可分为3个部分:低128字节RAM(与传统51兼容)、高128字节RAM(Intel在8052中扩展了高128字节RAM)及特殊功能寄存器区。低128字节的数据存储器既可直接寻址也可间接寻址。高128字节RAM与特殊功能寄存器区貌似共用相同的地址范围,都使用80H~FFH,地址空间虽然貌似重叠,但物理上是独立的,使用时通过不同的寻址方式加以区分。高128字节RAM只能间接寻址,特殊功能寄存器区只可直接寻址。
低128字节RAM也称通用RAM区。通用RAM区又可分为工作寄存器组区,可位寻址区,用户 RAM区和堆栈区。工作寄存器组区地址从00H~1FH共32B(字节)单元,分为4组(每一组称为一个寄存器组),每组包含8个8位的工作寄存器,编号均为R0 ~ R7,但属于不同的物理空间。通过使用工作寄存器组,可以提高运算速度。R0~R7是常用的寄存器,提供4组是因为1组往往不够用。程序状态字PSW寄存器中的RS1和RS0组合决定当前使用的工作寄存器组。见下面PSW寄存器的介绍。可位寻址区的地址从20H ~ 2FH共16个字节单元。20H—2FH单元既可向普通RAM单元一样按字节存取,也可以对单元中的任何一位单独存取,共128位,所对应的地址范围是00H—7FH。位地址范围是00H—-7FH,内部RAM低128字节的地址也是00H–7FH;从外表看,二者地址是一样的,实际上二者具有本质的区别;位地址指向的是一个位,而字节地址指向的是 一个字节单元,在程序中使用不同的指令区分。内部RAM中的30H~FFH单元是用户RAM和堆栈区。一个8位的堆栈指针(SP),用于指向堆栈区。单片机复位后,堆栈指针SP为07H,指向了工作寄存器组0中的R7,因此,用户初始化程序都应对SP设置初值,一般设置在80H以后的单元为宜。
03 时钟电路
单片机时钟电路通常有两种形式:
1.内部振荡方式:8051单片机片内有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。把放大器与作为反馈元件的晶体振荡器或陶瓷谐振器连接,就构成了内部自激振荡器并产生振荡时钟脉冲。
2.外部振荡方式:外部振荡方式就是把外部已有的时钟信号引入单片机内。
1.振荡周期:为单片机提供时钟信号的振荡源的周期。
2.时钟周期:振荡源信号经二分频后形成的时钟脉冲信号,为振荡周期的2倍。
3.机器周期:完成一个基本操作所需的时间,通常为12个振荡周期。
4.指令周期:指CPU执行一条指令所需要 的时间,一个指令周期通常含有1~4个 机器周期。
外接晶振为12MHz四个周期的具体值
振荡周期=1/12μs
时钟周期=1/6μs
机器周期=1μs
指令周期=1~4μs
04 中断系统
中断寄存器
中断允许寄存器IE和XICON
中断优先级控制寄存器IP/XICON和IPH
PX3H, PX3: 外部中断3优先级控制位。
当PX3H=0且PX3=0时,外部中断3为最低优先级中断(优先级0)
当PX3H=0且PX3=1时,外部中断3为较低优先级中断(优先级1)
当PX3H=1且PX3=0时,外部中断3为较高优先级中断(优先级2)
当PX3H=1且PX3=1时,外部中断3为最高优先级中断(优先级3)
PX2H, PX2: 外部中断2优先级控制位。
当PX2H=0且PX2=0时,外部中断2为最低优先级中断(优先级0)
当PX2H=0且PX2=1时,外部中断2为较低优先级中断(优先级1)
当PX2H=1且PX2=0时,外部中断2为较高优先级中断(优先级2)
当PX2H=1且PX2=1时,外部中断2为最高优先级中断(优先级3)
PT2H, PT2: 定时器2中断优先级控制位。
当PT2H=0且PT2=0时,定时器2中断为最低优先级中断(优先级0)
当PT2H=0且PT2=1时,定时器2中断为较低优先级中断(优先级1)
当PT2H=1且PT2=0时,定时器2中断为较高优先级中断(优先级2)
当PT2H=1且PT2=1时,定时器2中断为最高优先级中断(优先级3)
PSH, PS: 串口1中断优先级控制位。
当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)
当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)
当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)
当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)
PT1H, PT1: 定时器1中断优先级控制位。
当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0)
当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1)
当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2)
当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3)
PX1H, PX1: 外部中断1优先级控制位。
当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0)
当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1)
当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2)
当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3)
PT0H, PT0: 定时器0中断优先级控制位。
当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0)
当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1)
当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2)
当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3)
PX0H, PX0: 外部中断0优先级控制位。
当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0)
当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1)
当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2)
当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0”。但IP寄存器可
位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节
操作指令来更新。STC89C51RC/RD+系列单片机复位后IP和IPH均为00H,各个中断源均为低
优先级中断。
05 定时器/计数器
定时器/计数器 0/1
定时器相关寄存器
定时器0;
三种工作方式;均可实现
模式0;(13位定时器/计数器)
模式下的3位寄存器包含TH0全部8个位及TL0的低5位。TL0的高3位不定
模式1(16位定时器/计数器)
此模式下,定时器配置为16位定时器/计数器,由TL0的8位和TH0的8位所构成。TL0的8位溢出向TH0进位,TH0计数溢出置位TCON中的溢出标志位TF0。
模式2—自动装载模式(8位定时器/计数器)
TL0的溢出不仅置位TF0,而且将TH0内容重新装入TL0,TH0内容由软件预置,重装时TH0内容不变。
#include "reg52.h"typedef unsigned int u16;//对系统默认数据类型进行重定义typedef unsigned char u8;sbit LED=P2^5;u8 i=0;void main(){TMOD=0xf0;//设置T0为工作方式0TH0=0XE3; //1msTL0=0X30;/*Timer0工作在模式0下时为13位定时/计数器,TL0只使用前5位,*/ EA=1;//开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1);//程序停止,等待中断请求}/******T0中断函数******/void Timer0()interrupt 1{TH0=0;TL0=0;i++;while(i>=216){ }}/*/*******************************************************************************/*///void timer1()//{//EA=1; //打开总中断//ET0=1;//打开定时器0 中断允许//TMOD|=0X01; //选择为定时器0 模式,工作方式1//16位计数,TH0*8,TL0*8////TH0=0XFC; //给定时器赋初值,定时1ms//1000是1ms//TL0=0X18;//TR0=1;//打开定时器//定时器被允许后,从初值开始+1到溢出;//}//void main()//{////timer1();//timer0();////timer2();//while(1)//{//////}//}1 1011 1010 1110//void timer_interrupt1_0() interrupt 1 //定时器中断1//{//static u16 i;//定义静态变量iTH0=0XFC; //给定时器赋初值,定时1ms//工作方式1TL0=0X66;////TH0=0Xdd; //给定时器赋初值,定时1ms//工作方式0//TL0=0X0e;//i++;//if(i==1000)//{//i=0;//LED=!LED;//}//}/*/**********************************************************************************/*///工作方式2//sbit led1=P2^0;//uint num;// //void TIM0init(void)//{// TMOD=0x02;//设置定时器0为工作方式2// TH0=0; //装入初值// TL0=0;// EA=1;//开总中断// ET0=1; //开定时器中断// TR0=1; //启动定时器0//}// //void T0_time()interrupt 1//{// //相比上面的方式0,这里不需要认为加入重装初值的代码// num++;//}////void main()//{//TIM0init(); //while(1)//{//if(num==3600) //如果到了3600,说明1秒时间到从0开始,3600次到1秒//{// num=0;// led1=~led1; //让发光管状态取反//}//}//}
06 I/O
并行端口
8051单片机有4个双向并行的8位I/O口P0~P3。P0口为三态双向口,可驱动8个TTL电路,P1、P2、P3口为准双向口(作为输入时,需要先向口锁存器写入1,故称为准双向口),其负载能力为4个TTL电路。
串行端口
工作方式0
工作方式1波特率可变
当软件设置SCON的SM0、SM1为“01”时,串行通信则以模式1工作。此模式为8位
UART格式,一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。波特率可
变,即可根据需要进行设置。TxD(TxD/P3.1)为发送信息,RxD(RxD/P3.0)为接收端接收信息,
串行口为全双工接受/发送串行口。
模式1的发送过程:串行通信模式发送时,数据由串行发送端TxD输出。当主机执行一条
写“SBUF“的指令就启动串行通信的发送,写“SBUF”信号还把“1”装入发送移位寄存器
的第9位,并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。
移位寄存器将数据不断右移送TxD端口发送,在数据的左边不断移入“0”作补充。当
数据的最高位移到移位寄存器的输出位置,紧跟其后的是第9位“1”,在它的左边各位全为
“0”,这个状态条件,使TX控制单元作最后一次移位输出,然后使允许发送信号“SEND”
失效,完成一帧信息的发送,并置位中断请求位TI,即TI=1,向主机请求中断处理。
#include "reg52.h"typedef unsigned int u16;//对系统默认数据类型进行重定义typedef unsigned char u8;//串口助手发送数据给单片机,单片机原封不动转发给串口助手显示//注意事项:使用黄色跳线帽将CH340旁的P5端子的UTX和P30短接,URX和P31短接,出厂默认已短接好/******************************************************************************** 函 数 名 : uart_init* 函数功能 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间* 输入 : baud:波特率对应的TH、TL装载值* 输出 : 无*******************************************************************************/void uart_init(u8 baud){TMOD|=0X20;//设置计数器工作方式2SCON=0X50;//设置为工作方式1PCON=0X80;//波特率加倍TH1=baud;//计数器初始值设置TL1=baud;ES=1;//打开接收中断EA=1;//打开总中断TR1=1;//打开计数器}/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*******************************************************************************/void main(){uart_init(0XFA);//波特率为9600while(1){}}void uart() interrupt 4 //串口通信中断函数{u8 rec_data;RI = 0;//清除接收中断标志位rec_data=SBUF;//存储接收到的数据SBUF=rec_data;//将接收到的数据放入到发送寄存器while(!TI);//等待发送数据完成TI=0;//清除发送完成标志位}
工作方式2 波特率固定
工作方式3 波特率可变(实现多机通信)
当SM0、SM1两位为11时,即串行口工作在模式3;
其一帧的信息由11位组成:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位发送时可编程位(第9位数据)由SCON中的TB8提供,可软件设置为1或0,或
者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位,又可作
为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD为发送端口,RxD为接收端
口,以全双工模式进行接收/发送。
其波特率计算方式;
模式3和模式1相比,除发送时由TB8提供给移位寄存器第9数据位不同外,
其余功能结构均基本相同,其接收发送操作过程及时序也基本相同。
当接收器接收完一帧信息后必须同时满足下列条件:
·RI=0
·SM2=0( 或SM2=1,并且接收到的第9数据位RB8=1。)多机通信RB8,区分地址/数据
当上述两条件同时足时,将接收到的移位寄存器的数据装入SBUF和RB8中,并置位
RI=1,向主机请求中断处理。如果上述条件有一个不满足,则刚接收到移位寄存器中的数据无
效而丢失,也不置位RI。无论上述条件满足与否,接收器又重新开始 检测RxD输入端口的跳变
信息,接收下一帧的输入信息。
在模式3中,接收到的停止位与SBUF、RB8和RI无关。(硬件实现)
模式3多机通信
模式3,主机向从机发送广播数据;1个起始位,8个数据位存地址,第九位TB8=1(地址帧为1,数据帧为0),;终止;从机们收到后;进入中断服务程序;将8位数据位的地址与自身比较;若相同则发送应答ack信号;并且;SM2=0;用以接收数据,若不同则仍SM2=1;
主机接着发送数据帧;此时除SM2=0(应答从机);其他从机都不会进入中断服务程序;接收不到数据帧;