本次实验将会学习如果使用串口实现与PC机的通讯。试验中需要PC机与开发板之间使用USB-RS232线连接。
本次实验所学习到的寄存器:
CLKCONCMD:时钟频率控制寄存器。
D7
|
D6
|
D5~D3
|
D2~D0
|
32KHZ时间振荡器选择
|
系统时钟选择
|
定时器输出标记
|
系统主时钟选择
|
D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。
CLKCONSTA:时间频率状态寄存器。
D7
|
D6
|
D5~D3
|
D2~D0
|
当前32KHZ时间振荡器
|
当前系统时钟
|
当前定时器输出标记
|
当前系统主时钟
|
D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。
D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。
D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。
D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
U0CSR:USART0控制与状态;
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
模式选择
|
接收器使能
|
SPI主/从模式
|
帧错误状态
|
奇偶错误状态
|
接受状态
|
传送状态
|
收发主动状态
|
D7为工作模式选择,0为SPI模式,1为USART模式
D6为UART接收器使能,0为禁用接收器,1为接收器使能。
D5为SPI主/从模式选择,0为SPI主模式,1为SPI从模式。
D4为帧错误检测状态,0为无错误,1为出现出错。
D3为奇偶错误检测,0为无错误出现,1为出现奇偶校验错误。
D2为字节接收状态,0为没有收到字节,1为准备好接收字节。
D1为字节传送状态,0为字节没有被传送,1为写到数据缓冲区的字节已经被发送。
D0为USART接收/传送主动状态,0为USART空闲,1为USART忙碌。
U0GCR:USART0通用控制寄存器;
D7
|
D6
|
D5
|
D4~D0
|
SPI时钟极性
|
SPI时钟相位
|
传送位顺序
|
波特率指数值
|
D7为SPI时钟极性:0为负时钟极性,1为正时钟极性;
D6为SPI时钟相位:
D5为传送为顺序:0为最低有效位先传送,1为最高有效位先传送。
D4~D0为波特率设置:
波特率
|
指数值
|
小数部分
|
2400
|
6
|
59
|
4800
|
7
|
59
|
9600
|
8
|
59
|
14400
|
8
|
216
|
19200
|
9
|
59
|
28800
|
9
|
216
|
38400
|
10
|
59
|
57600
|
10
|
216
|
76800
|
11
|
59
|
115200
|
11
|
216
|
230400
|
12
|
216
|
U0BAUD:波特率控制小数部分。(取值参考上表)
源代码:
#include
#include
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define RLED P1_0
#define GLED P1_1
//函数声明
void Delay(uint);
void initUARTSEND(void);
void UartTX_Send_String(char *Data,int len);
char Txdata[25]="FEIBIT Electronics";
void Delay(uint n)
{
uint i;
for(i=0;i
for(i=0;i
for(i=0;i
for(i=0;i
for(i=0;i
}
void initUARTSEND(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //UART方式
U0GCR |= 9;
U0BAUD |= 59; //波特率设为19200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main(void)
{
uchar i;
P1DIR = 0x03; //P1控制LED
RLED = 1;
GLED = 0; //关LED
initUARTSEND();
UartTX_Send_String(Txdata,25); //FEIBIT Electronics
for(i=0;i
strcpy(Txdata," www.feibit.com "); //将UART0 TX test赋给Txdata;
while(1)
{
UartTX_Send_String(Txdata,sizeof(" www.feibit.com ")); //串口发送数据
Delay(50000); //延时
GLED=!GLED; //标志发送状态
Delay(50000);
Delay(50000);
}
}
实验总结:
波特率的设置方法:
波特率由
U0GCR中的低5位和
U0BAUD决定,例如:
U0GCR |= 9;
U0BAUD |= 59;
以上代码将波特率设为19200。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。