C8051F340学习笔记—UART

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

C8051F340串口学习笔记

UART0 是一个异步、全双工串口,它提供标准8051 串行口的方式1 和方式3。UART0具有增强的波特率发生器电路,有多个时钟源可用于产生标准波特率。接收数据缓冲机制允许UART0 在软件尚未读取前一个数据字节的情况下开始接收第二个输入数据字节。

UART0 有两个相关的特殊功能寄存器:串行控制寄存器(SCON0)和串行数据缓冲器(SBUF0)。写SBUF0时自动访问发送寄存器;读SBUF0时自动访问接收寄存器,不可能从发送数据寄存器中读数据。

如果UART0 中断被允许,则每次发送完成TI0 位被置‘1’或接收到数据字节RI0 位被置‘1’时将产生中断。当CPU转向中断服务程序时硬件不清除UART0 中断标志。中断标志必须用软件清除。

UART0 波特率由定时器1 工作在8 位自动重装载方式产生,定时器1 应被配置为方式2,即8 位自动重装载方式,定时器1 的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8 和外部输入T1。

其中T1CLK是定时器1 的时钟频率,T1H是定时器1 的高字节(重载值)UART0 提供标准的异步、全双工通信,其工作方式(8 位或9 位)通过S0MODE来选择

8 位UART

每个数据字节共使用10 位:一个起始位、8 个数据位(LSB 在先)

和一个停止位,软件向SBUF0 寄存器写入一个字节时开始数据发送。在发送结束时中断标志TI0被置

1

UART1(仅C8051F340/1/4/5有)

UART1的使用与UART0基本大致相同,但是。UART1 包含一个由16 位定时器和可编程预分频器构成的专用波特率发生器,能产生很宽范围的波特率,有多个时钟源可用于产生标准波特率。

UART1 有六个相关的特殊功能寄存器。三个用于波特率发生器(SBCON1、SBRLH1 和SBRLL1),两个用于数据格式、控制和状态功能(SCON1 和SMOD1),一个用于发送和接收数据(SBUF1)。

使用UART1 时,波特率发生器必须被使能。寄存器SBRLH1 和SBRLL1 保持该专用定时器的16 位重载值,对于可靠的UART 操作,建议不要将UART 波特率配置为大于SYSCLK/16。

C8051F330串口UART0示例程序

//使用F340,串口为P0.4(TX0),P0.5(RX0);

#include

#include

#define SYSCLK 24500000 // 系统工作频率

#define BAUDRATE 9600 // 串口工作波特率

//-----------------------------------------------------------------------------

// 功能函数

//-----------------------------------------------------------------------------

void SYSCLK_Init(void);

void PORT_Init(void);

void UART0_Init(void);

void Uart0_Transmit(unsigned char tmp);

void sendstr(unsigned char*tmp);

unsigned char temp ;

void delay_1ms()

{

unsigned int j ;

for(j=3060;j>0;j--);

}

void delay_ms(unsigned int i)

{

for(;i>0;i--)delay_1ms();

}

//-----------------------------------------------------------------------------

// 主程序

//-----------------------------------------------------------------------------

void main(void)

{

PCA0MD&=~0x40 ; // 禁止看门狗

PORT_Init(); // 初始化端口I/O

SYSCLK_Init(); // 初始化系统时钟

UART0_Init(); // 串口初始化

EA=1 ;

ES0=1 ;

while(1)

{

delay_ms(1000);

sendstr("Welcome to July's Hut!\n");

Uart0_Transmit(032); //发送空格

}

}

//-----------------------------------------------------------------------------

// 端口初始化

//-----------------------------------------------------------------------------

void PORT_Init(void)

{

P0MDOUT | =0x10 ; // 使能UTX 为推挽输出

XBR0=0x01 ; // 使能UART0 占用P0.4(TXD) 和P0.5(RXD) XBR1=0x40 ; //使能交叉开关

XBR2=0x00 ; //禁止UART1

}

//-----------------------------------------------------------------------------

// 系统时钟初始化

//-----------------------------------------------------------------------------

void SYSCLK_Init(void)

{

OSCICN|=0x03 ; // 配置内部振荡器的的最大频率

RSTSRC=0x04 ; // 使能始终丢失检测寄存器

}

//-----------------------------------------------------------------------------

// 串口UART0初始化

//-----------------------------------------------------------------------------

void UART0_Init(void)

相关文档
最新文档