05 单片机串口

来源:互联网 发布:逆战刷永久枪软件 编辑:程序博客网 时间:2024/05/22 07:51
1.2530有两个串口UART0和UART1。

2.他们都有两组备用位置。
UART0:一般是P0_2,P0_3,另一组是P1_4和P1_5;
UART1:一般是P0_4,P0_5,另一组是P1_2和P1_3;

3.可以通过PERCGF寄存器选择备用位置。

4.当选择好备用位置以后,要将相应的IO口设置为外设功能,而不是通用IO口功能。

5.关于流控,奇偶校验位,以及停止位数据位的设置采用默认配置方式。即将
U0UCR = 0;

6.控制寄存器在U0CSR。U0GCR和U0BAUD共同决定波特率。

7.串口初始化流程:
(1)选择IO引脚(PERCFG)
(2)设置IO工作模式(PxSEL)
(3)设置收发模式(U0CSR)
(4)设置停止位以及奇偶校验位(U0UCR)
(5)设置波特率(UxBAUD UxGCR)
(6)开启串口接收中断(IEN0或者IEN2)
(7)开启总中断。(EA=1)

void UartCfg()
{//串口0的备用位置1配置成波特率9600
   PERCFG &=0xFE;//1111 1110 选中串口0的的备用位置1
   P0SEL  |=0x0C;       //0000 1100 P0_2 p0_3为偏上外设功能

   U0CSR |=0Xc0;

   U0GCR =8;
   U0BAUD=59;
   EA=1;
   URX0IE=1;
}

8.注意,发送中断在IEN2,接收中断在IEN0。不管是UART0还是UART1.

9.串口发送:
(1)将要发送的char类型变量赋值给UxDBUF
(2)while(UTXxIF == 0),等待发送中断标志变为1
(3)UTXxIF = 0,清除中断标志。

10.串口接收:
(1)清除接收中断标志URXxIF = 0;
(2)读取UxDBUF到char类型的变量

#pragma vector=URX0_VECTOR
__interrupt void sdfs(void)
{

    URX0IF=0;//串口0来数据的标志位,硬件会置1,我们软件要清0
    ch=U0DBUF;//从接受寄存器里取字节存入变量ch

    U0DBUF=ch;//把变量ch里的值赋给串口0发送数据寄存器
    while(0==UTX0IF);
    UTX0IF=0;
}












串口模块:


头文件:

#ifndef __UART_H__#define __UART_H__extern void InitUart();   //初始化串口extern void Uart_Send_String(unsigned char *Data,int len);#endif



实现文件:


#include <ioCC2530.h>#define uchar unsigned char#define uint unsigned intvoid InitUart();              //初始化串口void Uart_Send_String(unsigned char *Data,int len);/****************************************************************    串口初始化函数     ***********************************************************/void InitUart(){    CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振    while(CLKCONSTA & 0x40);                     // 等待晶振稳定     CLKCONCMD &= ~0x47;                          // 设置系统主时钟频率为 32MHZ  PERCFG&=~0x01;   //有2个备用位置,0使用备用位置1;1使用备用位置2  P0SEL |= 0x0C;   //P0_2 RXD P0_3 TXD 外设功能 0000 1100   U0CSR |= 0xC0;  //串口接收使能  1100 0000 工作UART模式+允许接受  U0UCR |= 0x00;  //无奇偶校验,1位停止位   U0GCR |= 11;           //U0GCR与U0BAUD配合       U0BAUD |= 216;       // 波特率设为115200    IEN0 |= 0X04;     //开串口接收中断 'URX0IE = 1',也可以写成 URX0IE=1;  EA=1;    }void Uart0_SendCh(char ch){    U0DBUF = ch;    while(UTX0IF == 0);    UTX0IF = 0;}/**************************************************************** 串口发送字符串函数    ****************************************************************/ void Uart_Send_String(unsigned char *Data,int len) { {   int j;   for(j=0;j<len;j++)   {      Uart0_SendCh(*Data++);   }  }}


0 0