视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C8051F340串口通信程序
2025-09-29 09:09:25 责编:小OO
文档
C8051F340串口通信程序(UART0)

UART0 是一个异步、全双工串口,它提供标准 8051 串行口的方式 1 和方式 3。UART0

具有增强的波特率发生器电路,有多个时钟源可用于产生标准波特率(详见“18.1 增强波特

率发生器”)。接收数据缓冲机制允许 UART0 在软件尚未读取前一个数据字节的情况下开始接

收第二个输入数据字节。 

     UART0 有两个相关的特殊功能寄存器:串行控制寄存器(SCON0)和串行数据缓冲器

(SBUF0)。用同一个 SBUF0 地址可以访问发送寄存器和接收寄存器。写 SBUF0时自动访问

发送寄存器;读 SBUF0时自动访问接收寄存器,不可能从发送数据寄存器中读数据。 

如果 UART0 中断被允许,则每次发送完成(SCON0 中的 TI0 位被置‘1’)或接收到数

据字节(SCON0 中的 RI0 位被置‘1’)时将产生中断。当 CPU转向中断服务程序时硬件不清

除 UART0 中断标志。中断标志必须用软件清除,这就允许软件查询 UART0 中断的原因(发

送完成或接收完成)。

Where T1CLK is the frequency of the clock supplied to Timer 1, and T1H is the high byte of Timer 1 (reload value). 

eg:

设定的UARTBaudRate=9600bps

T1CLK =48Mhz/12=4Mhz

T1H=X

计算出X,就是reload value

9600=4*10^6/(256-X)/2

X=47.666666666666666666666666666667

X≈48=0x30

T1H=0x30 (如下表倒数第二行0x30,波特率误差为0.16%,UART通讯的波特率的误差范围一般控制在2%以内,当然也要看你的硬件设计情况,不过对于9600BIT的低速率是比较容易的)

void UART0_Init()

{

    Timer1_Init();

/*

   TI0 (SCON0.1) The TI0 Transmit Interrupt Flag

   RI0 (SCON0.0) Receive Interrupt Flag.

   ###the data byte will be loaded into the SBUF0 receive register 

      if the following conditions are met:RI0 must be logic 0,

   REN0(SCON0.4)REN0 Receive Enable bit

*/

SCON0     = 0x10;//UART0 Receive Enable.UART0 reception enabled.

Interrupts_Init();

}

void UART0_Send_data(unsigned char Send_data)

{

SBUF0=Send_data; 

while(!TI0);

TI0=0; 

}

void UART0_Send_Longdata(unsigned char *str, unsigned int Stringlen)

{

     unsigned int i; 

do { 

       UART0_Send_data(*(str+i)); 

    i++; 

   } 

while (i}

/*********************The main entry**********************/

void main( )

{

  

PCA0MD &= ~( 1<<6 );//C8051F关闭看门狗

Oscillator_Init();

Port_IO_Init();

UART0_Init();

UART0_Send_Longdata(MyBlog,strlen(MyBlog));   //发送BLOG字符串

while(1)

{

       

    if (read_flag)              //如果接收完毕标志已置位,就将读到的数从串口发出 

    { 

     read_flag= 0 ;         //接收完毕标志清0 

    

     UART0_Send_data(Byte);   //发送接收到的字符

    } 

    display_led(Byte);   

}     

  

}

void Uart0_Receive_interrupt()interrupt 4

{

    if (RI0==1)

       {

       RI0 = 0; // 清接收中断标志RI0

          Byte = SBUF0; // 从串口接收一个字符

          read_flag= 1 ; //就置位取数标志

       }

 

 

  评论这张 

转发至微博 下载本文

显示全文
专题