STC12C5A60S2 雙串口通信
STC12C5A60S2單片機(jī)是一款功能比較強(qiáng)大的單片機(jī),它擁有兩個全雙工串行通信接口,串口1的功能及操作與傳統(tǒng)51單片機(jī)串行口相同;特殊的是STC12C5A60S2單片機(jī)內(nèi)部有一個獨(dú)立波特率發(fā)生器,串口1可以使用定時器1作為波特率發(fā)生器,也可以使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器;而串口2只能使用獨(dú)立波特率發(fā)生器作為波特率發(fā)生器。
下面是一段雙串口通信的程序:
/***********************************************************************時間:2012.11.24芯片:STC12C5A60S2晶振:22.1184MHz波特率:9600bps引腳定義:串行口1:發(fā)送————TxD/P3.1;接收————RxD/P3.0串行口2:發(fā)送————TxD2/P1.3;接收————RxD2/P1.2功能描述:STC12雙串口通信(中斷方式)當(dāng)串行口1接收數(shù)據(jù)后,將此數(shù)據(jù)由串行口2發(fā)送出去當(dāng)串行口2接收數(shù)據(jù)后,將此數(shù)據(jù)由串行口1發(fā)送出去***********************************************************************/#include#defineS2RI0x01//串口2接收中斷請求標(biāo)志位#defineS2TI0x02//串口2發(fā)送中斷請求標(biāo)志位unsignedcharflag1,flag2,temp1,temp2;/****************串行口初始化函數(shù)****************/voidInitUART(void){TMOD=0x20;//定時器1工作在方式28位自動重裝SCON=0x50;//串口1工作在方式110位異步收發(fā)REN=1允許接收TH1=0xFA;//定時器1初值TL1=TH1;TR1=1;//定時器1開始計數(shù)EA=1;//開總中斷ES=1;//開串口1中斷S2CON=0x50;//串口2工作在方式110位異步收發(fā)S2REN=1允許接收BRT=0xFA;//獨(dú)立波特率發(fā)生器初值A(chǔ)UXR=0x10;//BRTR=1獨(dú)立波特率發(fā)生器開始計數(shù)IE2=0x01;//開串口2中斷ES2=1}/****************串行口1發(fā)送****************/voidUART_1SendOneByte(unsignedcharc){SBUF=c;while(!TI);//若TI=0,在此等待TI=0;}/****************串行口2發(fā)送****************/voidUART_2SendOneByte(unsignedcharc){S2BUF=c;while(!(S2CON&S2TI));//若S2TI=0,在此等待S2CON&=~S2TI;//S2TI=0}/*****************主函數(shù)******************/voidmain(void){InitUART();//串行口初始化while(1){//如果串口1接收到數(shù)據(jù),將此數(shù)據(jù)由串口2發(fā)送if(flag1==1){flag1=0;UART_2SendOneByte(temp1);}//如果串口2接收到數(shù)據(jù),將此數(shù)據(jù)由串口1發(fā)送if(flag2==1){flag2=0;UART_2SendOneByte(temp2);}}}/************串行口1中斷處理函數(shù)*************/voidUART_1Interrupt(void)interrupt4{if(RI==1){RI=0;flag1=1;temp1=SBUF;}}/************串行口2中斷處理函數(shù)*************/voidUART_2Interrupt(void)interrupt8{if(S2CON&S2RI){S2CON&=~S2RI;flag2=1;temp2=S2BUF;}}
12C5A60S2.h的頭文件如下:
//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)內(nèi)核特殊功能寄存器C51CoreSFRs//76543210ResetValuesfrACC=0xE0;//Accumulator0000,0000sfrB=0xF0;//BRegister0000,0000sfrPSW=0xD0;//ProgramStatusWordCYACF0RS1RS0OVF1P0000,0000//-----------------------------------sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;//-----------------------------------sfrSP=0x81;//StackPointer0000,0111sfrDPL=0x82;//DataPointerLowByte0000,0000sfrDPH=0x83;//DataPointerHighByte0000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)系統(tǒng)管理特殊功能寄存器//76543210ResetValuesfrPCON=0x87;//PowerControlSMODSMOD0LVDFPOFGF1GF0PDIDL0001,0000//76543210ResetValuesfrAUXR=0x8E;//AuxiliaryRegisterT0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS0000,0000//-----------------------------------sfrAUXR1=0xA2;//AuxiliaryRegister1-PCA_P4SPI_P4S2_P4GF2ADRJ-DPS0000,0000/*PCA_P4:0,缺省PCA在P1口1,PCA/PWM從P1口切換到P4口:ECI從P1.2切換到P4.1口,PCA0/PWM0從P1.3切換到P4.2口PCA1/PWM1從P1.4切換到P4.3口SPI_P4:0,缺省SPI在P1口1,SPI從P1口切換到P4口:SPICLK從P1.7切換到P4.3口MISO從P1.6切換到P4.2口MOSI從P1.5切換到P4.1口SS從P1.4切換到P4.0口S2_P4:0,缺省UART2在P1口1,UART2從P1口切換到P4口:TxD2從P1.3切換到P4.3口RxD2從P1.2切換到P4.2口GF2:通用標(biāo)志位ADRJ:0,10位A/D轉(zhuǎn)換結(jié)果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器1,10位A/D轉(zhuǎn)換結(jié)果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器DPS:0,使用缺省數(shù)據(jù)指針DPTR01,使用另一個數(shù)據(jù)指針DPTR1*///-----------------------------------sfrWAKE_CLKO=0x8F;//附加的SFRWAK1_CLKO/*76543210ResetValuePCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKE_T1CLKOT0CLKO0000,0000Bb7-PCAWAKEUP:PCA中斷可喚醒powerdown。b6-RXD_PIN_IE:當(dāng)P3.0(RXD)下降沿置位RI時可喚醒powerdown(必須打開相應(yīng)中斷)。b5-T1_PIN_IE:當(dāng)T1腳下降沿置位T1中斷標(biāo)志時可喚醒powerdown(必須打開相應(yīng)中斷)。b4-T0_PIN_IE:當(dāng)T0腳下降沿置位T0中斷標(biāo)志時可喚醒powerdown(必須打開相應(yīng)中斷)。b3-LVD_WAKE:當(dāng)CMPIN腳低電平置位LVD中斷標(biāo)志時可喚醒powerdown(必須打開相應(yīng)中斷)。b2-b1-T1CLKO:允許T1CKO(P3.5)腳輸出T1溢出脈沖,F(xiàn)ck1=1/2T1溢出率b0-T0CLKO:允許T0CKO(P3.4)腳輸出T0溢出脈沖,F(xiàn)ck0=1/2T1溢出率*///-----------------------------------sfrCLK_DIV=0x97;//ClockDivder-----CLKS2CLKS1CLKS0xxxx,x000//-----------------------------------sfrBUS_SPEED=0xA1;//Stretchregister--ALES1ALES0-RWS2RWS1RWS0xx10,x011/*ALES1andALES0:00:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisoneclockcycle01:TheP0addresssetuptimeandholdtimetoALEnegativeedgeistwoclockcycles.10:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisthreeclockcycles.(default)11:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisfourclockcycles.RWS2,RWS1,RWS0:000:TheMOVXread/writepulseis1clockcycle.001:TheMOVXread/writepulseis2clockcycles.010:TheMOVXread/writepulseis3clockcycles.011:TheMOVXread/writepulseis4clockcycles.(default)100:TheMOVXread/writepulseis5clockcycles.101:TheMOVXread/writepulseis6clockcycles.110:TheMOVXread/writepulseis7clockcycles.111:TheMOVXread/writepulseis8clockcycles.*///--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)中斷特殊功能寄存器//有的中斷控制、中斷標(biāo)志位散布在其它特殊功能寄存器中,這些位在位地址中定義//其中有的位無位尋址能力,請參閱新一代1T8051系列單片機(jī)中文指南//76543210ResetValuesfrIE=0xA8;//中斷控制寄存器EAELVDEADCESET1EX1ET0EX00x00,0000//-----------------------sbitEA=IE^7;sbitELVD=IE^6;//低壓監(jiān)測中斷允許位sbitEADC=IE^5;//ADC中斷允許位sbitES=IE^4;sbitET1=IE^3;sbitEX1=IE^2;sbitET0=IE^1;sbitEX0=IE^0;//-----------------------sfrIE2=0xAF;//AuxiliaryInterrupt------ESPIES20000,0000B//-----------------------//76543210ResetValuesfrIP=0xB8;//中斷優(yōu)先級低位PPCAPLVDPADCPSPT1PX1PT0PX00000,0000//--------sbitPPCA=IP^7;//PCA模塊中斷優(yōu)先級sbitPLVD=IP^6;//低壓監(jiān)測中斷優(yōu)先級sbitPADC=IP^5;//ADC中斷優(yōu)先級sbitPS=IP^4;sbitPT1=IP^3;sbitPX1=IP^2;sbitPT0=IP^1;sbitPX0=IP^0;//-----------------------//76543210ResetValuesfrIPH=0xB7;//中斷優(yōu)先級高位PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0H0000,0000sfrIP2=0xB5;//------PSPIPS2xxxx,xx00sfrIPH2=0xB6;//------PSPIHPS2Hxxxx,xx00//-----------------------//新一代1T8051系列單片機(jī)I/O口特殊功能寄存器//76543210ResetValuesfrP0=0x80;//8bitPort0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.01111,1111sfrP0M0=0x94;//0000,0000sfrP0M1=0x93;//0000,0000sfrP1=0x90;//8bitPort1P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.01111,1111sfrP1M0=0x92;//0000,0000sfrP1M1=0x91;//0000,0000sfrP1ASF=0x9D;//P1analogspecialfunctionsfrP2=0xA0;//8bitPort2P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.01111,1111sfrP2M0=0x96;//0000,0000sfrP2M1=0x95;//0000,0000sfrP3=0xB0;//8bitPort3P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.01111,1111sfrP3M0=0xB2;//0000,0000sfrP3M1=0xB1;//0000,0000sfrP4=0xC0;//8bitPort4P4.7P4.6P4.5P4.4P4.3P4.2P4.1P4.01111,1111sfrP4M0=0xB4;//0000,0000sfrP4M1=0xB3;//0000,0000//76543210ResetValuesfrP4SW=0xBB;//Port-4switch-LVD_P4.6ALE_P4.5NA_P4.4----x000,xxxxsfrP5=0xC8;//8bitPort5----P5.3P5.2P5.1P5.0xxxx,1111sfrP5M0=0xCA;//0000,0000sfrP5M1=0xC9;//0000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)定時器特殊功能寄存器//76543210ResetValuesfrTCON=0x88;//T0/T1ControlTF1TR1TF0TR0IE1IT1IE0IT00000,0000//-----------------------------------sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;//-----------------------------------sfrTMOD=0x89;//T0/T1ModesGATE1C/T1M1_1M1_0GATE0C/T0M0_1M0_00000,0000sfrTL0=0x8A;//T0LowByte0000,0000sfrTH0=0x8C;//T0HighByte0000,0000sfrTL1=0x8B;//T1LowByte0000,0000sfrTH1=0x8D;//T1HighByte0000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)串行口特殊功能寄存器//76543210ResetValuesfrSCON=0x98;//SerialControlSM0/FESM1SM2RENTB8RB8TIRI0000,0000//-----------------------------------sbitSM0=SCON^7;//SM0/FEsbitSM1=SCON^6;sbitSM2=SCON^5;sbitREN=SCON^4;sbitTB8=SCON^3;sbitRB8=SCON^2;sbitTI=SCON^1;sbitRI=SCON^0;//-----------------------------------sfrSBUF=0x99;//SerialDataBufferxxxx,xxxxsfrSADEN=0xB9;//SlaveAddressMask0000,0000sfrSADDR=0xA9;//SlaveAddress0000,0000//-----------------------------------//76543210ResetValuesfrS2CON=0x9A;//S2ControlS2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI00000000BsfrS2BUF=0x9B;//S2SerialBufferxxxx,xxxxsfrBRT=0x9C;//S2Baud-RateTimer0000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)看門狗定時器特殊功能寄存器sfrWDT_CONTR=0xC1;//Watch-Dog-TimerControlregister//76543210ResetValue//WDT_FLAG-EN_WDTCLR_WDTIDLE_WDTPS2PS1PS0xx00,0000//-----------------------//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)PCA/PWM特殊功能寄存器//76543210ResetValuesfrCCON=0xD8;//PCA控制寄存器。CFCR----CCF1CCF000xx,xx00//-----------------------sbitCF=CCON^7;//PCA計數(shù)器溢出標(biāo)志,由硬件或軟件置位,必須由軟件清0。sbitCR=CCON^6;//1:允許PCA計數(shù)器計數(shù),必須由軟件清0。//-//-sbitCCF1=CCON^1;//PCA模塊1中斷標(biāo)志,由硬件置位,必須由軟件清0。sbitCCF0=CCON^0;//PCA模塊0中斷標(biāo)志,由硬件置位,必須由軟件清0。//-----------------------sfrCMOD=0xD9;//PCA工作模式寄存器。CIDL---CPS2CPS1CPS0ECF0xxx,x000/*CIDL:idle狀態(tài)時PCA計數(shù)器是否繼續(xù)計數(shù),0:繼續(xù)計數(shù),1:停止計數(shù)。CPS2:PCA計數(shù)器脈沖源選擇位2。CPS1:PCA計數(shù)器脈沖源選擇位1。CPS0:PCA計數(shù)器脈沖源選擇位0。CPS2CPS1CPS0000系統(tǒng)時鐘頻率fosc/12。001系統(tǒng)時鐘頻率fosc/2。010Timer0溢出。011由ECI/P3.4腳輸入的外部時鐘,最大fosc/2。100系統(tǒng)時鐘頻率,F(xiàn)osc/1101系統(tǒng)時鐘頻率/4,F(xiàn)osc/4110系統(tǒng)時鐘頻率/6,F(xiàn)osc/6111系統(tǒng)時鐘頻率/8,F(xiàn)osc/8ECF:PCA計數(shù)器溢出中斷允許位,1--允許CF(CCON.7)產(chǎn)生中斷。*///-----------------------sfrCL=0xE9;//PCA計數(shù)器低位0000,0000sfrCH=0xF9;//PCA計數(shù)器高位0000,0000//-----------------------//76543210ResetValuesfrCCAPM0=0xDA;//PCA模塊0PWM寄存器-ECOM0CAPP0CAPN0MAT0TOG0PWM0ECCF0x000,0000sfrCCAPM1=0xDB;//PCA模塊1PWM寄存器-ECOM1CAPP1CAPN1MAT1TOG1PWM1ECCF1x000,0000//ECOMn=1:允許比較功能。//CAPPn=1:允許上升沿觸發(fā)捕捉功能。//CAPNn=1:允許下降沿觸發(fā)捕捉功能。//MATn=1:當(dāng)匹配情況發(fā)生時,允許CCON中的CCFn置位。//TOGn=1:當(dāng)匹配情況發(fā)生時,CEXn將翻轉(zhuǎn)。//PWMn=1:將CEXn設(shè)置為PWM輸出。//ECCFn=1:允許CCON中的CCFn觸發(fā)中斷。//ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn//00000000x00未啟用任何功能。//x10000x0x2116位CEXn上升沿觸發(fā)捕捉功能。//x01000x0x1116位CEXn下降沿觸發(fā)捕捉功能。//x11000x0x3116位CEXn邊沿(上、下沿)觸發(fā)捕捉功能。//100100x0x4916位軟件定時器。//100110x0x4d16位高速脈沖輸出。//10000100x428位PWM。//ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn//00000000x00無此操作//10000100x42普通8位PWM,無中斷//11000110x63PWM輸出由低變高可產(chǎn)生中斷//10100110x53PWM輸出由高變低可產(chǎn)生中斷//11100110x73PWM輸出由低變高或由高變低都可產(chǎn)生中斷//-----------------------sfrCCAP0L=0xEA;//PCA模塊0的捕捉/比較寄存器低8位。0000,0000sfrCCAP0H=0xFA;//PCA模塊0的捕捉/比較寄存器高8位。0000,0000sfrCCAP1L=0xEB;//PCA模塊1的捕捉/比較寄存器低8位。0000,0000sfrCCAP1H=0xFB;//PCA模塊1的捕捉/比較寄存器高8位。0000,0000//-----------------------//76543210ResetValuesfrPCA_PWM0=0xF2;//PCA模塊0PWM寄存器。------EPC0HEPC0Lxxxx,xx00sfrPCA_PWM1=0xF3;//PCA模塊1PWM寄存器。------EPC1HEPC1Lxxxx,xx00//PCA_PWMn:76543210//------EPCnHEPCnL//B7-B2:保留//B1(EPCnH):在PWM模式下,與CCAPnH組成9位數(shù)。//B0(EPCnL):在PWM模式下,與CCAPnL組成9位數(shù)。//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)ADC特殊功能寄存器//76543210ResetValuesfrADC_CONTR=0xBC;//A/D轉(zhuǎn)換控制寄存器ADC_POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS00000,0000sfrADC_RES=0xBD;//A/D轉(zhuǎn)換結(jié)果高8位ADCV.9ADCV.8ADCV.7ADCV.6ADCV.5ADCV.4ADCV.3ADCV.20000,0000sfrADC_RESL=0xBE;//A/D轉(zhuǎn)換結(jié)果低2位ADCV.1ADCV.00000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)SPI特殊功能寄存器//76543210ResetValuesfrSPCTL=0xCE;//SPIControlRegisterSSIGSPENDORDMSTRCPOLCPHASPR1SPR00000,0100sfrSPSTAT=0xCD;//SPIStatusRegisterSPIFWCOL------00xx,xxxxsfrSPDAT=0xCF;//SPIDataRegister0000,0000//--------------------------------------------------------------------------------//新一代1T8051系列單片機(jī)IAP/ISP特殊功能寄存器sfrIAP_DATA=0xC2;sfrIAP_ADDRH=0xC3;sfrIAP_ADDRL=0xC4;//76543210ResetValuesfrIAP_CMD=0xC5;//IAPModeTable0-----MS1MS00xxx,xx00sfrIAP_TRIG=0xC6;sfrIAP_CONTR=0xC7;//IAPControlRegisterIAPENSWBSSWRSTCFAIL-WT2WT1WT00000,x000//--------------------------------------------------------------------------------