欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15F104W單片機虛擬串口 字符串比較源程序
[打印本頁]
作者:
NASA999
時間:
2019-2-28 11:33
標題:
STC15F104W單片機虛擬串口 字符串比較源程序
STC15F104W虛擬串口 字符串比較
單片機源程序如下:
//本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
//若無特別說明,工作頻率一般為11.0592MHz
#include "reg51.h"
#include<string.h>
#define d 5 //數組位定義
//-----------------------------------------
//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; //接收完成標志
bit Tcmd;
static unsigned char rc; //接收計數
static unsigned char tc; //發送計數
static unsigned char a1[d]={0x61,0x62,0x63,0x64,0x65} ; //5位 比數組多1位 結束位
static unsigned char q;
unsigned char c; //數據位計數
unsigned char *p; //數據指針
unsigned int n;
void main()
{
unsigned char fc; //發送延時
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(); //調用接收函數
if(cmd==1) //接收完成
{
if(c!=4) //數據位錯誤
{
//發送錯誤指示
c=0;
cmd=0;
}
else if(c==4) //數據位正確
{
if( 0== strcmp (a1,"R1ONen" )) //字符比較
{
R1=0;
fc = sizeof(a1); //計算數組位數
for (n=0;n<20000;n++);
TING =1;
TEND=1;
TUSRT(a1,fc); //調用發送函數
}
if( 0== strcmp (a1,"R1OFen" )) //字符比較
{
R1=1;
fc = sizeof(a1); //計算數組位數
for (n=0;n<20000;n++);
TING =1;
TEND=1;
TUSRT(a1,fc); //調用發送函數
}
if( 0== strcmp (a1,"R2ONen" )) //字符比較
{
R2=0;
fc = sizeof(a1); //計算數組位數
for (n=0;n<20000;n++);
TING =1;
TEND=1;
TUSRT(a1,fc); //調用發送函數
}
if( 0== strcmp (a1,"R2OFen" )) //字符比較
{
R2=1;
fc = sizeof(a1); //計算數組位數
for (n=0;n<20000;n++);
TING =1;
TEND=1;
TUSRT(a1,fc); //調用發送函數
}
}
}
}
}
void RUSRT() //接收函數
{
if (REND)
{
REND = 0;
if (RBUF!='n') //判斷不是結束符
{
a1[rc]=RBUF; //接收傳送數組位
rc++;
c++;
}
else if(RBUF=='n') //判斷是結束符
{REND=0;
rc=0;
cmd=1;
}
}
}
void TUSRT(unsigned char dat,f) //發送函數
{
if (TEND)
{
TEND=0;
if(tc<=f) //發送數據位比較
{
TBUF =a1[tc]; //數組位數據發送到發送寄存器
tc++;
p++;
}
else if (tc>=f) //發送數據比較
{
cmd =0; //發送復位
c=0;
tc=0;
TEND=0; //復位
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;
}
復制代碼
所有資料51hei提供下載:
15模擬串口.rar
(28.69 KB, 下載次數: 48)
2019-2-28 11:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
laughingmau
時間:
2019-11-5 18:39
謝謝分享!!!
作者:
80088a
時間:
2021-5-21 19:16
經鑒定無法正常運行 并且STC-ISP早就能導入型號和頭文件到keil中 為什么還要用別的代替?代替了根本不能使用的。STC15F104W和這些相差太多了 各種定義都不同。用代替的沒法玩的。
#define MAIN_Fosc 11059200L //定義主時鐘 110 ~ 9600
#define BaudRate 9600 //模擬串口波特率
#define Timer0_Reload (65536 - MAIN_Fosc / BaudRate / 3)
void main()
{
InternalRAM_enable();
//// ExternalRAM_enable();
Timer0_1T();
Timer0_AsTimer();
Timer0_16bitAutoReload();
Timer0_Load(Timer0_Reload);
Timer0_InterruptEnable();
Timer0_Run();
EA = 1; //open global interrupt switch
UART_INIT();
}
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1