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<Stringlen);

}
/*********************The main entry**********************/
void main( )// http://hi.baidu.com/helloelectron
{

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 ; //就置位取数标志
}

 

}

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值