历史上的今天
今天是:2025年03月18日(星期二)
2019年03月18日 | 51单片机串口配置
2019-03-18 来源:eefocus
1.配置串口工作模式为模式1。即设置SCON寄存器(SM0,SM1,REN位),SCON |= 0X50;(SM0 = 0,SM1 = 1,REN =1).
SM0 = 0,SM1 = 0 方式0:同步移位串行方式:波特率= SYSclk / 12.
SM0 = 0,SM1 = 1 方式1:8位UART,波特率可变: 波特率 = (2^SMOD / 32) * (定时器1的溢出率)
SM0 = 1,SM1 = 0 方式2:9位UART: 波特率 = (2^SMOD / 64) * (SYSclk系统工作时钟频率)
SM0 = 1,SM1 = 1 方式3: 8位UART,波特率可变: 波特率 = (2^SMOD / 32) * (定时器1的溢出率)
注意:
当单片机工作在12T模式时,定时器1的溢出率 = SYSclk / 12 / (256 - TH1);
当单片机工作在1T模式时,定时器1的溢出率 = SYSclk / 6 / (256 - TH1);
SMOD默认为0。具体作用参考数据手册。
2.配置定时器1为模式2,即自动重装载模式。TMOD &= 0X0F; TMOD |= 0X20.
3.根据波特率计算TH1,TL1的初值,如果有需要可使用PCON进行波特率加倍(PCON最高位为波特率加倍位)。
计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 2 / 16 / 波特率;
如果波特率加倍则:PCON |= 0X80; 计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 16 / 波特率;
4.打开定时器控制寄存器TR1,启动定时器。
5.如果需要开串口中断,则 ES =1;
while(1)
{
while(!RI);// 等待接收完一字节数据
RI = 0; // 需软件清零
SBUF = SBUF +1;// 把接收的数据+1再发送出去
while(!TI);// 等待发送完一字节数据
TI = 0; // 需软件清零
}
注意:如果定时器1作为串口波特率发生器后不可再用作普通定时器。
一般我们可以准备好要发送的数据,TI = 1,会立即进入串口发送中断,可在串口发送中断中发送要发的数据。RI一旦为1表示接受中断发生,进中断取数据。
下一篇:51定时器使用
史海拾趣
|
上一篇中(即《Android编译环境(1) - 编译Native C的helloworld模块》),我们试用了通过标准的Android.mk文件来编译C模块,下面我们来试试如何直接运用gcc命令行来编译,从而了解Android编译环境的细节。 Android编译环境提供了”showcommands” ...… 查看全部问答> |
|
本人在利用wince开发汽车故障诊断系统 采用扬创S3c2440开发板 打算采用BP神经网络的作为诊断的算法 想知道有人做过类似的不? 系统资源能否支持呢? ps:s3c2440主频500M 32m内存 小弟再次谢过… 查看全部问答> |
|
这段代码是我老师给我的,是用keil uvision2软件纺写的 是bulkloop框架里的 void DA5384(unsigned char indata) { unsigned char i; unsigned int mydata; unsigned int dataT; //SCLK =PA0, DIN=PA1 CS =PA5 ...… 查看全部问答> |
|
#include bit b1,b2; bdata char bx,by; xdata char zz; pdata char buf[100]; void main (void) { { b1=0; b2=1; bx=12; ...… 查看全部问答> |
|
本节通过一个例子来说明C程序从浮点变换至定点的方法。这是一个对语音信号(0.3kHz~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在i ...… 查看全部问答> |




