本帖最后由 爱宰恩 于 2015-2-11 15:43 编辑
我的初始化程序应该好用,我通过UART0中断接收,再通过UART0发送数据,程序运行正确; 通过UART1中断接收,再通过UART1发送数据,程序运行也正确。 但是,我如果通过UART0中断接收数据,再通过UART1发送出去,就不对了。跪求帮助。 下面是我的代码:
//将UART1 和UART0 初始化,交叉开关设置为P0.0 P0.1 为UART0// P1.0 P1.1 为UART1
//-----------------------------------------------------------------------------------------------//Includes//-----------------------------------------------------------------------------------------------
#include <c8051f020.h>#include <stdio.h> //标准输入输出头文件
//-----------------------------------------------------------------------------------------------
//Global Constants//-----------------------------------------------------------------------------------------------
#define BAUDRATE_0 115200 // UART0的波特率#define BAUDRATE_1 9600
//-----------------------------------------------------------------------------------------------
//SYSTEMCLOCK =System clock frequency in Hz
//-----------------------------------------------------------------------------------------------
#define SYSTEMCLOCK 22118400 //系统时钟为22.1184MHz
#define MAX_LEN 3 //接收数据的最大长度
//-----------------------------------------------------------------------------------------------
#define uchar unsigned char#define uint unsigned int
//-----------------------------------------------------------------------------------------------
uchar readCounts; uchar senlen;
uchar trdata[MAX_LEN];
uchar message[]={"Receive Buf is full"};
bit readFlag;
bit frameFlag;
//-----------------------------------------------------------------------------------------------
//初始化函数
//-----------------------------------------------------------------------------------------------
void SYSCLK_Init(void); //系统时钟初始化函数
void PORT_Init(void);
void UART0_Init(void); //
//-----------------------------------------------------------------------------------------------
// SYSCLK_Init()
//-----------------------------------------------------------------------------------------------
void SYSCLK_Init(void)
{ int i;
OSCXCN= 0x67; //外部振荡器控制寄存器 ,使能外部振荡器
for(i=0;i<256;i++); //等待至少1ms
while(!(OSCXCN&0x80)); //等待外部晶体稳定起振
OSCICN=0x88; //用外部晶振作为系统时钟,并使能时钟丢失检测
}
//------------------------------------------------------------------------------------------------
// PORT_Init()
//------------------------------------------------------------------------------------------------
void PORT_Init()
{
XBR0 =0x06; // 使能UART0 ,UART0 的TX连到P0.0 ,UART0 的RX 连到 P0.1
XBR1 =0x00;
XBR2 =0x46; // 弱上拉全局使能,交叉开关使能
P0MDOUT |=0x01; // TX作为推挽输出,RX作为漏极开路
P1MDOUT |=0x01;
EMI0CF =0x10;
P1MDIN =0xFF;
}
//-------------------------------------------------------------------------------------------------
// UART0_Init()
//------------------------------------------------------------------------------------------------
void UART0_Init()
{
SCON0 =0x50;
TMOD =0x20;
TH1 = 256-(SYSTEMCLOCK/BAUDRATE_0/16); //设置定时器1用作波特率的重载值 TL1保持计数值,而TH0保持重载值。
TR1=1; //定时器1用系统时钟作为时基
CKCON |=0x10; //系统采用系统时钟,不分频
PCON |=0x80; //电源控制寄存器,禁止UART0波特率1/2功能
}
//-----------------------------------------------------------------------------------------------------
// UART1_Init()
//-----------------------------------------------------------------------------------------------------
void UART1_Init()
{
SCON1 =0x50;
T4CON =0x34;
CKCON |=0x40;
PCON |=0x10;
RCAP4H =(65536-SYSTEMCLOCK/BAUDRATE_1/32)/256;
RCAP4L =(65536-SYSTEMCLOCK/BAUDRATE_1/32)%256;
T4CON |=0x04;
SCON1 &=0xFE;
SCON1 &=0xFD;
}
//-------------------------------------------------------------------------------------------------
//UART0串口中断服务程序 (需要完成:1.检测是否是接收中断,2.如果是接收,保存数据,)
// (3.判断接收的数据与保存的数据是否一样,4.如果一样,通过TX端发送出去一组数据)
//-------------------------------------------------------------------------------------------------
void UART0_ISR (void) interrupt 4 using 1
{
uchar rxch;
if(RI0) //若中断标志RI0=1,则是接收中断,进行数据完整接收
{
RI0=0; //RI0软件清零
rxch=SBUF0; //将缓冲寄存器中的数值保存到字符rxch中
if (readCounts>=MAX_LEN)
{
readCounts=0;
readFlag=1; //如果接收到的数据已经超过了规定的长度,那说明这个数据是无用的,
//设一个标志位readFlag=1,然后当readFlag=1的时候,就让主程序发送一个提示
}
trdata[readCounts]=rxch;//存入数组内,供发送
readCounts++; //记录已经存入几个数据
if(rxch==0x66) //检测,如果是最后一个字符,说明已经成功接收一组字符串了,
{ //设一个标志位frameFlag=1,然后当frameFlag=1的时候,就让主程序发送这组数据给串口了
frameFlag=1;
senlen=readCounts;
readCounts=0;
}
}
}
//----------------------------------------------------------------------------------------------------
// 发送单个字符给UART1
//----------------------------------------------------------------------------------------------------
void Send_char(uchar ch)
{ SBUF1=ch; //将发送的数据送入缓存区
while((SCON1&0x02)==0); //在发送数据结束时,TI0置位
SCON1&=~0x02; //软件清零
}
//----------------------------------------------------------------------------------------------------
// 发送单个字符给UART0
//----------------------------------------------------------------------------------------------------
/*void Send_char(uchar ch)
{ SBUF0=ch; //将发送的数据送入缓存区
while(TI0==0); //在发送数据结束时,TI0置位
TI0=0; //TI1软件清零
}*/
//---------------------------------------------------------------------------------------------------
// 向串口发送一个字符串,strlen为该字符串的长度
//----------------------------------------------------------------------------------------------------
void send_string_com(uchar *str,uint strlen)
{
uint k=0;
do
{
Send_char(*(str+k));
k++;
} while(k<strlen);
}
//---------------------------------------------------------------------------------------------------
// 主程序(实现功能 UART0处有中断,是接收中断,接收到一组数值,如果数值是我们想要的,就再通过TX端发送出去)
//---------------------------------------------------------------------------------------------------
main()
{
WDTCN = 0xde;
WDTCN = 0xad;
SYSCLK_Init();
PORT_Init();
UART0_Init();
UART1_Init();
EA=1;
ES0=1;
EIE2 =0x40;
do
{
if(readFlag==1)
{
readFlag=0;
send_string_com(message,sizeof(message));
}
else if(frameFlag==1)
{
frameFlag=0;
send_string_com(trdata,senlen);
}
}while(1);
}
|