c8051F020单片机定时器2、4双串口程序(中文详细注释)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/********************************************************************************
Filename:
version:1.0
Data:2013-03-14
liuqs2001@
MCU:C8051F020
CLOCK:11.0592MHz
*********************************************************************************/

#include "C8051F020.H"
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^6; // green LED: '1' = ON; '0' = OFF
#define BAUDRATE 9600
#define SYSCLK 11059200
uchar back[4];


/************************** 单片机配置程序 start***************************************/
//------------------------------------------------------------------------------------
// 系统时钟配置程序
//------------------------------------------------------------------------------------
void SysClkInit(void)//配置系统时钟
{
int n = 0;
OSCXCN = 0x67; //***外部振荡器使能;工作于晶体振荡器方式;f>6.7MHz***
for (n = 0; n < 255; n++) ;//***等待1ms以上***
while ( (OSCXCN & 0x80) == 0 );//***等待外部振荡器起振标志位***
OSCICN = 0x08;//***选择外部振荡器;内部振荡器禁止;禁止时钟丢失检测器***
}


//------------------------------------------------------------------------------------
// 端口配置程序
//------------------------------------------------------------------------------------
void PortInit(void)
{
// 交叉开关配置
XBR0 = 0x04; /* 1:配置,0:I/O;
位 2: UART0EN:UART0 I/O使能位。
0:UART0 I/O不连到端口引脚。
1:UART0 的 TX连到 P0.0,RX连到 P0.1。*/
XBR1 = 0x00; // 1:配置,0:I/O 所有外部中断均不连接至IO
XBR2 = 0x44; // 弱上拉全局允许,交叉开关使能,UART1 I/O使能,其他禁止

//端口模式设置

P0MDOUT = 0xf5; //1:推挽,0:漏极开路

P1MDIN = 0xff; //P1端口为数字输入
P1MDOUT = 0xff; //P1端口为漏极开路


}

void McuInit(void) //单片机初始化
{
EA=0; //全局中断禁
WDTCN = 0xDE; // 关闭 WATCHDOG
WDTCN = 0xAD; //***DTNC写入0xDE后四个机器周期内再写入0xAD将禁止WDT***
SysClkInit(); // 系统时钟配置
PortInit(); // 端口配置

EA=1; //***全局中断允许***
}
/************************** 单片机配置程序 END***************************************/



/********************************************** 串口初始化 ***************************************************************/
void UART0_Init(void)
{
SCON0=0x50; //串口方式1(SM00=0,SM10=1) ;SM20=0停止位的逻辑电平被忽略,RB80=接收停止位;REN0=1接受允许
T2CON=0x30; //选用定时器2作为波特率发生器,定时器禁止,自动重装载,不能产生中断

/*时基信号为系统时钟/2,波特率 = SYSCLK / ((65536 - [RCAP2H:RCAP2L])*32)
RCAP2H:RCAP2L = 65536 - SYSCLK /(B * 32)
11.0592MHz— 9600-----65500(FFDC)
22.1184MHz— 9600-----65464(FFB8) */
//PCON=0x00; // 波特率不倍增, 定时器2、4在波特率发生器模式下,PCON不起作用
RCAP2H=0xFF;
RCAP2L=0xDC; //11.0592MHz
// RCAP2L=0xB8; //22.1184MHz
// TH2=RCAP2H; //波特率发生器模式下,不必要
// TL2=RCAP2L; //波特率发生器模式下,不必要


TI0=0; //发送标志清零
RI0=0; //接受标志清零
ES0=0; //禁止串口中断0

TR2=1; //定时器启动

}

void UART1_Init(void)
{
SCON1=0x50; //串口方式1(SM01=0,SM11=1) ;SM21=0停止位的逻辑电平被忽略,RB80=接收停止位;REN0=1接受允许;TI1=0,发送标志清零;RI1=0,接受标志清零
//地址以 0x0或 0x8 结尾的 SFR(例如 SCON0、IE 等)既可以按字节寻址也可以按位寻址,所有其它SFR(SCON1、T4CON等)只能按字节寻址。
T4CON=0x30; //选用定时器4作为波特率发生器,定时器禁止,自动重装载,不能产生中断
/*时基信号为系统时钟/2,波特率 = SYSCLK / ((65536 - [RCAP2H:RCAP2L])*32)
RCAP2H:RCAP2L = 65536 - SYSCLK /(B * 32)
11.0592MHz— 9600-----65500(FFDC)
22.1184MHz— 9600-----65464(FFB8) */
//PCON=0x00; // 波特率不倍增, 定时器2、4在波特率发生器模式下,PCON不起作用
RCAP4H=0xFF;
RCAP4L=0xDC; //11.0592MHz
//RCAP2L=0xB8; //22.1184MHz

EIE2&=~0x40; //EIE2:06(ES1)=0;禁止串口1中断0

T4CON|=0x04; //T4CON:02(TR4)TR4=1;定时器4启动

}
/********************************************** 串口初始化 ***************************************************************/


/********************************************** 串口收发测试 *************************************************************/
void UART0_test(void)
{
uchar temp;
while(RI0==0);
RI0=0; //接收标志清零
temp=SBUF0; //接收数据

SBUF0=temp; //发送数据
while(TI0==0);
TI0=0; //发送标志清零

}

void UART1_test(void)
{
uchar temp;
while((SCON1 & 0x01)==0); //等待SCON1:0(RI1)=1
SCON1 &=~0x01; //接收标志清零

temp=SBUF1; //接收数据

SBUF1=temp; //发送数据
while((SCON1 & 0x02)==0); //等待SCON1:1(TI1)=1
SCON1 &=~0x02; //发送标志清零

}
/********************************************** 串口收发测试 *************************************************************/




/*************************************************
主程序
***************************************************/
void main(void)
{

McuInit(); //单片机初始化
UART0_Init(); //串口初始化
UART1_Init(); //串口初始化

UART1_test();
// UART0_test();
LED = ~LED;


}


相关文档
最新文档