(1)SCON是一個(gè)特殊功能寄存器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志:
SCON 位 7 6 5 4 3 2 1 0
位于98h SM0 SM1 SM2 REN TB8 RB8TI RI
1.SM0與SM1是工作方式控制位
2.SM2與方式有關(guān),一般只用方式1所以,SM2一般用不到,
3.REN,允許串行接收位。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。
4.TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用??梢杂米鲾?shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。
在方式0和方式1中,該位未用。
5.RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。
6.TI,發(fā)送中斷標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行發(fā)送停止位的開始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請。
7.RI,接收中斷標(biāo)志位。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請。
#### 如果使用方式一的話,只要設(shè)置SM0=0,SM1=1選擇方式一;REN=1啟動(dòng)串行口接收數(shù)據(jù);TI跟RI,在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請。
(2)PCON中只有一位SMOD與串行口工作有關(guān):
SMOD(PCON.7)波特率倍增位。在串行口方式1、方式2、方式3時(shí),波特率與SMOD有關(guān),當(dāng)SMOD=1時(shí),波特率提高一倍。復(fù)位時(shí),SMOD=0。
SBUF可讀可寫
串行口工作之前,應(yīng)對其進(jìn)行初始化,主要是設(shè)置產(chǎn)生波特率的定時(shí)器1、串行口控制和中斷控制。具體步驟如下:
§確定T1的工作方式(編程TMOD寄存器);/*TMOD寄存器 有8位,低4位是控制定時(shí)器0的,高四位是控制定時(shí)器1的,分別為GATE(初始化時(shí)候是0,不用管它)、C/t(定時(shí)計(jì)數(shù)選擇位,0位定時(shí)器)、M1、M0(工作方式選擇位)*/
§計(jì)算T1的初值,裝載TH1、TL1; /*T1溢出率= fosc /{12×[256-(TH1)]} 其中fosc為單片機(jī)的主頻*/
§啟動(dòng)T1(編程TCON中的TR1位);
§確定串行口控制(編程SCON寄存器);
串行口在中斷方式工作時(shí),要進(jìn)行中斷設(shè)置(編程IE、IP寄存器)。
方式0的波特率= fosc/12
方式2的波特率=(2SMOD/64)· fosc
方式1的波特率=(2SMOD/32)·(T1溢出率)
方式3的波特率=(2SMOD/32)·(T1溢出率)
IE寄存器:
EA:全局中斷允許位,要想打開任何中斷,EA都必須為1.然后再允許某個(gè)特定的中斷。
ES:串行口中斷允許。ES=1時(shí),串口接收或者發(fā)送完成數(shù)據(jù)以后會(huì)引起中斷(TI=1,或者RI=1)
ET1:定時(shí)計(jì)數(shù)器1中斷允許。ET1=1時(shí),當(dāng)定時(shí)計(jì)數(shù)器1計(jì)數(shù)滿,溢出后引起中斷,可在中斷函數(shù)中處理定時(shí)器。
EX1:外部中斷1允許位。EX=1時(shí),外部條邊沿(或者電平)中斷信號(hào)來后,會(huì)引起外部中斷,可在外部中斷函數(shù)中處理事件。
ET0/EX0功能跟上面一樣,只是換了個(gè)定時(shí)器或者外部中斷。
中斷優(yōu)先級(jí)寄存器IP
#includeunsignedcharflag,a;voidmain(){TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;while(1){/*if(RI==1){RI=0;P1=SBUF;}*/if(flag==1){ES=0;flag=0;SBUF='1';//28;while(!TI);TI=0;SBUF='2';//28;while(!TI);TI=0;SBUF='3';//28;while(!TI);TI=0;ES=1;}}}voidser()interrupt4{RI=0;//P1=SBUF;a=SBUF;flag=1;}
/*2012年3月21日21:23:36:此程序?yàn)橛纱谡{(diào)試工具向單片機(jī)發(fā)送數(shù)據(jù),單片機(jī)通過led燈顯示發(fā)送的數(shù)據(jù)如發(fā)送ff,則燈全滅發(fā)送fe,點(diǎn)亮第一個(gè)燈*/#includevoidinit();voidmain(){init();while(1){if(RI==1)//串行接收完畢時(shí),由內(nèi)部硬件使RI置1。檢測是否接受完畢{P2=SBUF;//接收完畢后將接收到的SBUF賦給P2口}}}voidinit()//定時(shí)器及串口初始化{TMOD=0x20;//設(shè)置定時(shí)器1為工作方式2TH1=0xfd;//定時(shí)器裝初值TL1=0xfd;TR1=1;//開定時(shí)器REN=1;//(SCON寄存器中)允許串行接收SM0=0;//設(shè)置工作方式控制位,選擇為工作方式1SM1=1;EA=1;//開總中斷ES=1;//開串口中斷}voidser()interrupt4//中斷關(guān)服務(wù)函數(shù){RI=0;/*串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請,須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請。*/P2=SBUF;//將接收數(shù)據(jù)緩沖器SBUF中接受的數(shù)據(jù)傳給P2口}