#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L //系統頻率
#define BAUD 9600 //串口波特率
#define NONE_PARITY 0 //無校驗
#define ODD_PARITY 1 //奇校驗
#define EVEN_PARITY 2 //偶校驗
#define MARK_PARITY 3 //標記校驗
#define SPACE_PARITY 4 //空白校驗
#define PARITYBIT EVEN_PARITY //定義校驗位
sfr AUXR = 0x8e; //輔助暫存器
sfr S2CON = 0x9a; //UART2 控制暫存器
sfr S2BUF = 0x9b; //UART2 資料暫存器
sfr T2H = 0xd6; //定時器2高8位
sfr T2L = 0xd7; //定時器2低8位
sfr IE2 = 0xaf; //中斷控制暫存器2
#define S2RI 0x01 //S2CON.0
#define S2TI 0x02 //S2CON.1
#define S2RB8 0x04 //S2CON.2
#define S2TB8 0x08 //S2CON.3
sfr P_SW2 = 0xBA; //外設功能切換暫存器2
#define S2_S0 0x01 //P_SW2.0
bit busy;
BYTE BUFFER[10];
int i;
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
P_SW2 &= ~S2_S0; //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)
// P_SW2 |= S2_S0; //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)
#if (PARITYBIT == NONE_PARITY)
S2CON = 0x50; //8位可變波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
S2CON = 0xda; //9位可變波特率,校驗位初始為1
#elif (PARITYBIT == SPACE_PARITY)
S2CON = 0xd2; //9位可變波特率,校驗位初始為0
#endif
T2L = (65536 - (FOSC/4/BAUD)); //設定波特率重裝值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2為1T模式, 并啟動定時器2
IE2 = 0x01; //使能串口2中斷
EA = 1;
//SendString("STC15F2K60S2\r\nUart2 Test !\r\n");
while(1);
}
/*----------------------------
UART2 中斷服務程式
-----------------------------*/
void Uart2() interrupt 8 using 1
{
if (S2CON & S2RI)
{
S2CON &= ~S2RI; //清除S2RI位
BUFFER[i] = S2BUF; //P0顯示串口資料
i++;
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI; //清除S2TI位
busy = 0; //清忙標志
}
}
/*----------------------------
發送串口資料
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的資料發送完成
ACC = dat; //獲取校驗位P (PSW.0)
if (P) //根據P來設定校驗位
{
#if (PARITYBIT == ODD_PARITY)
S2CON &= ~S2TB8; //設定校驗位為0
#elif (PARITYBIT == EVEN_PARITY)
S2CON |= S2TB8; //設定校驗位為1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
S2CON |= S2TB8; //設定校驗位為1
#elif (PARITYBIT == EVEN_PARITY)
S2CON &= ~S2TB8; //設定校驗位為0
#endif
}
busy = 1;
S2BUF = ACC; //寫資料到UART2資料暫存器
}
/*----------------------------
發送字串
----------------------------*/
void SendString(char *s)
{
while (*s) //檢測字串結束標志
{
SendData(*s++); //發送當前字符
}
}
uj5u.com熱心網友回復:
每次接收前,i沒有清0uj5u.com熱心網友回復:
程式里沒看到你發送了什么。uj5u.com熱心網友回復:

我把 “//SendString("STC15F2K60S2\r\nUart2 Test !\r\n"); ”注釋去掉,測驗是正常的。
uj5u.com熱心網友回復:
我有兩個片子他倆的資料總線是在一起的,當我發送給他一段指令后,他有回傳指令告訴我是否例外,但是我的接收指令只能接收到七位資料中的前兩位資料。uj5u.com熱心網友回復:
波特率是不是一樣uj5u.com熱心網友回復:
接收前清零了,波特率都是9600
uj5u.com熱心網友回復:
我有兩個片子他倆的資料總線是在一起的,當我發送給他一段指令后,他有回傳指令告訴我是否例外,但是我的接收指令只能接收到七位資料中的前兩位資料。
uj5u.com熱心網友回復:
i是清零的,只不過在這個程式沒寫
uj5u.com熱心網友回復:
把硬體連接畫個圖告訴大家。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/69041.html
標籤:單片機/工控
上一篇:數碼管顯示
下一篇:求解答
