导图社区 单片机原理及应用思维导图
时钟电路与时序,复位电路,最小系统,看门狗功能 介绍,低功耗节电模式、C51的数据类型和存储类型、SFR及位变量的定义。
编辑于2022-10-03 15:37:30 山西单片机原理及应用
2,单片机硬件结构
1,硬件组成
AT89S52单片机的硬件组成:8位CPU,数据存储器(256BRAM),程序存储器(8KB FROM),4个8位I/O口,3个16位定时器,一个全双工的通用异步收发串行口,6个中断源和6个中断向量,32个SFR,一个看门狗WDT,空闲模式 掉电模式 中断恢复模式。
2,引脚功能
举例40引脚的DIP封装 1,电源引脚。 Vcc(40) 接+5V电源 Vss(20)接地 2,时钟引脚。 XTAL1(19)片内时钟振荡器的反相放大器的输入端,使用时外接石英晶体和微调电容。当使用外部独立时钟振荡器时,该脚接独立时钟振荡器的输出信号。 XTAL2(20)片内时钟振荡器反相放大器的输出端,使用时外接石英晶体和微调电容,当使用片外独立时钟振荡器时该引脚悬空。 3,控制引脚。1,RST(9) 复位信号的输入端,高电平有效,加上持续时间大于2个机器周期的高电平就可复位。当看门狗溢出时会给该引脚输出长达96个时钟振荡周期的高电平,使其复位。 4,EA非/Vpp(31) EA非是第一功能:外部程序存储器访问允许控制端。当EA非=1可访问内部+外部的程序存储器。当EA非=0时,只访问外部存储器 Vpp是第二功能:对片内Flash进行编程时,该引脚接入编程电压。 5,ALE/PROG非(30) ALE为地址锁存控制器信号端是第一功能:P0口是作为低八位地址总线与八位数据总线分时复用。 PROG非是第二功能:对片内F程序存储器编程时,该引脚接编程脉冲输入端。 6,PSEN非,访问片外程序存储器的读选通信号,低电平有效。 7,I/O口。
3,CPU
1,运算器
运算器朱主要用来对操作数进行算术,逻辑和位操作运算。 包括:算术逻辑运算单元ALU,累加器A,位处理器,程序状态字寄存器PSW,以及两个暂存器等。 1,ALU,对八位变量进行逻辑运算,循环,求补和清零等操作,还可以进行基本算术运算,还可以位操作,对位变量进行位处理,例如置一,清零,求补,以及逻辑运算。 2,累加器A,一个八位寄存器32个特殊功能寄存器中的一个。 功能如下:1,是ALU单元的输入数据源之一,又是ALU运算结果的存放单元。 2,CPU中的数据传送大多通过A累加器,所以A累加器相当于数据中转站。 最后,A累加器的进位位cy处在PSW中,它是特殊的,因为它也是位处理器的位累加器。 3,PSW。 程序状态字寄存器 它位于片内的特殊功能寄存器区,字节地址是D0H。 PSW.7 Cy 进位标志位,在执行逻辑运算或者算术运算指令时,如果最高位有进位或借位,则Cy=1,否则Cy=0.在位处理器中,它又是位累加器。 PSW.6 Ac 辅助进位标志位,在运算时当D3向D4位产生进位或借位时,Ac=1,否则Ac=0. PSW.5 F0 用户使用的标志位 PSW.4 PSW.3 四组工作寄存器区选择控制位1和位0 这两位用于来选择片内RAM区中的四组工作寄存器区中的某一组来作为当前工作寄存器区。 RS1 RS0 0 0 0区 片内RAM 地址00H~07H 0 1 1区 片内RAM 地址08H~0FH 1 0 2区 片内RAM 地址10H~17H 1 1 3区 片内RAM 地址18H~1FH PSW.2 OV 溢出标志位 执行算术指令时,OV表示运算结果是否产生溢出,产生则OV=1,否则OV=0. PSW.1 保留位,不用。 PSW.0 P 奇偶标志位 表示执行指令后,A累加器中1的个数是奇数还是偶数。 P=1,则A累加器中1是奇数个 P=0,则为偶数个。
2,控制器
主要任务是识别指令,并根据指令的性质控制单片机片内个部件,从而保证各部分能自动的协调工作。 主要包括程序计数器,指令寄存器,指令译码器,定时及控制电路等。 功能是控制指令的读入,译码和执行。 程序计数器PC 控制器中最基本的寄存器,是程序存储器的地址指针,PC是一个独立的16位计数器,不能直接用指令对PC进行访问,当单片机复位时,PC的内容变为0000H,即CPU从程序存储器0000H单元读取指令,开始执行程序。 CPU总是按照PC的指向对指令序列进行取指,译码和执行,就是说,最终是PC决定了程序运行的流向。 当执行指令时,CPU自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,使PC总是指向下一条将要被取指的指令地址。当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。
4,存储器
ROM
AT89S52片内有8KB的F存储器,地址范围是0000H~1FFFH;拥有16位地址总线,可外扩的程序存储器空间最大位64KB,地址位0000H~FFFFH。 使用时注意: 1,CPU访问片内还是片外由EA非上的电平决定,当EA非=1时,访问片内+片外;当EA非=0时,只访问片外。 2,程序存储器的某些单元被固定用于各中断源的中断服务程序的入口地址。 6个固定单元分别对应于各中断源的中断服务子程序的中断入口。 中断源 入口地址 外部中断0 0003H 定时器计数器T0 000BH 外部中断1 0013H 定时器计数器T1 001BH 串行口 0023H 定时器计数器T2 002BH
RAM
数据存储器空间 片内数据存储器 片内RAM共有256个单元,字节地址是00H~FFH 00H~1FH的32个单元是四组工作寄存器区,每组含有8B的工作寄存器,编号是R0~R7。可通过PSW中的RS1和RS0对其进行选择 20H~2FH是可位寻址区,有16个单元128位,可进行位寻址也可字节寻址(一个字节是八位) 30H~7FH是用户RAM区,只能进行字节寻址,用作存放数据以及作为堆栈区使用。 80H~FFH 即使特殊功能寄存器区的地址空间,又是增加的128B的RAM单元地址,作为用户RAM区,只能通过间接寻址访问 片内256B不够用时可外扩64KB的片外RAM,片内的256B和片外的低256B的地址是相同的,但这是两个不同的数据存储区
SFR
特殊功能寄存器区的单元地址在80H~FFH,共32个 部分SFR 1,堆栈指针SP SP的内容指示出堆栈顶部在片内RAM区中的位置,它可指向片内RAM 00H~FFH的任何单元。AT89S52的堆栈属于向上生长型,遵循先进后出。单片机复位后,SP中的内容位07H,使得堆栈实际从08H开始,考虑到要使用1到3组的工作寄存器,一般在复位后首先要把SP改为60H或其他值,以避免堆栈和工作寄存器区发生冲突。 堆栈主要作用是为子程序调用和中断操作而设立的。有以下两个功能:保护断点和现场保护。 1,保护断点 子程序调用和中断操作,主程序会被打断,但最终要回到断点地址处继续执行程序,因此,要预先吧主程序的断点地址在堆栈中保护起来,为程序的正确返回做准备。 2,现场保护 在子程序调用和中断操作时,很可能要用到单片机中的一些寄存器单元,就会破坏这些寄存器中的原有内容,所以在执行子程序调用和中断操作前,要把有关寄存器单元的内容保存起来,送入堆栈,这就是现场保护。 堆栈的操作有数据压入堆栈和数据弹出堆栈两种。 2,寄存器B 单片机在进行乘除操作时要使用寄存器B,不执行乘除时可把寄存器B当做一个普通的寄存器使用。 乘法运算时,乘数分别放在A累加器和B中,乘积放在BA中,B中放高八位,A中放低八位。 除法运算时,被除数取自A,除数取自B,商放在A中,余数放在B中。即A/B=A...B 3,AUXR寄存器 AUXR是辅助寄存器 地址是8EH, D0 是DISALE:ALE的禁止允许位。 0:允许发出ALE脉冲 1:ALE脉冲仅在CPU访问外部存储器是有效,不访问外部存储器是,ALE不输出脉冲信号,以减少对外部电路的干扰 D3 DISRTO:禁止或允许看门狗定时器溢出时的复位输出 0:看门狗溢出时,允许RST引脚输出一个高电平脉冲,使单片机复位 1:禁止看门狗溢出时的复位输出 D4 WDIDLE:WDT在空闲模式下的禁止允许控制位 0:允许WDT在空闲模式下计数 1:禁止 4,数据指针DPTR0和DPTR1 5,AUXR1寄存位 6,看门狗定时器WDT 包含一个14位计数器和看门狗复位寄存器,当程序陷入死循环或跑飞时,看门狗回发出脉冲使单片机复位
位地址空间
位地址空间分为两部分,分别位于片内RAM和SFR区域中,共有219个可寻址位,位地址范围为00H~FFH。其中00H~7FH的128位处于片内RAM字节地址的20H~2FH。 SFR中的可寻址位离散的分布在特殊功能寄存器区字节地址的80H~FFH,共91个可寻址位。
5,I/O口
P0口,字节地址80H,位地址80H~87H。 1,P0口用作系统的地址/数据总线用 2,P0口用作通用I/O口 P1口,字节地址90H,位地址90H~97H,只作为通用I/O口使用 P2口,字节地址A0H,位地址为A0H~A7H, 1,作为高八位地址总线口 2,用作通用I/O口 P3口,字节地址为B0H,位地址为B0H~B7H。 1,用作第二输入/输出功能 2,用作通用I/O口
6,时钟电路与时序,复位电路,最小系统,看门狗功能介绍,低功耗节电模式
AT89S52的最高时钟频率是33MHz 时钟周期是单片机时钟控制信号的基本时间单位。时钟周期为“时钟晶体的振荡频率分之一”寄T=1/f 机器周期是CPU完成一个基本操作所需要的时间为机器周期。指令周期是执行一条指令所需的时间。单片机中常把执行一条指令的过程分为几个机器周期。AT89S52单片机每12个时钟周期为一个机器周期。 指令分为单字节,双字节,三字节,简单的单字节和双字节一般需要单周期和双机器周期,三字节指令都是双机器周期,只有乘除指令的执行需要四个机器周期。
3,C51编程语言
C51的数据类型和存储类型
1,数据类型 signed char 8位 1字节 -128~127 unsigned char 8位 1字节 0~255 signed int 16位 2 -32768~32767 unsigned int 16 2 0~65535 signed long 32 4 -2147483648~2147483647 unsigned long 32 4 0~4294967295 float 64 8 double 64 8 * 8~24 1~3 对象指针 下面是C51特有的几种数据类型 bit 1 0或1 sfr 8 1 0~255 sfr16 16 2 0~65535 sbit 1 可进行位寻址的特殊功能寄存器的某位的绝 对地址 特有的数据类型的说明 SFR,sfr数据类型占用一个内存单元,利用他可以访问8051单片机内部的所有特殊功能寄存器,例如“sfr P1=0x90;”这句定义了P1在片内的寄存器地址。后续语句中可以用P1=0xff,使得P1的所有引脚输出高电平。 SFR16,占用两个内存单元,和SFR作用一样 SBIT,sbit是指8051片内特殊功能寄存器的可寻址位。 例如:sfr PSW=0xd0;//定义PSW寄存器地址为0xd0 sbit 0V=PSW^2;//定义OV位为PSW^2 2,数据存储类型 存储区 存储类型 与存储空间的对应关系 DATA data 片内RAM直接寻址区,位于低128字节 BDATA bdata 片内RAM位寻址区,位于20H~2FH空间 IDATA idata 片内RAM的256字节,必须间接寻址的存储区 XDATA xdata 片外64KB的RAM空间,使用@DPTR间接寻址 PDATA pdata 片外RAM的256字节,使用@Ri间接寻址 CODE code 程序存储器,使用DPTR寻址 BDATA区中不允许声明float 和double 型变量 [
SFR及位变量的定义
特殊功能寄存器的C51语言定义 1,使用关键字定义sfr。 语法: sfr 特殊功能寄存器名字 = 特殊功能寄存器地址; 例如;sfr IE=0xA8;//中断允许寄存器地址A8H. sfr TCON=0x88;//定时器/计数器控制寄存器地址88H. 2,通过头文件访问sfr。 3,特殊功能寄存器中的位定义 对SFR中的可位寻址的访问,要使用关键字来定义可寻址位,有三种方法 1),sbit 位名=特殊功能寄存器^位置 对寄存器的某一位进行定义 sfr PSW=0xd0; sbit CY=PSW^7; sbit OV=PSW^2; 2),sbit 位名=字节地址^位置 sbit CY=0xd0^7; sbit OV=0xd0^2; 3)sbit 位名=位地址 sbit CY=0xd7; sbit OV=0xd2; 位地址必须在80H~FFH 位变量的C51语言定义 1,采用关键字bit定义位变量,一般格式为:bit bit_name 例如:bit ov_flag;//将ov_flag定义为位变量 bit lock_pointer;//………… 2,函数可包含类型为bit的参数,也可将其作为返回值 bit func(bit b0,bit b1);//位变量b0与b1作为函数func的参数 { ………… return(b1); } 3,位变量定义的限制,位变量不能用来定义指针和函数。
绝对地址访问
1,绝对宏 2_at_关键字 使用关键字_at_可对指定的存储器空间的绝对地址进行访问,格式: [存储器类型]数据类型说明符 变量名 _at_地址常数 定义的变量必须为全局变量,地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内。 例子: 把片内RAM40H单元开始的八个单元内容清零 data unsigned char buffer[8]_at_ 0x40; void main(void) { unsigned char j; for(j=0;j<8;j++) {buffer[j]=0; } }
基本运算及选择循环程序结构
基本运算 1,算术运算符 2,逻辑运算符 3,关系运算符 4,位运算 5,指针和取地址运算符 C51的分支与循环结构 1,分支控制语句 if语句基础结构 if(表达式){语句} 三种形式的if语句 形式一 if(表达式){语句;} 形式二 if(表达式){语句1;}else{语句二;} 形式三 if(表达式){语句1;}else if(表达式){语句2;}…… else{语句n;} switch语句 switch(表达式) {case 常量表达式1:{语句1;}break; case 常量表达式2:{语句2;}break; …… case 常量表达式n:{语句n;}break; default:{语句n+1;} 2,循环控制语句 while循环 while(表达式) { 循环体语句; } do-while语句 do {循环体语句; } while(表达式); for循环 for(表达式1;表达式2;表达式3) {循环体语句;} break 跳出循环 continue 停止当前循环,进行下一个循环
数组及指针
数组 一维数组 类型说明符 数组名[元素个数]; 二维数组 类型说明符 数组名[行数] [列数]; 字符数组 char a[10]; 指针 通用指针 数据类型 *指针变量 例如:uchar *pz; 存储器指针 char xdata *str;
C51的函数
函数的分类
函数分类 1,标准库函数 2,用户自定义函数 1)无参函数 定义形式 返回值类型标识符 函数名() { 函数体; } 有参函数 返回值类型标识符 函数名(形式参数列表) 形式参数说明 { 函数体; } 空函数 返回值类型标识符 函数名() {}
函数的参数及返回值
参数分为形参和实参 形参是函数的函数名后面括号中的变量名称为形式参数 实参是在函数调用时,主调函数名后面括号中的表达式称为实际函数。
函数的调用
函数调用的一般方式 函数名 {实际参数列表} 函数调用的方式 1,函数调用语句把被调函数的函数名作为主调函数的一个语句 例如print_message(); 2,函数结果作为表达式的一个运算对象 result=2*gcd (a,b); 3,作为另一个函数的实际参数 m=max(a,gcd (u,v));
中断服务函数
函数类型 函数名(形式参数名)interrupt n using n
变量及存储方式
宏定义与文件包含
库函数
4,keil proteus 使用
5,应用系统设计
LED数码管
流水灯实验,从上向下流水,在写程序时uchar是替换了unsigned char, unit替换了 unsigned int,语句 #define uchar unsigned char #define unit unsigned int 循环移位函数一crol-和_cror-例如左移位是将低位向高位移最高位补在低位,1111 1110 →11111101右移是 11111110→01111111 移位运算符》《,左移《是将高位丢弃低位补0例如11111111 → 11111110
开关检测
1 ,延时函数 void delay() { uchar i,j; for(i =0;i< 255;i++)for(j=0; j< 255; j+ + )} 2.开关检测1的主函数 void main() { uchar temp; P1=0xff; temp=P1&0xf0; temp=temp>>4; P1=temp; delay(); } 开关检测2主函数 void main() {char state; do { P1=0xff; state=P1; state=state&0x03; switch(state) { case 0:P2=0x01;break; case 1:P2=0x02;break; case 2:P2=0x04;break; case 3:P2=0x08;break; } }while(1); } 3. 屏蔽某几位口在例子中有 Temp=P1 &oxfo;屏蔽其低 四位, 再送入temp中 State = state & 0xo3;屏蔽p 1口中高 6位。
LED点阵显示屏显示
延时函数 void delay(uint i) { uchar t; while(i--) { for(t=0;t<120;t++); } } 数码管在proteus 里的名字是7SEG 16*16LED显示 1,列码的显示规则 例如11000000 00001111,是C0到C15的列码,0x03 C7到C0是00000011 加到列线上是11000000,0xf0 C15到C8是 11110000 加到列线上是00001111 2程序 三重for循环 uchar i,j,n; while(1) { for(j=0;j<4;j++) { for(n=0;n<40;n++) { for(i=0;i<16;i++) { out1=i%16; out0=string[i*2+j*32]; out2=string[i*2+j*32+1]; delay(4); out0=0xff; out2=0xff; } } } } }
键盘接口设计
独立按键的工作原理 1,首先判断是否有按键按下,将接有四个按键的P1口低位写入1,是P1口的低四位为输入状态。然后读入低四位的电平,只要不全为1,则说明有键按下。读取方式为: P1=0xff; if((P1&0x0f)!=0x0f); 不是0x0f则说明某位为0按键按下 2,按键去抖动 当判别有按键按下时,调用软件延时子程序,延时约为10ms后再进行判别,若有按键确实按下,则执行相应的按键功能,否则重新开始进行扫描。 3,获取键值 确认有键按下时,可采用扫描方法,来判断哪个键按下,并获取键值。
6,中断系统
中断系统的结构
中断系统共有6种请求源,2个中断优先级, 可实现两级中断服务嵌套。 1. 中断请求源6种. 非INF0,外部中断请求0,中断请求信号由非INFO引脚输入,中断请求标为 IEO 非INT1,外部中断请求1,中断请求信号由非INT 1引脚输入,中断请求标志为IE1 定时器/计数器T0计数溢出发出的中断请求.中断请求 标志为TF0 定时器/计数器T1计数溢出发出的中断请求,中断请标志为TF1 串行口中断请求,中断请求标志为寄存器scon中的发送中断T1或接收中断RI 定时器/计数器T2的中断请求,含有计数溢出(TF2)和捕捉 (EXF2)两种中断清求标志,经或门共用一个中断向量,两种中断触发是由T2的两种不同工作方式决定的。 2,中断请求标志寄存器 1, TCON寄存器,有6个标志位。 Tf1,片内定时器/计数器T1的溢出中断请求标志位 TF0, To的溢出标志位 IE1,外部中断请求1的中断请求标志位 IE0,外部中断请求0的中断请求标志位 IT1,选择外部中断请求1为跳沿触发还是电平触发 当IT1 =0,为电平触发 当IT1 =1,为跳沿触发 IT0, 选择外部中断0为跳沿触发还是电平触发 3, scon寄存器 有两个标志位TI和RI TI,串行口的发送中断请求标志位 RI,串行口接收中断请求标志位 4, T2CON具有TF2和EXF2两个中断请求标志位
中断允许与中断优先级的控制
中断允许寄存器IE,具有7个控制位 EA,中断允许总开关控制位, EA=0,中断请求被屏蔽, EA=1,中断请求被开放。 ET2,T2的中断允许位。 ET2=0,禁止T2中断,ET2=1,允许T2中断。 Es串行口中断允许位。ES=0,禁止串行口中断, Es=1,允许串行口中断。 ET1, T1的 溢出中断允许位。 ET1=0禁止,ET1 =1,允许。 EX1,外部中断1中断允许位。EX1 =0,禁止,EX1= 1,允许 EX0,外部中断0中断允许位。Ex0= 0,禁止,Ex0= 1,允许 ET0, T0的溢出中断允许位。 中断优先寄存器IP,各控制位,等于1为高优先级 ,等于0为低优先级, PT2 PS PT1 PX1 PT0 PX0
响应中断请求的条件
1,总中断允许开关接通 ,即 EA=1 2,该中断源发出中断请求、即该中断源对应的中断请求标志为1。 3. 该中断源的中断允许位=1 ,即该中断被允许。例如Ex0= 1。 4,无同级或更高级中断正在被服务。 中断函数 void 函数名() interrupt n using m n是中断号 m是工作寄存器区 n 从0到5分别对应着外部中断0,定时器T0,外部中断1,定时器T1,串行口,定时器T2
外部中断使用
#include<reg51.h> #define uchar unsigned char #define uint unsigned int void delay(uint i) { uint j; for(;i>0;i--) for(j=0;j<333;j++); ‘ } void main() { EA=1; EX0=1; IT0=1; while(1) { P1=0; } } void int0() interrupt 0 using 0 { uchar m; EX0=0; for(m=0;m<5;m++) { P1=0x0f; delay(400); P1=0xf0; delay(400); EX0=1; } }
7,定时器和计数器
T0和T1的结构和工作方式
定时器/计数器T0,T1 四种工作方式 TMOD用于控制定时器的工作模式和工作方式 TCON用于控制定时器的启动和停止计数,同时包含T0,T1的状态 第一步:配置工作方式寄存器—TMOD 1 M1,M0  2 GATE,门控位 当GATE=0,仅由运行控制位TRx来控制定时器/计数器运行 当GATE=1,用外中断引脚(非INT0或非INT1)上的电平与运行控制位TRx共同来控制定时器/计数器运行。 3 C/非T 计数器模式和定时器模式选择位 C/非T=0;为定时器工作模式 C/非T=1;为计数器工作模式 第二步:赋初值 —— THx、TLx 计算定时器T0的计数初值 定时时间=(2^16(65536)-X)*12/晶振频率,X换成16进制 或 65536-机器周期=Y,再将Y换成16进制 1、采用方式1 使用定时器0的方式1,定时1ms。因为1ms = 1000us。故,65536 - 1000=64536 。即为16进制的TH0/1=0xfc,TL0/1=0x18。 2、采用方式2定时 使用定时器0的方式2,定时0.1ms。因为0.1ms = 100us。故,256 - 100 = 246 。即为16进制的 TH0/1=0xf6,TL0/1=0xf6 。 第三步:配置控制寄存器——TCON  TF1一定时器1溢出标志位。 当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器的中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。 TR1-定时器1运行控制位。 由软件清0关闭定时器1。当GATE=1,且INT1为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。 TFO-定时器0溢出标志,其功能及操作方法同TF1。 TRO-定时器0运行控制位,其功能及操作方法同TR1. IE1-外部中断1请求标志。 当IT1=0时,为电平触发方式,每个机器周期的S5P2采样lNT1引脚,若INT1脚为低电平,则置1,否则IE1清0。 当IT1=1时,INT1为跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,则IE1置1。IE1=1,表示外部中断1正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清0。 IT1-外部中断1触发方式选择位。 IT1=0,为电平触发方式,引脚INT1.上低电平有效。 IT1=1,为跳变沿触发方式,引脚INT1.上的电平从高到低的负跳变有效。 IE0一外部中断0请求标志,其功能及操作方法同IE1。 IT0–外部中断0触发方式选择位,其功能及操作方法同IT1。 第四步:开总中断——EA = 1; 方式0和一要在中断函数中重新赋值 方式二不需要重新赋值
T2的结构与工作方式
1 定时器2控制寄存器T2CON 定时器2是一个16位定时器/计数器,通过设置特殊功能寄存器T2CON中的C/T2位,可将其作为定时器或计数器。定时器2有3中模式:捕获、自动重新装载(递增或递减计数)和波特率发生器,这3种模式由T2CON进行设置。T2CON寄存器的字节地址为C8H,单片机复位时T2CON全部被清0,T2CON的定义如下表所示。 定时器2控制寄存器T2CON TF2—定时器2溢出标志位。 定时器2溢出时置位,必须由软件清0。当RCLK=1或TCLK=1时,TF2将不会置位。 EXF2—定时器2外部标志。 当EXEN2=1且T2EX(单片机的P1.1口)的负跳变产生捕捉或重装时,EXF2置位。定时器2中断使能时,EXF2=1将使CPU进入定时器2的中断服务程序。EXF2必须用软件清0。在递增/递减计数器模式(DCEN=1)中,EXF2不会引起中断。 RCLK—接收时钟标志。 RCLK=1时,定时器2的溢出脉冲作为串行口模式1或模式3的接收时钟;RCLK=0时,定时器1的溢出脉冲作为接收时钟。 TCLK—发送时钟标志。 TCLK=1时,定时器2的溢出脉冲作为串行口模式1或模式3的发送时钟;TCLK=0时,定时器1的溢出脉冲作为发送时钟。 EXEN2—定时器2外部使能标志。 当EXEN2=1且定时器2未用作串行口时钟时,允许T2EX引脚的负跳变产生捕获或重装;当EXEN2=0时,T2EX引脚的负跳变对定时器2无效。 TR2—定时器2启动/停止控制位。 这一位置1时启动定时器2,清0则停止定时器2。 C/T2—T2的定时器/计数器选择位。 C/T2 =1时,设置为外部事件计数器(下降沿触发);C/T2 =0时,设置为内部定时器。 CP/RL2—捕获/重装标志。 CP/RL2=1且EXEN2=1时,T2EX引脚的负跳变产生捕获。 CP/RL2=0且EXEN2=0时,定时器2的溢出或T2EX引脚的负跳变都可以使定时器自动重装。当RCLK=1或TCLK=1时,该位无效,且定时器强制为溢出时自动重装。  2 定时器2模式控制寄存器T2MOD  3 定时器2的三种模式 (1)捕获模式 (2)自动重装模式(递增/递减计数器 (3)波特率发生器模式
8,串行口
基础
1,串行通讯基础 1并行通讯,多条数据线共同传输 2串行通讯,发送时把并行数据转换成串行数据,接收时把串行转换成并行数据 2,同步串行通讯和异步串行通讯 根据收发双方是否使用同步时钟分成这两种 3串行通讯的传输模式 1单工,2半双工,3全双工 4,串行通讯的错误校验 1奇偶校验,2循环冗余码校验
结构

四种工作方式
方式0为同步移位寄存器输入 /输出方式。这种分式不用于两个单片机之间的异步串行通信而是单片机外接移位寄存器、用来扩展并行IO口。 8位一帧,无起始位和停止位,波特率固定,为f(Osc)/12。 方式0输出的工作原理 当 单片机执行将数据写入发送缓冲器SBUF的指令时,产生一个脉冲,串行口开始把SBUF中的8位数据以f(Osc)/12的固定波特率从RXD引脚串行输出,低位在先.TXD引脚输出同步移位脉冲,当8位数据发送完,中断标志位T1置1。 接收的工作原理 在单片机接收数据前,先从 P1.0 引脚发出一个低电平信号到74LS165 的引脚,让74LS165锁存由D7~D0端输入的8位数据,然后单片机内部执行读SBUF指令,与此同时,单片机的TXD端送移位脉冲到74LS165的CLK1引脚,在移位脉冲的控制下,74LS165中的数据逐位从RXD端送入单片机,单片机接收数据完毕,SCON寄存器的接收中断标志位RI自动置“1”。 在方式0中,串行通信口发送和接收数据的波特率都是fosc/12。 方式1 当SCON寄存器中的SM0=0、SM1=1时,串行通信口工作在方式1。 在方式1时,串行通信口可以发送和接收每帧10位的串行数据。其中TXD端用来发送数据,RXD端用来接收数据。 在方式1中,一帧数据中有10位,包括1位起始位(低电平)、8位数据位(低位在前)和1位停止位(高电平)。在方式1时,串行通信口又分两种工作情况:发送数据和接收数据。 方式1-发送数据 在发送数据时,若执行写SBUF指令,发送控制器在移位脉冲(由定时器/计数器T1产生的信号再经16或32分频而得到)的控制下,先从TXD端送出一个起始位(低电平),然后再逐位将8位数据从 TXD 端送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。 方式1-接收数据 在方式1时,需要设置SCON中的REN=1,串行通信口才允许接收数据。由于不知道外部设备何时会发送数据,所以串行通信口会不断检测RXD端,当检测到RXD端有负跳变(由“1”变为“0”)时,说明外部设备发来了数据的起始位,于是启动RXD端接收,将输入的8位数据逐位移入内部的输入移位寄存器。8位数据全部进入输入移位寄存器后,如果满足RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的数据停止位为“1”也可以)的条件,输入移位寄存器中的8位数据才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就会被置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,如果条件不满足,输入移位寄存器中的数据将无法送入SBUF而丢弃,重新等待接收新的数据。 方式2 当SCON寄存器中的SM0=1、SM1=0时,串行通信口工作在方式2。 在方式2时,串行通信口可以发送和接收每帧11位的串行数据,其中1位起始位、8位数据位、1位可编程位和1位停止位。TXD端用来发送数据,RXD端用来接收数据。 在方式2时,串行通信口又分两种工作情况:发送数据和接收数据。 方式2-发送数据 在方式2时,发送的一帧数据有11位,其中有9位数据,第9位数据取自SCON中的TB8位。在发送数据前,先用软件设置TB8位的值,然后执行写SBUF指令(如MOV SBUF,A),发送控制器在内部移位脉冲的控制下,从TXD端送出一个起始位(低电平),然后逐位送出8位数据,再从TB8位中取出第9位并送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。 方式2-接收数据 在方式2时,同样需设置SCON的REN=1,串行通信口才允许接收数据,然后不断检测RXD端是否有负跳变(由“1”变为“0”),若有,说明外部设备发来了数据的起始位,于是启动RXD端接收数据。当8位数据全部进入输入移位寄存器后,如果RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的第9位数据为“1”也可以),输入移位寄存器中的8位数据才可以送入SBUF,第9位会放进SCON的RB8位,同时RI位置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,否则输入移位寄存器中的数据将无法送入SBUF而丢弃。 方式3 当SCON中的SM0=1、SM1=1时,串行通信口工作在方式3。方式3与方式2一样,传送的一帧数据都为11位,工作原理也相同,两者的区别仅在于波特率不同,方式2的波特率固定为fosc/64或fosc/32,而方式3的波特率则可以设置。
波特率计算
方式0的波特率 = fosc/12 方式2的波特率 =(2^SMOD/64)· fosc 方式1的波特率 =(2^SMOD/32)·(T1溢出率) 方式3的波特率 =(2^SMOD/32)·(T1溢出率)
多机通讯
9 10 11,接口技术
并行扩展
系统并行扩展技术 主要包括数据存储器扩展,程序存储器扩展和IO接口的扩展。AT89S52采用哈佛结构开形成了两个并行的外部存储空间。并行扩展是通过系总线把AT89S52与各扩展器件接起来。因此,要并行扩展先要构造系统总线。 按功能系统总线分为3组 1,地址总线2数据总线3控制总线 P0口既用作低8位地址总线,又用作数据总线(分时复用),At 89s52单片机对外部扩展的存储器单元或io接口寄存器进行访问时,先发出低八位地址送地址锁存器锁存,锁存器输出作为系统的低八位地址。随后p0口又作为数据总线口。 P2口的口线作为高位地址总线 控制总线包括:非PSEN,非WR,非RD,ALE
串行扩展