標(biāo)題:
STC12C5A60S2雙串口通訊基礎(chǔ)程序
[打印本頁]
作者:
guangliang825
時(shí)間:
2020-3-19 18:04
標(biāo)題:
STC12C5A60S2雙串口通訊基礎(chǔ)程序
程序9600波特率 下 STC單片機(jī)雙串口通訊發(fā)基礎(chǔ)程序,程序內(nèi)容,各自中斷接收,中斷轉(zhuǎn)發(fā)接收到的數(shù)據(jù)。需要兩個(gè)串口同時(shí)工作的可以用的上。
單片機(jī)源程序如下:
/*-----------------------------------------------
名稱:STC12C5A60S2雙串口通信
編寫:Nico
日期:2009.5
修改:無
內(nèi)容:9600波特率 雙串口收發(fā)
接線:串口1 發(fā)送P3.1,接收P3.0
串口2 發(fā)送P1.3,接收P1.2
------------------------------------------------*/
#include"stc12c5a60s2.h"
#include"delay.h"
#define S2RI 0x01 //串口2接收中斷中斷請求標(biāo)志位
#define S2TI 0x02 //串口2發(fā)送中斷請求標(biāo)志位
unsigned char flag1,flag2,temp1,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
/*------------------------------------------------
函數(shù)聲明
------------------------------------------------*/
//void SendStr(unsigned char *s);
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打開
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
S2CON = 0x50; //
BRT = 0xFD; // 9600
AUXR = 0x10; //
IE2 =0x01; //
}
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main (void)
{
InitUART();
DelayMs(100);
uart1SendStr("串口1初始化成功");
DelayMs(100);
uart2SendStr("串口2初始化成功");
while (1)
{
if(flag1==1)
{
flag1=0;
// uart2SendStr("串口1中斷,串口2發(fā)送串口1接收的數(shù)據(jù):");
uart1SendStr(uart1Receive);
for(i=0;i<=100;i++)
{
uart1Receive[i]=0;
}
}
if(flag2==1)
{
flag2=0;
// uart1SendStr("串口2中斷,串口1發(fā)送串口2接收的數(shù)據(jù):");
uart2SendStr(uart2Receive);
for(i=0;i<=100;i++)
{
uart2Receive[i]=0;
}
}
}
}
/*------------------------------------------------
1發(fā)送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
//通過檢測是否字符串末尾
{
UART_1SendOneByte(*s);
s++;
}
}
/*------------------------------------------------
2發(fā)送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結(jié)束標(biāo)志,
//通過檢測是否字符串末尾
{
UART_2SendOneByte(*s);
s++;
}
}
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //?TI=0,????
TI = 0;
}
/****************串口2發(fā)送一個(gè)字符****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //?S2TI=0,????
S2CON&=~S2TI; //S2TI=0
}
/************串口1中斷函數(shù)*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
uart1Receive[point1++]=temp1;
if(temp1=='\n')
{
flag1=1;
point1=0;
}
if(point1==100)
{
point1=0;
}
}
}
/************串口2中斷函數(shù)*************/
void UART_2Interrupt(void) interrupt 8
{
EA = 0; //打開總中斷
if(S2CON&S2RI)
{
S2CON&=~S2RI;
temp2=S2BUF;
uart2Receive[point2++]=temp2;
if(temp2=='\n')
{
point2=0;
flag2=1;
}
if(point2==100)
{
point2=0;
}
}
EA = 1; //打開總中斷
}
復(fù)制代碼
以上資料51hei提供下載:
12C5a60s2雙串口通訊.rar
(50.5 KB, 下載次數(shù): 196)
2020-3-19 18:05 上傳
點(diǎn)擊文件名下載附件
雙串口程序下載
下載積分: 黑幣 -5
作者:
renshanwu
時(shí)間:
2020-8-16 23:50
96行,109行的S++,是什么目的?為什么要自加?而且上文中只有*S,沒有出現(xiàn)S?
作者:
renshanwu
時(shí)間:
2020-8-17 00:00
151,167行,是先開總中斷,后關(guān)總中斷,還是先關(guān)后開?
作者:
76221570
時(shí)間:
2021-4-7 14:48
我測試了一下,用串口助手發(fā)送數(shù)據(jù)時(shí)候需要勾選“發(fā)送新行” 才可以 ,要不然就有一個(gè)接收不到另一個(gè)發(fā)送的。程序沒什么問題, 就是151行注釋錯(cuò)了 ,代碼沒問題。
EA = 0; //打開總中斷
這里應(yīng)該是
EA = 0; //關(guān)閉總中斷。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1