|
近日学习C8051F340系列单片机的应用,遇到一段串口发送接收程序,有一个地方看不懂,即:在串口发送和接收前,要置P3口的状态,使用交叉开关后的串口Rx和Tx不是都在P1口中吗,关P3口什么事啊?请高手指点,我进行了调试,不对P3口置位还真不行,程序如下:
#include "c8051f340.h"
#include "intrins.h"
#define NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
//sbit ssa = P4^0;
//-----------------------------------------------------------------------------
// 函数原型:
// 功 能:
//-----------------------------------------------------------------------------
void Mcu_Init(void)
{
//PCA0及看门狗
PCA0CN = 0x00;//禁止看门狗定时器
PCA0MD = 0x80;//待机时PCA停止,系统时钟的12分频
//交叉开关及I/O口
XBR0 = 0x01;//
XBR1 = 0x40;//禁止弱上拉,使能交叉开关,CEX0--P0.0测转速
XBR2 = 0x00;//
P0MDIN = 0x3f;//P0.7,P0.6 模拟输入
P0SKIP = 0xc0;//P0.7,P0.6 XTAL1,XTAL2跳过
P0MDOUT = 0x10;
}
//-----------------------------------------------------------------------------
// 函数原型:
// 功 能:
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 |= 0x10;
CKCON = 0x02;//系统时钟24576000 T1时钟=24576000/48=512000
TH1 = 0xe6;//波特率为9600
TL1 = 0xe6;
TMOD = 0x20;
TR1 = 1;
TI0 = 1;
}
//-----------------------------------------------------------------------------
// 函数原型: void Sysclk_Init (void);
// 功 能: 系统工作时钟初始化
//-----------------------------------------------------------------------------
void Sysclk_Init (void)
{
unsigned char i;
OSCXCN = 0x67;//晶体振荡方式,11.0592MHz
for(i=0; i<250; i++);//延时
while (!(OSCXCN & 0x80));//等待晶体振荡稳定
CLKSEL = 0x01;//系统时钟切换至外部振荡器
OSCICN = 0x00;//关闭内部振荡器
}
//-----------------------------------------------------------------------------
// 函数原型: void Delay_Us(unsigned char us);
// 功 能: 延时*us
//-----------------------------------------------------------------------------
void Delay_Us(unsigned char us)
{
while(--us)
{
NOP;
}
}
//-----------------------------------------------------------------------------
// 函数原型: void Delay_Ms(unsigned char ms);
// 功 能: 延时*ms
//-----------------------------------------------------------------------------
void Delay_CharMs(unsigned char ms)
{
while(--ms)
{
Delay_Us(250);
Delay_Us(250);
Delay_Us(250);
Delay_Us(250);
}
}
//发送
/*
//-----------------------------------------------------------------------------
// 函数原型:
// 功 能:
//-----------------------------------------------------------------------------
void Main(void)
{
unsigned char send;
Mcu_Init();
Sysclk_Init();
Delay_CharMs(200);
send = 48;
UART0_Init();
P3 = 0;
while(1)
{
SBUF0 = send;
while(TI0==0);
TI0=0;
send++;
if(send>122)
{
send = 48;
}
Delay_CharMs(50);
}
}
*/
/*
//接收
//-----------------------------------------------------------------------------
// 函数原型:
// 功 能:
//-----------------------------------------------------------------------------
void Main(void)
{
unsigned char send[20];
unsigned char i = 0;
Mcu_Init();
Sysclk_Init();
Delay_CharMs(200);
UART0_Init();
REN0 = 1;
P3 = 0xff;
while(1)
{
while(RI0==0);
send = SBUF0;
i++;
if(i>19)
{
i = 0;
}
RI0=0;
Delay_CharMs(50);
}
}
*/
|
|