嗯對 是這個意思。 但串口3的收發程序編寫不知道哪里錯了,不能收發,能不能幫忙看看。
#include "stc15f2k60s2.h" // 單片機STC15F2K60S2頭文件,可以不再加入reg51.h
#include "uart.h"
sbit KEY1 = P2^0;
sbit KEY2 = P2^1;
#define S3RI 0x01 //S3CON.0
#define S3TI 0x02 //S3CON.1
#define ES3 0x08 //IE2.3
#define uchar unsigned char
#define uint unsigned int
unsigned char date;
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void UartInit(void);
void Uart3Init(void);
void main(void)
{
//定時器
TMOD = 0x00;//定時器0,模式0
TH0=0x3c;//50ms定時器初值設定
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
UartInit();
Uart3Init();
led1 = 1;
led3 = 1;
while(1)
{
if(KEY2==0)
{
delay(1000);
if(KEY2==0) //確認觸發
{
SBUF = '1';
delay(100);
}
if(KEY1==0)
{
delay(1000);
if(KEY1==0) //確認觸發
{
S3BUF='2';
delay(100);
}
}
}
}
}
void uart1ISR() interrupt 4
{
if(RI){
date=SBUF; //單片機接受
SBUF=date; //單片機發送
RI=0;
}
if(TI){
TI=0;
}
}
void UART3_Isr(void) interrupt 17
{
if (S3CON & S3RI) {
date = S3BUF;
S3BUF = date;
S3CON &= ~S3RI; // 清中斷標志
}
if (S3CON & S3TI) {
S3CON &= ~S3TI; // 清中斷標志
}
}
void Uart3Init(void)
{
// S3CON = 0x10; // 8位數據,可變波特率
// T2L=(65536-11059200/4/9600);
// T2H=(65536-11059200/4/9600)>>8;
// AUXR = 0x14; //定時器2時鐘為Fosc,即1T
// IE2=0x08; // 使能串口中斷
// EA = 1; // 開總中斷
S3CON = 0x10; // 8位數據,可變波特率
AUXR |= 0x04; // 定時器2時鐘為Fosc,即1T
T2L = (65536-11059200/4/9600);
T2H = (65536-11059200/4/9600)>>8; // 設定定時初值
AUXR |= 0x10; // 啟動定時器2
IE2 = ES3; // 使能串口中斷
EA = 1; // 開總中斷
}
void UartInit(void) //9600bps
{
/* SCON = 0x50; //8位數據,可變波特率
// AUXR = 0x15; //定時器2時鐘為Fosc,即1T
T2L=(65536-11059200/4/9600);
T2H=(65536-11059200/4/9600)>>8;
ET1 = 0; //禁止定時器1中斷
ES=1;*/
SCON = 0x50; // 8位數據,可變波特率
AUXR |= 0x40; // 定時器1時鐘為Fosc,即1T
AUXR &= 0xFE; // 串口1選擇定時器1為波特率發生器
TMOD &= 0x0F; // 設定定時器1為16位自動重裝方式
TL1 = (65536-11059200/4/9600); // 設定定時初值
TH1 = (65536-11059200/4/9600)>>8; // 設定定時初值
ET1 = 0; // 禁止定時器1中斷
TR1 = 1; // 啟動定時器1
ES = 1; // 開串口中斷
EA = 1; // 開總中斷
} |