|
希望大佬幫我看看哪里的問題,232通信協議,波特率都一樣,串口2和傳感器通信的協議如圖,實在寫不出來,沒基礎都自學的,拜托了
/**************************************************************************************
接線說明: 1:STC8A單片機-->USB轉TTL&電源模塊
P10-->UTXD
P11-->URXD
注意事項: USB連接線給開發板通電下載程序,STC下載軟件中內部IRC時鐘選擇11.0592MHZ
***************************************************************************************/
#include "STC8.H"
#include "intrins.h"
#define MAIN_Fosc 11059200L //定義主時鐘
#define uint32 unsigned long
#define uint16 unsigned int
#define uint8 unsigned char
#define uchar unsigned char
/************* 本地變量聲明 **************/
#define TRUE 1
#define FALSE 0
#define Buf_Max 50
#define S2_S 0x01
#define S2RI 0x01
#define S2TI 0x02
volatile uint8 Flag=FALSE;
uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;
bit busy;
uchar table2[3]={0x04,0x04,0x04}; //串口2循環發送指令
uchar rec2[14]; //接收數組
uchar rec1[14];
/**************************************
功能描述:延時函數
入口參數:uint16 x ,該值為1時,延時1ms
返回值:無
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/***************************************************************************
* 描 述 : 串口2初始化函數
* 入 參 : 無
* 返回值 : 無
備注:波特率9600bps 晶振11.0592MHz
**************************************************************************/
void Uart2_Init(void)
{
S2CON = 0x50; //8位數據,可變波特率,啟動串行接收器
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0xE0; //設定定時初值
T2H = 0xFE; //設定定時初值
AUXR |= 0x10; //啟動定時器2
IE2 |= 0x01; // 串口2中斷打開
EA = 1; // 總中斷打開
}
/***************************************************************************
* 描 述 : 串口1初始化函數
* 入 參 : 無
* 返回值 : 無
備注:波特率9600bps 晶振11.0592MHz
**************************************************************************/
void Uart1_Init(void)
{
PCON &= 0x3f; //波特率不倍速,串行口工作方式由SM0、SM1決定
SCON = 0x50; //8位數據,可變波特率,啟動串行接收器
AUXR |= 0x40; //定時器1時鐘為Fosc,即1T
AUXR &= 0xfe; //串口1選擇定時器1為波特率發生器
TMOD &= 0x0f; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重裝方式
TL1 = 0xDC; //設定定時初值
TH1 = 0xDC; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
ES = 1; // 串口1中斷打開
EA = 1; // 總中斷打開
}
/***************************************************************************
* 描 述 : 串口2發送數據函數
* 入 參 : uint8 數據
* 返回值 : 無
**************************************************************************/
void SendDataByUart2()
{
S2BUF =table2[3] ; //寫數據到UART數據寄存器
while(!(S2CON&S2TI)); //在停止位沒有發送時,S2TI為0即一直等待
S2CON&=~S2TI; //清除S2CON寄存器對應S2TI位(該位必須軟件清零)
}
/**************************************************************************************
* 描 述 : USART2接收到數據后串口發送出去
* 入 參 : 無
* 返回值 : 無
**************************************************************************************/
void USART2_Tx_Puts(void)
{
if(Flag) //有新數據通過串口被接收到
{
IE2 &= 0xFE; // 串口2中斷關閉
rec1[14]=rec2[14];
IE2 |= 0x01; // 串口2中斷打開
Flag=FALSE; //清除接收標識符
}
}
/***************************************************************************
* 描 述 : 串口1發送數據函數
* 入 參 : uint8 數據
* 返回值 : 無
**************************************************************************/
void SendDataByUart1(void)
{
rec1[14]=S2BUF ; //寫數據到UART數據寄存器
while(TI == 0); //在停止位沒有發送時,TI為0即一直等待
TI = 0; //清除TI位(該位必須軟件清零)
}
/**************************************************************************************
* 描 述 : USART1接收到數據后串口發送出去
* 入 參 : 無
* 返回值 : 無
**************************************************************************************/
void USART1_Tx_Puts(void)
{
if(Flag) //有新數據通過串口被接收到
{
ES = 0; //串口1中斷關閉
SendDataByUart1(); //發送字符
ES = 1; //串口1中斷打開
Flag=FALSE; //清除接收標識符
}
}
/***************************************************************************
* 描 述 : 串口2中斷服務函數
* 入 參 : 無
* 返回值 : 無
**************************************************************************/
void Uart2() interrupt 8 using 1
{
IE2 &= 0xFE; // 串口2中斷關閉
Flag=TRUE; //接收到數據,接收標識符有效
if (S2CON & S2RI) //串行接收到停止位的中間時刻時,該位置1
{
S2CON &= ~S2RI; //清除S2CON寄存器對應S2RI位(該位必須軟件清零)
rec2[14] = S2BUF;
}
if (S2CON & S2TI) //在停止位開始發送時,該位置1
{
S2CON &= ~S2TI; //清除S2CON寄存器對應S2TI位(該位必須軟件清零)
}
IE2 |= 0x01; // 串口2中斷打開
}
/***********************
功能描述:主函數
入口參數:無
返回值:無
************************/
int main()
{
P1M1 &= 0xFE; P1M0 &= 0xFE; //設置P1.0為準雙向口
P1M1 &= 0xFD; P1M0 |= 0x02; //設置P1.1為推挽輸出
P3M1 &= 0xFE; P3M0 &= 0xFE; //設置P3.0為準雙向口
P3M1 &= 0xFD; P3M0 |= 0x02; //設置P3.1為推挽輸出
Uart2_Init();
Uart1_Init();
while(1);
}
///***************************************************************************
// * 描 述 : 串口1中斷服務函數
// * 入 參 : 無
// * 返回值 : 無
// **************************************************************************/
//void Uart1() interrupt 4 using 1
//{
// ES = 0; // 串口1中斷關閉
// Flag=TRUE; //接收到數據,接收標識符有效
// if (RI) //串行接收到停止位的中間時刻時,該位置1
// {
// RI = 0; //清除RI位 (該位必須軟件清零)
// SBUF=S2BUF;
// }
// if (TI) //在停止位開始發送時,該位置1
// {
// TI = 0; //清除TI位(該位必須軟件清零)
// }
// ES = 1; // 串口1中斷打開
//}
|
|