/*-----------------------------------------------
名稱:STC12C5A60S2雙串口通信(已經成功測試)
編寫:WatsonBu
日期:2022.01
修改:無
內容:9600波特率 雙串口收發
接線:串口1 發送P3.1,接收P3.0
串口2 發送P1.3,接收P1.2
------------------------------------------------*/
#include "stc12c5a60s2.h"
#include <stdio.h>
#include <stdarg.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define S2RI 0x01 //串口2接收中斷中斷請求標志位
#define S2TI 0x02 //串口2發送中斷請求標志位
unsigned char flag1,flag2,temp2;
unsigned char uart2Receive[100];
unsigned char uart1Receive[100];
unsigned int point1=0,point2=0;
unsigned char i;
uchar RecDate[9]={0}; //串口接收 數據
uchar recnum2=0; //串口接收長度
bit recfinish=0; //串口接收完成
uchar flag=0;
sbit TEST_OK = P0^1;
sbit TEST_NG = P2^2;
sbit V5_off = P2^3;
/*------------------------------------------------
函數聲明
------------------------------------------------*/
void UART_1SendOneByte(unsigned char c);
void UART_2SendOneByte(unsigned char c);
void uart1SendStr(unsigned char *s);
void uart2SendStr(unsigned char *s);
void send_char_com(uchar ch) //串口發送字節
{
SBUF=ch;
while(TI==0);
TI=0;
}
/*------------------------------------------------
雙串口初始化
------------------------------------------------*/
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;
AUXR = 0x10;
IE2 =0x01;
}
void DelayMs(uint n)
{
uchar i=112;
while(n--)
while(i--);
}
/*------------------------------------------------
主函數
------------------------------------------------*/
void main (void)
{
InitUART();
DelayMs(10);
uart1SendStr("COMTOPC");//用于發送給上位機
DelayMs(10);
uart2SendStr(">>GetVal");//去讀取電流測試數據,“GetVal” 是電流測試板的請求協議。
DelayMs(10);
while(1)
{
if(flag1==1)
{
flag1=0;
{
for(i=0;i<9;i++)
send_char_com(RecDate[i]);
recnum2=0;// 接收數據長度清零
DelayMs(100);
}
{
uchar i=0;
uchar temp[9]={0};
sprintf((char*)temp,"%8s",RecDate);
if(strcmp(temp,">>TDTEST") == 0)//這是自己任意設定的約定字 "TDTEST",以下照此
{
V5_off=0;
DelayMs(100);
}
else if(strcmp(temp,">>TDT=OK") == 0)
{
TEST_NG=1;
DelayMs(10);
TEST_OK=0;
DelayMs(100);
}
else if(strcmp(temp,">>TDT=NG") == 0)
{
TEST_OK=1;
DelayMs(10);
TEST_NG=0;
DelayMs(100);
}
else
{
uart2SendStr(">>GetVal");
DelayMs(5);
}
}
{
for(i=0;i<9;i++)
RecDate[i]=0;
}
}
//如果串口2接收到數據,將此數據由串口1發送
if(flag2==1)
{
flag2=0;
UART_1SendOneByte(temp2);
}
}
}
/*------------------------------------------------
1發送字符串
------------------------------------------------*/
void uart1SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結束標志,
//通過檢測是否字符串末尾
{
UART_1SendOneByte(*s);
s++;
}
}
/*------------------------------------------------
2發送字符串
------------------------------------------------*/
void uart2SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串結束標志,
//通過檢測是否字符串末尾
{
UART_2SendOneByte(*s);
s++;
}
}
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //若TI=0,在此等待
TI = 0;
}
/****************串口2發送一個字符****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
/************串行口1中斷處理函數*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0; //標志位清零
flag1=1;
if(recnum2<9)
{
RecDate[recnum2]=SBUF;
recnum2++;
}
}
}
/************串行口2中斷處理函數*************/
void UART_2Interrupt(void) interrupt 8
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
}
}
|