05 单片机串口

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;
}



05 单片机串口_第1张图片


05 单片机串口_第2张图片


05 单片机串口_第3张图片


05 单片机串口_第4张图片



串口模块:


头文件:

#ifndef __UART_H__
#define __UART_H__

extern void InitUart();   //初始化串口
extern void Uart_Send_String(unsigned char *Data,int len);

#endif



实现文件:


#include 

#define uchar unsigned char
#define uint unsigned int
void 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


你可能感兴趣的:(ZigBee)