51单片机的SCON寄存器与C程序解析
51单片机SCON
![51单片机SCON](https://img.taocdn.com/s3/m/3c4e6a0a16fc700abb68fc78.png)
51单片机的简介——串行口、SCON51单片机有一个全双工串行通讯口,它即可作为UART(Universal AsynchronousReceiver/Transmitter),也可作为一个同步移位寄存器。
而且作为UART时,其具有多机通讯能力。
51单片机的串行口由发送控制、接收控制、波特率输入管理和发送/接收缓冲区SBUF(地址为99H)组成。
SBUF作为发送和接收缓冲区其实际是分开的两个器件,数据不会相互覆盖,但在对其寻址时都是99H,51单片机会根据读或者写指令操作相应的器件。
站在汇编角度来看,51单片机的串行口通讯操作体现为累加器Acc(地址E0H)和发送/接收缓冲区SBUF之间的数据传递。
当我们要发送数据时,对串行口完成初始化设置后,数据由累加器A传入SBUF,然后在发送控制器的控制下组成帧结构,并自动从TXD端口发出,发送结束后置位TI(TI是特殊功能寄存器SCON的可独立寻址位,参见SCON介绍),如果要继续发送就在指令中将TI清0。
接收数据时,相当于对串口完成初始化设置后,数据由SBUF传入累加器Acc,在置位允许位(即设置SCON的独立寻址位REN为1)后才开始进行串行接收操作,在接收控制器控制下,通过移位寄存器将串行数据输入SBUF,接收结束后将RI(SCON中可独立寻址位)置位,最后将数据送累加器Acc。
特殊功能寄存器SCON是串行口控制寄存器,用于存放串行口的控制和状态信息,其地址为98H,具有位寻址功能,其各位的结构如下图所示:其中各个位的功能及含义如下:SM0、SM1:串行口工作方式选择位,其组合含义如下图所示:SM2:多机通讯控制位。
在方式2和方式3中用于多机通讯控制,在方式2、方式3的接收状态中,若SM2=1,当接收到的第9位(同时系统将第9位值赋予RB8)为0时,舍弃接收到的数据,RI置0;若第9位为1时,将接收到的数据送入接收SBUF中,并将RI置1;而对于方式1,接收到有效的停止位时,将RI置1。
c51单片机寄存器功能说明
![c51单片机寄存器功能说明](https://img.taocdn.com/s3/m/17ee792458fb770bf78a55a4.png)
TCON 定时器/计数器控制寄存器↑与定时器有关↑与外部中断有关↑TR0——定时器/计数器T0的运行控制位TR1——T1 TR0=1, 启动定时器/计数器工作TR0=0, 停止定时器/计数器工作TF0——片内定时器/计数器T0溢出中断请求标志位(有请求时为1)TF1——T1IT0——选择外部中断INT0的中断触发方式IT1——INT1 IT0=0为电平触发方式,加到引脚/INT0上的外部中断请求输入信号为低电平有效IT0=1为脉冲触发方式,输入信号电平从高到低的负跳变有效。
INT0可以由软件置1或清0. IE0——外部中断INT0的中断请求标志位(有请求时为1)IE0——INT1 TMOD 定时器/计数器工作方式控制寄存器↑定时器T1 ↑定时器T0 ↑GATE——门控位,控制定时器启动方式GATE=0时,由软件控制位TR0或TR1来控制启动GATE=1时,由外部中断引脚(/INT0或/INT1)上的请求信号高电平来启动定时器/计数器运行C/-T——定时或计数方式选择位C/-T=0 定时工作C/-T=1 计数工作M1、M0工作方式选择位SCON 串行口控制寄存器SM2 ——多级通信控制位。
多用在方式2、方式3中通信控制。
在方式2、方式3的接收状态中,若SM2=1,接收到第9位(RB8)为1时将接收到的数据送接收SBUF中,且置位RI发出中断申请,将RI置1 。
否则RB8为0时舍弃接收到的数据,RI清0;对于方式1,接收到有效停止位时,激活RI;对于方式0,SM2应置0.REN——允许接收位。
REN=1时允许接收,REN由指令置位或复位。
REN=0 禁止串行口接收数据TB8——发送接收数据位8在方式2、方式3中,TB8是第9位发送的数据,多机通信时标明主机发送的是地址还是数据,TB8=0为数据,TB8=1为地址。
TB8由指令置位或复位。
RB8——接收数据位8工作在方式2和3时,RB8存放接收到的第9位数据。
51单片机寄存器详解
![51单片机寄存器详解](https://img.taocdn.com/s3/m/c601f073f524ccbff12184ea.png)
51单片机寄存器详解符号地址功能介绍B F0H B寄存器ACC E0H 累加器PSW D0H 程序状态字IP B8H 中断优先级控制寄存器P3 B0H P3口锁存器IE A8H 中断允许控制寄存器P2 A0H P2口锁存器SBUF 99H 串行口锁存器SCON 98H 串行口控制寄存器P1 90H P1口锁存器TH1 8DH 定时器/计数器1(高8位)TH0 8CH 定时器/计数器1(低8位)TL1 8BH 定时器/计数器0(高8位)TL0 8AH 定时器/计数器0(低8位)TMOD 89H 定时器/计数器方式控制寄存器TCON 88H 定时器/计数器控制寄存器DPH 83H 数据地址指针(高8位)DPL 82H 数据地址指针(低8位)SP 81H 堆栈指针P0 80H P0口锁存器PCON 87H 电源控制寄存器PSW_7PSW_6PSW_5PSW_4PSW_3PSW_2PSW_1PSW_0 CY AC F0 RS1 RS0 OV USR P 状态寄存器:PSWCY 进位标志位AC 辅助进位标志位F0 通用标志位RS1 寄存器组选择位高位RS0 寄存器组选择位低位OV 溢出标志位USR 用户定义标志位P 奇偶标志位PCON_7PCON_6PCON_5PCON_4PCON_3PCON_2PCON_1PCON_0 SMOD - - - GF1 GF0 PDWN IDLE 电源控制寄存器:PCONSMOD 串行口通信波特率控制位置位使波特率翻倍- 保留- 保留- 保留GF1 通用标志位GF0 通用标志位PDWN 低功耗标志位置位进入低功耗模式IDLE 空闲标志位置位进入空闲模式IP_7IP_6IP_5IP_4IP_3IP_2IP_1IP_0- - PT2 PS PT1 PX1 PT0PX0中断优先级寄存器:IP- 保留- 保留PT2 定时器2 中断优先级PS 串行通信中断优先级PT1 定时器1 中断优先级PX1 外部中断1 优先级PT0 定时器0 中断优先级PX0 外部中断0 优先级处理器的状态保存在状态寄存器PSW 中,状态字中包括进位位,用于BCD 码处理的辅助进位位,奇偶标志位,溢出标志位,还有前面提到的用于寄存器组选择的RS0 和RS1。
51单片机多机通信
![51单片机多机通信](https://img.taocdn.com/s3/m/9d5beefd9e31433239689333.png)
一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON 寄存器的SM2位来实现。
当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。
在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
二、多机通信电路图此处,U1作为主机,U2为从机1,U3为从机2。
三、C语言程序(1)主机程序#include<reg51.h>#include<string.h>#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;//延时1ms函数void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化void Buff_init(){unsigned char i; //将Table里的数据放到缓冲区里for(i=0;i<9;i++){Buff[i]= Table[i];delay_1ms(100);}}//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//发送数据函数void SEND_data(unsigned char *Buff){unsigned char i;unsigned char lenth;unsigned char check;lenth=strlen(Buff); //计算数据长度check=lenth;TI=0; //发送数据长度TB8=0; //发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i<lenth;i++) //发送数据{check=check^Buff[i];TB8=0;SBUF=Buff[i];while(!TI);TI=0;}TB8=0; //发送校验字节SBUF=check;while(!TI);TI=0;}//向指定从机地址发送数据void ADDR_data(unsigned addr){while(temp!=addr) //主机等待从机返回其地址作为应答信号{TI=0; //发送从机地址TB8=1; //发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}temp=_ERR_; //主机等待从机数据接收成功信号while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}}}(2)从机1程序#include<reg51.h>#include<string.h>#define addr 0x01//从机1的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff) {unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己的地址作为应答,等待接收数据 TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1]; //查看接收到的数据}}(3)从机2程序#include<reg51.h>#include<string.h>#define addr 0x02//从机2的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2]; //查看接收到的数据}}。
第3章51系列单片机程序设计(C语言部分)
![第3章51系列单片机程序设计(C语言部分)](https://img.taocdn.com/s3/m/361f622059eef8c75fbfb3bc.png)
idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1
C51单片机引脚功能与特殊功能寄存器详解
![C51单片机引脚功能与特殊功能寄存器详解](https://img.taocdn.com/s3/m/c85c31d428ea81c758f578dc.png)
80C51单片机引脚图及引脚功能介绍首先我们来介绍一下单片机的引脚图及引脚功能(如下图所示),引脚的具体功能将在下面详细介绍单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
⒈ 电源:⑴ VCC - 芯片电源,接+5V;⑵ VSS - 接地端;⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
⒊ 控制线:控制线共有4根,⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲① ALE功能:用来锁存P0口送出的低8位地址② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵ PSEN:外ROM读选通信号。
⑶ RST/VPD:复位/备用电源。
① RST(Reset)功能:复位信号输入端。
② VPD功能:在Vcc掉电情况下,接备用电源。
⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。
① EA功能:内外ROM选择端。
② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋ I/O线80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
拿到一块单片机,想要使用它,首先必须要知道怎样去连线,我们用的一块89C51的芯片为例,我们就看一下如何给它连线。
1、电源:这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。
2、振蒎电路:单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶体震荡器,电容,连上就能了,按图1接上即可。
3、复位管脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、 EA管脚:EA管脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。
51串口控制寄存器SCON
![51串口控制寄存器SCON](https://img.taocdn.com/s3/m/fe0f3c56ce2f0066f533229e.png)
串行口控制寄存器(SCON)SCON就是MCS-51单片机得一个可位寻址得专用寄存器,用于串行数据通信得控制。
单元地址为98H,位地址为98H~9FH。
寄存器得内容及位地址表示如下:各位得说明如下:1) SM0 、SM1——串行口工作方式选择位其状态组合与对应工作方式为:SM0 SM1工作方式0 0 方式00 1 方式11 0 方式21 1 方式32) SM2——允许方式2、3得多机通信控制位在方式2与3中,若SM2=1且接收到得第九位数据(RB8)为1,才将接收到得前8位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8位数据。
若SM2=0,则不论第九位数据(RB8)为1还就是为0,都将前8位送入接收SBUF中,并产生中断请求。
方式0时,SM2必须置0。
3) REN——允许接收位REN=0 禁止接收数据REN=1 允许接收数据4) TB8——发送数据位8在方式2、3时,TB8得内容就是要发送得第9位数据,其值由用户通过软件来设置。
5) RB8——接收数据位8在方式2、3时,RB8就是接收得第9位数据。
在方式1时,RB8就是接收得停止位在方式0时,不使用RB86) TI——发送中断标志位在方式0时,发送完第8位数据后,该位由硬件置位在其它方式下,于发送停止位之后,由硬件置位。
因此,TI=1表示帧发送结束,其状态既可供软件查询使用,也可请求中断。
TI由软件清“0”。
7) RI——接收中断标志位在方式0时,接收完第8位数据后,该位由硬件置位。
在其它方式下,于接收到停止位之时,该位由硬件置位。
因此,RI=1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。
RI由软件清“0”。
SCON:串行口控制寄存器寄存器地址98H,位寻址9FH~98H。
位地址9F9E9D9C9B9A9998位符号SM0SM1SM2REN TB8RB8TI RISM0、SM1:串行口工作方式选择位SM2:多机通信控制位REN:允许/禁止串行口接收得控制位TB8:在方式2与方式3中,就是被发送得第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中就是停止位。
51单片机c语言编程基础
![51单片机c语言编程基础](https://img.taocdn.com/s3/m/c9fc752d54270722192e453610661ed9ac515562.png)
51单片机c语言编程基础
51单片机是一款经过广泛应用的单片机,它的编程语言主要
是汇编语言和C语言。
在这里,我会介绍一些基础的51单片
机C语言编程知识。
1. 数据类型:51单片机C语言支持标准的数据类型,如整型、字符型、浮点型等。
可以使用关键字来声明变量,如int、char、float等。
2. 输入输出:通过51单片机的GPIO口可以实现输入和输出
功能。
使用P0口、P1口、P2口等可以进行引脚的输入和输
出操作。
通过赋值语句可以控制引脚的高低电平。
3. 控制语句:和标准C语言一样,51单片机C语言也支持if
语句、while循环、for循环等控制语句。
可以根据需要来实现
逻辑判断和循环控制。
4. 中断:中断是51单片机的重要功能,可以通过中断来响应
外部事件。
使用中断相关的关键字和函数,如EA、EX0、IT0
等来实现中断功能。
5. 存储器访问:51单片机的存储器包括RAM和ROM。
使用
关键字和函数来操作存储器,如xdata、pdata、code等。
可以
进行数据的定义和存取操作。
6. 时钟和定时器:时钟和定时器是单片机的重要部分,可以实现时间和计时功能。
使用关键字和函数来设置时钟和定时器,
如TMOD、THx、TLx等。
以上是51单片机C语言编程的基础知识,掌握了这些内容可以进行一些简单的程序开发。
若想深入了解51单片机C语言编程,还可以学习更多高级的知识,如寄存器的操作、串口通信、外部存储器的应用等。
51系列单片机寄存器详解
![51系列单片机寄存器详解](https://img.taocdn.com/s3/m/533fa0e43c1ec5da50e270ed.png)
AUXR:辅助寄存器字节地址=8EH,不可位寻址- - - WDIDLE DISRTO - - DISALEWDIDLE:WTD在空闲模式下的禁止/允许位当WDIDLE=0时,WDT在空闲模式下继续计数当WDIDLE=1时,WDT在空闲模式下暂停计数DISRTO:禁止/允许WDT溢出时的复位输出当DISRTO=0时,WDT定时器溢出时,在RST引脚输出一个高电平脉冲当DISRT0=1时,RST引脚为输入脚DISALE :ALE禁止/允许位当DISALE=0时,ALE有效,发出恒定频率脉冲当DISALE=1时,ALE仅在CPU执行MOVC和MOVX类指令时有效,不访问外寄存器时,ALE不输出脉冲信号AUXR1:辅助寄存器1字节地址A2,不可位寻- - - -- - - DPSDPS:数据指针寄存器选择位当DPS=0时,选择数据指针寄存器DPRT0DPRT1时,选择数据指针寄存器DPS 当=PSW:程序状态字CY——进位标记AC——半进位标记F0——用户设定标记RS1、RS0——4个工作寄存器区的选择位。
VO——溢出标记P——奇偶校验标记PCON:电源控制器及波特率选择寄存器字节地址=87H,不可位寻址SMOD - - POF GF1 GF0 PD IDLSMOD——波特率倍增位GF1、GF0——用户通用标记PD——掉电方式控制位,PD=1时进入掉电模式IDL——空闲方式控制位,IDL=1时进入空闲方式在AT89S51中PCON.4是电源断电标记位POF,上电是为1IE:中断允许控制寄存器EA:中断允许总控制位当EA=0时,中断总禁止。
当EA=1时,中断总允许后中断的禁止与允许由各中断源的中断允许控制位进行设置。
EX0( EX1):外部中断允许控制位当EX0( EX1)=0 禁止外中断当EX0( EX1)=1 允许外中断ET0(EX1):定时/计数中断允许控制位当ET0(ET1)=0 禁止定时(或计数)中断当ET0(ET1)=1 允许定时(或计数)中断ET2:定时器2中断允许控制位,在AT89S52、AT89C52中ES:串行中断允许控制位当ES=0 禁止串行中断当ES=1 允许串行中断IP:中断优先级控制寄存器PX0——外部中断0优先级设定位PT0——定时中断0优先级设定位PX1——外部中断1优先级设定位PT1——定时中断1优先级设定位PS——串口中断优先级设定位优先级设定位2PT2——定时器SCON:串行口控制寄存器SM0、SM1:串行口工作方式选择位SM2:多机通信控制位REN:允许/禁止串行口接收的控制位TB8:在方式2和方式3中,是被发送的第9位数据,可根据需要由软件置1或清零,也可以作为奇偶校验位,在方式1中是停止位。
51单片机串口通信相关寄存器及设置指引
![51单片机串口通信相关寄存器及设置指引](https://img.taocdn.com/s3/m/e2f07a9a84254b35effd344c.png)
51单片机串口通信相关寄存器及设置指引关键字SBUF:串口数据缓存寄存器SCON:串口通信状态控制寄存器Fosc:晶振的震荡频率PSW:程序状态字寄存器1、SBUF数据缓存寄存器SBUF可直接寻址专用寄存器,是个8位寄存器,不可进行位操作。
字节地址99H。
物理上它是两个寄存器,一个发送寄存器,一个接收寄存器。
写数据到SBUF中时(SBUF = 0x52;),单片机自己会判断是写到发送寄存器。
读取SBUF中数据时(rReg = SBUF;),单片机自己会判断是读取接收寄存器。
接收寄存器是双缓冲的,以避免在接收下一帧数据之前,单片机还来不及响应接收中断,没有把上一帧的数据读取走,而产生两次帧数据重叠问题。
发送寄存器,没有缓冲,发送时单片机直接主动发出数据,不会产生重叠问题。
(扩展知识:为了保持最大的传输速率,一般不需要发送寄存器建立双缓冲功能。
双缓冲功能有别于发送数据队列缓存区。
)2、SCON串口通讯状态控制寄存器SCON可直接寻址专用寄存器,是个8位寄存器,可以进行位操作。
SCON用于控制串行通信的模式选择、接收和发送,标识串口的状态。
SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
系统复位时,SCON的所有位都被清除。
SCON串口通讯状态控制寄存器的格式及各位的功能定义如下:●SM0、SM1SM0和SM1是串口模式选择位。
SM0和SM1编码对应串口4种模式,如下表:●SM2SM2在模式2和模式3中是多机通信的使能位。
在模式0中,SM2必须为0。
在模式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在模式2和模式3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
●RENREN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
51单片机寄存器详解
![51单片机寄存器详解](https://img.taocdn.com/s3/m/1499d77349d7c1c708a1284ac850ad02df800743.png)
51单⽚机寄存器详解定时⽅式寄存器TMOD(地址89H);TMOD被分成两部份,每部份4位。
分别⽤于控制T1和T0。
GATE C/TM1M0GATE C/TM1M01. M1、M0:定时/计数器的⼯作⽅式1. ⼯作⽅式0:13位定时/计数⽅式(8192)。
2. ⼯作⽅式1:16位定时/计数⽅式(65536)。
3. ⼯作⽅式2和⼯作⽅式3, 8位的定时/计数⽅式(256)。
2. 如果C/T为0就是⽤作定时器,如果C/T为1就是⽤作计数器。
3. 门控位GATE(GATE=0与INT0⽆关,GATE=1与INT0有关):1. GATE=0,定时/计数是否⼯作,只取决于TR1。
2. GATE=1,不仅由TR1来控制,⽽且还要受到INT1引脚的控制,只有TR1为1,且INT1引脚也是⾼电平,计数脉冲才得以通过。
定时/计数器控制寄存器TCON(地址88H):定时/计数器外中断TF1TR1TF0TRO IE1IT1IE0IT0TF1/TF0 -定时/计数器溢出标志位。
TR1/TR0 -定时/计数器运⾏控制位。
置位时定时/计数器开始运⾏。
IE1/IE0 -外部中断(INTx)标志位。
IE1/IE0=1是INTx上有中断;IE1/IE0=0硬件复位。
IT1/IT0 -外中断触发类型控制位。
IT1/IT0=1时是下降沿触发中断;IT1/IT0=0时是低电平触发中断。
中断系统:中断允许寄存器IEEA X ET2ES ET1EX1ET0EX0EA -中断总开关,如果它等于0,则所有中断都不允许。
ES -串⾏⼝中断允许ET1-定时器1中断允许EX1-外中断1中断允许ET2-定时器2中断允许ET0-定时器0中断允许EX0-外中断0中断允许中断优先级控制寄存器IPX X PT2PS PT1PX1PT0PX0PT2-T2中断优先控制PS -串⼝中断优先控制PT1-T1中断优先控制PX1-INT1中断优先控制PT0-T0中断优先控制PX0-INT0中断优先控制串⾏通信:串⾏⼝控制寄存器SCON(地址为98H)SM0SM1SMRENTB8RB8TI RISM0、SM1:串⾏⼝⼯作⽅式选择位,其定义如下:SM0、SM1⼯作⽅式功能描述波特率00⽅式08位移位寄存器Fosc/1201⽅式110位UART可变10⽅式211位UART Fosc/64或fosc/3211⽅式311位UART可变其中fosc为晶振频率SM2:多机通讯控制位。
第2章 51单片机的指令系统和C语言
![第2章 51单片机的指令系统和C语言](https://img.taocdn.com/s3/m/0d7e582a69dc5022abea001b.png)
• DB伪指令:DB伪指令用于将以系列数据字节存放到从标号开始的连续字节单元 中,数据字节使用逗号分离,可以是十六进制数,十进制数或者是字符。
• DW伪指令:DW伪指令和DB类似,将系列数据按照双字节格式存放到从标号开 始的连续双字节单单元中,低位地址单元存放低位数据字节,高位地址单元存放 高位数据字节,每双字节之间使用逗号隔开。
• EQU伪指令:EQU伪指令用于给一个表达式的值或者字符串赋予标号,这个标 号可以用作程序地址、数据地址或者立即数。通常的使用格式是“标号 EQU 表 达式”,标号必须是没有使用过的,表达式可以是8位或者16位数据,EQU可以 使用“=”代替。
• 条件转移指令:条件转移指令根据某些条件决定是否修改PC的数值,当条件不 满足时,继续执行PC下面的指令,当条件满足时候跳转到指定指令起始位置。 条件转移指令包括零条件转移指令JNZ、JN,比较转移指令CJNE和减1非零转移 指令DJNZ。
• 子程序转移指令:子程序转移指令包括短调用指令ACALL,长调用指令LCALL 和返回指令RET、RETI。这些指令用于从主程序进入和返回子程序,子程序是指 具有某种功能的公用程序段。子程序转移指令和普通转移指令的最大区别是在调 用前者必须把当前PC数值压入堆栈保存,退出前者时必须从堆栈中将PC值恢复 。
• 选择结构:如果条件为“真”时执行某些语句,如果条件为“假”时执行另外一 些语句。选择语句可以分为单分支结构以及多分支结构,多分支结构又包括串行 多分支结构和并行多分支结构。常用的选择语句有if语句、switch语句,其中if语 句有if…else、if和else if三种形式。
51单片机系列寄存器说明
![51单片机系列寄存器说明](https://img.taocdn.com/s3/m/c7faeef0ba0d4a7302763a19.png)
MSC-51内部寄存器0F0H: *B (B寄存器)说明:X、Y俩无符号8位数相乘,16位积低字节放在X,高字节放在Y;X除Y,商的整数在X,余数在Y。
0E0H: *A (累加器)说明:数据中转,判断等。
0D0H: *PSW (程序状态字)说明:位位地址位功能0 D0 P:累加器A中数据奇偶标志位,1的个数为奇,P=1。
1 D1 -: 未用,可由用户自己定义2 D2 OV:溢出标志位,有溢出OV=1。
3 D3 RS0:寄存器选择低位。
RS1 RS0=00(0区首地址00H),RS1 RS0=01(1区首地址08H)。
4 D4 RS1:寄存器选择高位。
RS1 RS0=10(2区首地址10H),RS1 RS0=11(3区首地址18H)。
5 D5 F0:用户标志位6 D6 AC:半进位标志,操作结果低四位向高四位进、借位时,AC=1。
7 D7 CY:进位标志位,操作结果向最高位有进、借位时,CY=1。
0B8H: *IP (中断优先级控制)说明:位位地址位功能如下0 B8 PX0:确定外部中断INT0优先级别,1=高,0=低。
1 B9 PT0:确定定时器T0优先级别。
2 BA PX1:确定外部中断INT1优先级别。
3 BB PT1:确定定时器T1优先级别。
4 BC PS: 确定串行口优先级别。
5 BD PT2:确定T2优先级别。
(仅8052/32有)6 BE - : 未用7 BF -: 未用0B0H: *P3 (P3口,双向I/O口,有第二功能)说明;位位地址位第一功能位第二功能0 B0 P3.0 RXD:串入口1 B1 P3.1 TXD:串出口2 B2 P3.2 /INT0:外部中断0入3 B3 P3.3 /INT1:外部中断1入4 B4 P3.4 T0:外计数脉冲T0入5 B5 P3.5 T1: 外计数脉冲T1入6 B6 P3.6 /WR:外RAM写选通脉冲出7 B7 P3.7 /RD:外RAM读选通脉冲出0A8H: *IE (中断允许控制)说明:位位地址位功能如下0 A8 EX0:外部0中断,1=允许,0=禁止。
51系列单片机常用内部寄存器结构详细说明
![51系列单片机常用内部寄存器结构详细说明](https://img.taocdn.com/s3/m/ce98edef102de2bd960588b4.png)
bit0 RI
PCON结构 PCON结构:电源控制寄存器 结构 位 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 位名称 SMOD GF1 GF0 PD IDL SMOD:SMOD是串行口波特率倍增位,若SMOD=0; 串口方式1,2,3时,波特率正常。若 SMOD=1,则串行口通信速率按设定速率翻倍. GF1,GF0:两个通用工作标志位,用户可以自由使用 PD:掉电模式设定位;PD=0单片机处于正常工作状态;PD=1 单片机进入掉电(Power Down)模式 ,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU 、定时器、串行口全部停止工作,只有外部中断工作。 IDL:空闲模式设定位;IDL=0 单片机处于正常工作状态;IDL=1 单片机进入空闲(Idle)模式, 除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
bit1 ET0
bit0 EX0
IP结构: IP结构:中断优先寄存器 结构 位 bit7 bit6 位名称 * *
bit5 *
bit4 PS
bit3 PT1
bit2 PX1
bit1 PT0
bit0 PX0
PS:串行IO中断优先级控制位,PS=1,高优先级;PS=0,低优先级; PT1:定时/计数器1优先级控制位,1为高俦优先级,0为低优先级; PX1:外中断1中断优先级控制位,1为高俦优先级,0为低优先级; PT0:定时/计数器0优先级控制位,1为高俦优先级,0为低优先级; PX0:外中断0中断优先级控制位,1为高俦优先级,0为低优先级; 默认中断响应的顺序:INT0>T0>INT1>T1>RI/TI
TCON结构 用于控制定时/计数器的启动和中断申请; 位控制定时器, TCON结构 : 用于控制定时/计数器的启动和中断申请;高4位控制定时器,低4位控制中断 机制位,可位寻址; 机制位,可位寻址; 位 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF0:分别是T0溢出标志位,中断响应后硬件自动清零,禁止中断时要软件清零. TF1:分别是T1溢出标志位,中断响应后硬件自动清零,禁止中断时要软件清零. TR0:分别是T0的运行控制位,为1时运行,为0时停止运行. TR1:分别是T1的运行控制位,为1时运行,为0时停止运行. IE0:分别是INT0的中断标志位,响应中断后硬件自动清零,不需要软件干预. IE1:分别是INT1的中断标志位,响应中断后硬件自动清零,不需要软件干预. IT0:分别描述了INT0的触发方式,0为电平触发,1为脉冲触发。 IT1:分别描述了INT1的触发方式,0为电平触发,1为脉冲触发。
51单片机C语言简介
![51单片机C语言简介](https://img.taocdn.com/s3/m/171b793158fb770bf78a556e.png)
用 途
存储类说明 程序语句 程序语句 数据类型说明 存储类型说明 程序语句 程序语句 程序语句 数据类型说明 程序语句 数据类型说明 存储种类说明 数据类型说明 程序语句 程序语句 程序语句 数据类型说明 数据类型说明 存储种类说明 程序语句 数据类型说明 数据类型说明 运算符 存储种类说明 数据类型说明 程序语句 数据类型说明 数据类型说明 数据类型说明 数据类型说明 数据类型说明 程序语句
C51 是编译器启动命令, EXI2.C 是程序文件名, CODE 和 DEBUG 是编译控制指令。输入完命令后 回车,即可进人编译过程。如果编译过程中未发现 错误,屏幕上会显示出: C51 COMPILATION COMPILETE , 0 WARING(S), 0 ERROR(S) 并产生列表文件 EXI2.LST和目标文件 EXI2.OBJ。 如果编译中发现任何错误,则不产生目标文件,而 将所有的错误信息都在列表文件中表示出来。编译 控制指令CODE使列表文件的后面附加一个汇编语 言文件。编译控制指令 DEBUG 使目标文件中包含 有进行源程序调试时需要的各种符号信息。目标文 件中还包含有可再定位的目标码,以供 L51连接器 作进一步的处理。C51编译器提供了许多不同控制 指令可以完成各种编译控制功能。
C语言程序是由函数所组成的。一个完整的 C语言程序应 包含一个主函数main()和若干个其它功能的函数。函数之间 可以相互调用,但main()函数只能调用其它的功能函数,而 不能被其它函数所调用。功能函数可以是 C语言编译器提供的 库函数,也可以由用户按实际需要自行编写的函数。不管main ()函数处于程序中的什么位臵,程序总是从main()函数开 始执行。一个函数必须预先定义或声明后才能调用。 函数定义或声明位于源程序的预处理命令之后的开始位臵。 函数定义部分包括有函数的存储类型、返回值数据类型、函数 名、形式参数说明等,函数名后面必须跟一个圆括弧(),形 式参数说明在圆括弧()内进行。函数也可以没有形式参数, 如main( )。函数的位臵比较自由。可以由程序设计人员安排在 函数定义后的任意位臵。函数由函数名和一对花括弧‚ {}” 组 成,在‚ {}” 里面的内容就是函数体,如果一个函数有多个 ‚{}”,则最外面的一对‚{}”为函数体的范围。
51单片机寄存器详解
![51单片机寄存器详解](https://img.taocdn.com/s3/m/d32a0dd649649b6648d747b0.png)
定时器/计数器的方式寄存器TMODTMOD是一个8位的特殊功能寄存器,对应的地址是89H,不可位寻址。
TMOD:工作方式控制寄存器寄存器地址89H,不可位寻址。
位序 B7 B6 B5 B4 B3 B2 B1 B0位符号GATE C/T M1 M0 GATE C/T M1 M0GATE——门控位当=0时,以运行TR0(或TR1)启动或禁止定时器、计数器当=1时,以TR0*/INT0(或TR1*/INT1)启动或禁止定时器、计数器GATE=0 以TR0(TR1)启动定时器GATE=1 以INT0(INT1)启动定时器C/T=0 定时/计数工作方式选择位M1M0——工作方式选择位T2MOD:工作方式控制寄存器寄存器地址0C9H,不可位寻址------T2OE DCENT2OE:定时器2输出允许位,当=1时,P1.0/T2引脚输出连续脉冲信号DCEN:当=1时,T2配置成向上向下计数器A 主要完成三个功能:*确T0计数溢出标志位当计数器计数溢出时,该位置“1”。
使用查询方式时,此位作为状态位供cpu查询,但应注意在查询该位有效后应以软件方法及时将该位清“0”。
使用中断方式时,此位作为中断申请标志位,进入中定选择定时器还是计数器;*选择何种工作方式;*是否借用外中断控制定时器和计数器的启停;B TMOD的低4位是控制T0的字段(T0--P3.4 定时器/计数器0外部事件脉冲输入端)TMOD的高4位是控制T1的字段(T1--P3.5定时器/计数器1外部事件脉冲输入端)C 控制字的格式和含义a、 GATE(TMOD.7)分为两种情况:GATE=0,定时器的启停和INT1无关,只取决于TR0;GATE=1,定时器的启停不仅要由TR0来控制,而且要INT1引脚的控制,只有二者都为高电平时定时器才开始工作; b、 C/T(TMOD.6) 分为两种情况:C/T=0,用作定时器;C/T=1,用作计数器; d、 M1(TMOD.5),M0(TMOD.4)用M1,M0来控制定时器/计数器的4种工作方式:*方式0:M1=0,M0=0.13位定时/计数方式*方式1:M1=0,M0=1.16位定时/计数器*方式2,M1=1,M0=0.8位初值自动重新装入的8位定时/计数器*方式3,M1=1,M0=1.仅适用于T0,分为两个8位计数器,T1停止计数定时器/计数器控制寄存器TCONTCON是一个8位的特殊功能寄存器,对应的地址为88H,可为寻址。
51单片机寄存器详解
![51单片机寄存器详解](https://img.taocdn.com/s3/m/d32a0dd649649b6648d747b0.png)
定时器/计数器的方式寄存器TMODTMOD是一个8位的特殊功能寄存器,对应的地址是89H,不可位寻址。
TMOD:工作方式控制寄存器寄存器地址89H,不可位寻址。
位序 B7 B6 B5 B4 B3 B2 B1 B0位符号GATE C/T M1 M0 GATE C/T M1 M0GATE——门控位当=0时,以运行TR0(或TR1)启动或禁止定时器、计数器当=1时,以TR0*/INT0(或TR1*/INT1)启动或禁止定时器、计数器GATE=0 以TR0(TR1)启动定时器GATE=1 以INT0(INT1)启动定时器C/T=0 定时/计数工作方式选择位M1M0——工作方式选择位T2MOD:工作方式控制寄存器寄存器地址0C9H,不可位寻址------T2OE DCENT2OE:定时器2输出允许位,当=1时,P1.0/T2引脚输出连续脉冲信号DCEN:当=1时,T2配置成向上向下计数器A 主要完成三个功能:*确T0计数溢出标志位当计数器计数溢出时,该位置“1”。
使用查询方式时,此位作为状态位供cpu查询,但应注意在查询该位有效后应以软件方法及时将该位清“0”。
使用中断方式时,此位作为中断申请标志位,进入中定选择定时器还是计数器;*选择何种工作方式;*是否借用外中断控制定时器和计数器的启停;B TMOD的低4位是控制T0的字段(T0--P3.4 定时器/计数器0外部事件脉冲输入端)TMOD的高4位是控制T1的字段(T1--P3.5定时器/计数器1外部事件脉冲输入端)C 控制字的格式和含义a、 GATE(TMOD.7)分为两种情况:GATE=0,定时器的启停和INT1无关,只取决于TR0;GATE=1,定时器的启停不仅要由TR0来控制,而且要INT1引脚的控制,只有二者都为高电平时定时器才开始工作; b、 C/T(TMOD.6) 分为两种情况:C/T=0,用作定时器;C/T=1,用作计数器; d、 M1(TMOD.5),M0(TMOD.4)用M1,M0来控制定时器/计数器的4种工作方式:*方式0:M1=0,M0=0.13位定时/计数方式*方式1:M1=0,M0=1.16位定时/计数器*方式2,M1=1,M0=0.8位初值自动重新装入的8位定时/计数器*方式3,M1=1,M0=1.仅适用于T0,分为两个8位计数器,T1停止计数定时器/计数器控制寄存器TCONTCON是一个8位的特殊功能寄存器,对应的地址为88H,可为寻址。
51单片机常用寄存器详解
![51单片机常用寄存器详解](https://img.taocdn.com/s3/m/3153f2f119e8b8f67c1cb9ea.png)
P0 = 0x80;P1 = 0x90;P2 = 0xA0;P3 = 0xB0;PSW = 0xD0;PSW寄存器,全称——程序状态字标志寄存器,是一个8位寄存器。
该寄存器用来存放运算结果的一些特征,如有无进位、借位等。
使用汇编编程是PSW寄存器很有用,但在C语言编程时,编译器会自动控制该寄存器,很少人为操作,仅作了解即可。
D7 D6 D5 D4 D3 D2 D1 D0CY AC F0 RS1 RS0 OV —— P①CY——进位标志位,他表示运算是否有进位(或借位)。
如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0.②AC——辅助进位标志,又称半进位标志,它指两个8位数运算低四位是否有半进位,即低四位相加(或相减)是否进位(或借位),如有AC为1,否则为0.③F0——由用户使用的一个状态标志位,可用软件来使它置1或清0,也可由软件来测试它,以控制程序的流向。
④RS1、RS0——四组工作寄存器选择控制位,在汇编语言中这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区。
⑤OV——溢出标志位,反应带符号数的运算结果是否有溢出。
有溢出时,此位为1,否则为0.⑥P——奇偶标志位,反应累加器ACC内容的奇偶性,如果ACC内中的运算结果有偶数个1,则P为0,否则为1.ACC = 0xE0;B = 0xF0;SP = 0x81;DPL = 0x82;DPH = 0x83;PCON = 0x87;电源管理寄存器,不能位寻址。
PCON用来管理单片机的电源部分,包括上电复位检测、掉电模式、空闲模式等。
单片机复位时PCON全部被清0.为序号D7 D6 D5 D4 D3 D2 D1 D0位符号SMOD SMOD0 LVDF P0F GF1 GF0 PD IDL①SMOD——该位与串口通信波特率有关。
SMOD=0:串口方式为1、2、3时,波特率正常。
SMOD=1:串口方式为1、2、3时,波特率加倍。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51 单片机的SCON 寄存器与C 程序解析
用计算机来控制单片机,进而控制继电器等其他外设,感觉不错啊,怎幺实现呢?一步步来吧。
单片机串行口通信,也就是单片机与计算机之间的通信,要实现,要明白一些基本的概念。
(1)实现之前,请确定串口正常,我之前做过串口操作,烧了不能控制,后来才发现,设备管理器里串口有叹号,驱动有问题,可能是开发实验板没有插好或是换了个USB 口造成的(我用的是串口转USB 的,笔记本用)
(2)串口初始化,这方面,最好有相关的书来的,明白消化定时器与中断,这样操作起来就容易了。
一。
设定串口的工作方式:设定SCON 寄存器。
什幺是SCON 呢?。