c8051F020单片机定时器2、4双串口程序(中文详细注释)
/********************************************************************************
Filename:
version:1.0
Data:2013-03-14 
liuqs2001@163
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启动
}
/********************************************** 串口初始化 ***************************************************************/
av美女上飞机不能带什么/********************************************** 串口收发测试 *************************************************************/
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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。