|
STC15F104W虛擬串口 字符串比較
單片機(jī)源程序如下:
- //本示例在Keil開發(fā)環(huán)境下請選擇Intel的8058芯片型號進(jìn)行編譯
- //若無特別說明,工作頻率一般為11.0592MHz
- #include "reg51.h"
- #include<string.h>
- #define d 5 //數(shù)組位定義
- //-----------------------------------------
- //define baudrate const
- //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
- //NOTE: (FOSC/3/BAUDRATE) must be greater then 98, (RECOMMEND GREATER THEN 110)
- //#define BAUD 0xF400 // 1200bps @ 11.0592MHz
- //#define BAUD 0xFA00 // 2400bps @ 11.0592MHz
- //#define BAUD 0xFD00 // 4800bps @ 11.0592MHz
- #define BAUD 0xFE80 // 9600bps @ 11.0592MHz
- //#define BAUD 0xFF40 //19200bps @ 11.0592MHz
- //#define BAUD 0xFFA0 //38400bps @ 11.0592MHz
- //#define BAUD 0xEC00 // 1200bps @ 18.432MHz
- //#define BAUD 0xF600 // 2400bps @ 18.432MHz
- //#define BAUD 0xFB00 // 4800bps @ 18.432MHz
- //#define BAUD 0xFD80 // 9600bps @ 18.432MHz
- //#define BAUD 0xFEC0 //19200bps @ 18.432MHz
- //#define BAUD 0xFF60 //38400bps @ 18.432MHz
- //#define BAUD 0xE800 // 1200bps @ 22.1184MHz
- //#define BAUD 0xF400 // 2400bps @ 22.1184MHz
- //#define BAUD 0xFA00 // 4800bps @ 22.1184MHz
- //#define BAUD 0xFD00 // 9600bps @ 22.1184MHz
- //#define BAUD 0xFE80 //19200bps @ 22.1184MHz
- //#define BAUD 0xFF40 //38400bps @ 22.1184MHz
- //#define BAUD 0xFF80 //57600bps @ 22.1184MHz
- sfr AUXR = 0x8E;
- sbit RXB = P3^0; //define UART TX/RX port
- sbit TXB = P3^1;
- typedef bit BOOL;
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- BYTE TBUF,RBUF;
- BYTE TDAT,RDAT;
- BYTE TCNT,RCNT;
- BYTE TBIT,RBIT;
- BOOL TING,RING;
- BOOL TEND,REND;
- void UART_INIT();
- unsigned char r;
- bit b;
- BYTE t, r;
- BYTE buf[16];
- void RUSRT();
- void TUSRT(unsigned char dat,f);
- sbit R1=P3^3; //輸出1
- sbit R2=P3^4;//輸出2
- bit cmd; //接收完成標(biāo)志
- bit Tcmd;
- static unsigned char rc; //接收計數(shù)
- static unsigned char tc; //發(fā)送計數(shù)
- static unsigned char a1[d]={0x61,0x62,0x63,0x64,0x65} ; //5位 比數(shù)組多1位 結(jié)束位
-
- static unsigned char q;
- unsigned char c; //數(shù)據(jù)位計數(shù)
- unsigned char *p; //數(shù)據(jù)指針
- unsigned int n;
- void main()
- {
- unsigned char fc; //發(fā)送延時
- TMOD = 0x00; //timer0 in 16-bit auto reload mode
- AUXR = 0x80; //timer0 working at 1T mode
- TL0 = BAUD;
- TH0 = BAUD>>8; //initial timer0 and set reload value
- TR0 = 1; //tiemr0 start running
- ET0 = 1; //enable timer0 interrupt
- PT0 = 1;
-
-
-
-
-
- //improve timer0 interrupt priority
- EA = 1; //open global interrupt switch
- UART_INIT();
- while (1)
- { //user's function
-
- RUSRT(); //調(diào)用接收函數(shù)
-
- if(cmd==1) //接收完成
- {
- if(c!=4) //數(shù)據(jù)位錯誤
- {
- //發(fā)送錯誤指示
- c=0;
- cmd=0;
-
-
- }
- else if(c==4) //數(shù)據(jù)位正確
- {
-
-
- if( 0== strcmp (a1,"R1ONen" )) //字符比較
- {
-
- R1=0;
-
-
- fc = sizeof(a1); //計算數(shù)組位數(shù)
- for (n=0;n<20000;n++);
- TING =1;
- TEND=1;
- TUSRT(a1,fc); //調(diào)用發(fā)送函數(shù)
- }
-
-
-
-
- if( 0== strcmp (a1,"R1OFen" )) //字符比較
- {
-
- R1=1;
-
-
- fc = sizeof(a1); //計算數(shù)組位數(shù)
- for (n=0;n<20000;n++);
- TING =1;
- TEND=1;
- TUSRT(a1,fc); //調(diào)用發(fā)送函數(shù)
- }
-
-
-
-
-
- if( 0== strcmp (a1,"R2ONen" )) //字符比較
- {
-
- R2=0;
-
-
- fc = sizeof(a1); //計算數(shù)組位數(shù)
- for (n=0;n<20000;n++);
- TING =1;
- TEND=1;
- TUSRT(a1,fc); //調(diào)用發(fā)送函數(shù)
- }
-
-
- if( 0== strcmp (a1,"R2OFen" )) //字符比較
- {
-
- R2=1;
-
-
- fc = sizeof(a1); //計算數(shù)組位數(shù)
- for (n=0;n<20000;n++);
- TING =1;
- TEND=1;
- TUSRT(a1,fc); //調(diào)用發(fā)送函數(shù)
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
-
-
-
-
-
- }
-
- }
- }
-
-
-
- void RUSRT() //接收函數(shù)
- {
-
- if (REND)
- {
- REND = 0;
-
- if (RBUF!='n') //判斷不是結(jié)束符
- {
- a1[rc]=RBUF; //接收傳送數(shù)組位
- rc++;
- c++;
- }
- else if(RBUF=='n') //判斷是結(jié)束符
- {REND=0;
- rc=0;
- cmd=1;
-
-
- }
- }
- }
- void TUSRT(unsigned char dat,f) //發(fā)送函數(shù)
- {
-
-
- if (TEND)
- {
-
- TEND=0;
-
-
-
- if(tc<=f) //發(fā)送數(shù)據(jù)位比較
- {
-
- TBUF =a1[tc]; //數(shù)組位數(shù)據(jù)發(fā)送到發(fā)送寄存器
- tc++;
- p++;
- }
- else if (tc>=f) //發(fā)送數(shù)據(jù)比較
- {
-
- cmd =0; //發(fā)送復(fù)位
- c=0;
-
- tc=0;
- TEND=0; //復(fù)位
- TING=0;
-
- }
-
- }
-
- }
-
-
-
- //-----------------------------------------
- //Timer interrupt routine for UART
- void tm0() interrupt 1 using 1
- {
- if (RING)
- {
- if (--RCNT == 0)
- {
- RCNT = 3; //reset send baudrate counter
- if (--RBIT == 0)
- {
- RBUF = RDAT; //save the data to RBUF
- RING = 0; //stop receive
- REND = 1; //set receive completed flag
- }
- else
- {
- RDAT >>= 1;
- if (RXB) RDAT |= 0x80; //shift RX data to RX buffer
- }
- }
- }
- else if (!RXB)
- {
- RING = 1; //set start receive flag
- RCNT = 4; //initial receive baudrate counter
- RBIT = 9; //initial receive bit number (8 data bits + 1 stop bit)
- }
- if (--TCNT == 0)
- {
- TCNT = 3; //reset send baudrate counter
- if (TING) //judge whether sending
- {
- if (TBIT == 0)
- {
- TXB = 0; //send start bit
- TDAT = TBUF; //load data from TBUF to TDAT
- TBIT = 9; //initial send bit number (8 data bits + 1 stop bit)
- }
- else
- {
- TDAT >>= 1; //shift data to CY
- if (--TBIT == 0)
- {
- TXB = 1;
- TING = 0; //stop send
- TEND = 1; //set send completed flag
- }
- else
- {
- TXB = CY; //write CY to TX port
- }
- }
- }
- }
- }
- //-----------------------------------------
- //initial UART module variable
- void UART_INIT()
- {
- TING = 0;
- RING = 0;
- TEND = 0;
- REND = 0;
- TCNT = 0;
- RCNT = 0;
- }
復(fù)制代碼
所有資料51hei提供下載:
15模擬串口.rar
(28.69 KB, 下載次數(shù): 48)
2019-2-28 11:33 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|