嗯对 是这个意思。 但串口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; // 开总中断
} |