通常情况下,8051系列单片机外接晶振频率一般是12MHz、24MHz、48MHz如图7-6-1,为什么会这样选取呢?从前面的章节已经介绍8051系列单片机的每12个时钟周期为一个指令周期,当8051系列单片机外接12MHz晶振时,指令周期=12/12MHz=1us;若外接24MHz晶振时,指令周期=12/24MHz=0.5us;若外接48MHz晶振时,指令周期=12/48MHz=0.25us。8051系列单片机外接能够被除尽的晶振,在使用单片机内部的定时器/计数器资源时作定时器使用时能够得到精确定时应用;当使用汇编语言编程时,可以清楚知道当前每一行代码执行的时间。
8051系列单片机外接能够被除尽的晶振即12MHz、24MHz、48MHz这些晶振时,波特率的精确性就得不到保证。
假若现在单片机外接的晶振为12MHz时,以T/C2作波特率发生器,根据波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=12MHz/2x16x(65536-t)
t=65496.9375
“65496.9375”不是一个整数值,是一个带有小数点的数值。对于常用的8位、9位、11位一帧的数据接收与传输,最大的允许误差分别是6.25%、5.56%、4.5%。虽然波特率允许误差,但是这样通信时便会产生积累误差,进而影响数据的正确性。唯一的解决办法就是更改单片机外接的晶振频率,更改为常用于产生精确波特率的晶振如11.0592MHz、22.1184MHz。
假若现在单片机外接的晶振为11.0592MHz时,以T/C2作波特率发生器,根据波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=11.0592MHz/2x16x(65536-t)
t=65500=0xFFDC
虽然使用11.0592MHz、22.1184MHz的晶振能够产生精确的波特率,但是用于系统精确的定时服务不是十分的理想。例如单片机外接11.0592MHz晶振时,指令周期=12/11.0592MHz≈1.085us,是一个无限循环的小数。当单片机外接22.1184MHz晶振时,指令周期=12/22.1184MHz≈0.5425us,也是一个无限循环的小数。
串口工作在方式1时分别采用T/C1和T/C2产生常用波特率初值表如下。
波特率 (11.0592MHz) | 初值 | 波特率 (12MHz) | 初值 |
TH1、TL1 (SMOD=0) | TH1、TL1 (SMOD=1) | TH1、TL1 (SMOD=0) | TH1、TL1 (SMOD=1) |
1200 | 0xE7 | 0xD0 | 1200 | 0xE5 | 0xCB |
2400 | 0xF3 | 0xE7 | 2400 | 0xF2 | 0xE5 |
4800 | 0xF9 | 0xF3 | 4800 | 0xF9 | 0xF2 |
9600 | 0xFC | 0xF9 | 9600 | 0xFC | 0xF9 |
14400 | 0xFD | 0xFB | 14400 | 0xFD | 0xFB |
19200 | 0xFE | 0xFC | 19200 | 0xFE | 0xFC |
波特率 (11.0592MHz) | 初值 | 波特率 (12MHz) | 初值 |
RCAL2H | RCAL2L | RCAL2H | RCAL2L |
1200 | 0xFE | 0xE0 | 1200 | 0xFE | 0xC8 |
2400 | 0xFF | 0x70 | 2400 | 0xFF | 0x64 |
4800 | 0xFF | 0xD8 | 4800 | 0xFF | 0xB2 |
9600 | 0xFF | 0xDC | 9600 | 0xFF | 0xD9 |
14400 | 0xFF | 0xE8 | 14400 | 0xFF | 0xE6 |
19200 | 0xFF | 0xEE | 19200 | 0xFF | 0xED |
如果大家想通过设置不同的晶振获取更加多的波特率的值,可以下载以下工具进行计算:
软件下载地址:http://files.cnblogs.com/wenziqi/单片机多功能调试助手.rar
关键字:单片机 波特率
引用地址:
单片机波特率的研究
推荐阅读最新更新时间:2024-03-16 15:27
基于LJD-ZN-8400T智能触摸液晶显示终端与单片机的接
作为一种常见的显示设备,LCD具有功耗低,体积小,重量轻,显示信息量大等特点,尤其是在便携设备中,更占据着绝对主流的地位。对于字符或数字的简单信息显示,通常可用段码式LCD驱动器。对于复杂的信息显示,则必须由点阵式LCD驱动器来显示。最常见的点阵式LCD控制/驱动器中,有不带中文字库的LCD驱动器,也有带中文字库的LCD驱动器。随着嵌入式系统的广泛应用,出现了大量的16位和32位的嵌入式处理器。然而传统的8位单片机长期用于生产实践中,制造工艺成熟,性能更加可靠,因此仍然占有相当大的市场,特别是在汽车电子等对可靠性要求极高的领域。液晶显示器具有显示信息量丰富,功耗低,体积小,质量轻,无辐射等优点。触摸屏作为一种特殊的计算机外设,
[单片机]
PIC单片机实现CRC的小程序
PIC单片机实现CRC的小程序 PIC单片机实现Dallas的iButton通讯时,编了段产生和校验CRC的子程序。 ; PIC单片机 www.pic16.com #include P16CE625.INC ;------------------------------- cblock 0x20 datBuff:8 ;assign 8 byte data buffer bit_cnt ;bit counting CRC_COUNT ;number of bytes for CRC CRC_RESULT ;CRC resulr crc_temp ;temporary
[单片机]
STC单片机实现可调PWM输出的C51程序
//以下是源程序,只需修改定义IO口就可以使用,#include reg52.h #include intrins.h sbit K1 =P3^2 ; //增加键 sbit K2 =P3^3 ; //减少键 sbit BEEP =P3^1 ; //蜂鸣器 sbit pp =P3^7 ; unsigned char PWM=0x7f ; //赋初值 void Beep(); void delayms(unsigned char ms); void delay(unsigned char t); /***********************************************
[单片机]
基于单片机的高精度智能交直流电压数据采集系统设计
电压是电子与电力系统中最基本的测量元素之一,快速准确地获取电压值一直是数据采集与电子测量仪器研究的重要内容之一。传统的指针式电压表具有精度低、可视距离近、功能单一等缺陷,已不适应高速信息化的发展需要。目前市场上广泛使用的数字电压表智能化程度低,测量电压时需手动切换量程,当量程选择不当时会出现测量精度下降、乃至烧坏电压表的极端情况;而高精度的全量程无档数字电压表一般都采用了DSP、FPGA或CPLD等复杂电路系统,硬件和软件实现成本较高。为此,笔者设计研制出了一种以单片机为控制主体的智能交流直流电压数据采集系统,具有体积小、精度高、结构简单、使用与读数方便、性价比高、适应范围宽等优点,有效地弥补了上述各种电压表系统的缺点和弊端。 1
[单片机]
松下分体空调单片机控温度检测回路联接电路图
松下分体空调单片机控温度检测回路联接电路图:
[单片机]
如何提升单片机编程水平
现在大多数从事单片机行业的一般会选择软件开发。 大家在编程的时候,有没有一种感觉就是 功能基本上都能实现,但是总觉得自己的编程,缺少了一点东西。不够完美,多多少少都存在一些瑕疵,代码移植性不高。功能的扩展也不好。 上交时,最怕的就是自己的程序有问题打回来返工,原因肯定是出在自己身上,是自己的不够强大。才导致这些问题的出现,提升编程水平是每个程序员时时刻刻都在想的事。 要想程序提升的快,没有人一个厉害的人带,你真的会非常的难,困难! 要想找到一个愿意带你的人,也是非常难的。 主要有以下几点原因: 有厉害的人带你,你的眼界会提升的很快;提升编程水平,有时候不是我们做的越久就意味着代码写的就越好,就像池塘里的鱼已经觉得,在池塘里游泳的空
[单片机]
基于51单片机的nrf24l01无线的接收和发射程序
通过灯的闪烁来判断数据的接受和发射 有接收端和发射段的程序 如果24L01用reg51那么两个设备都要用reg51,如果用reg52就都得用reg52! PC通过串口发送给单片机命令 ,单片机把命令通过24L01无线发送给另一个单片机,另一个单片机控制灯LED1,LED2,LED3,LED4闪烁。 无线发射程序: #include 2401.h #define uint unsigned int #define uchar unsigned char //1//sbit KEY1=P0^0; //发送按键 //1//sbit KEY2=P0^1; //1//sbit KEY3=P0^2
[单片机]
51单片机控制步进电机-让电机转起来
摘要: 本节介绍用简单的方式,让步进电机转起来。其目的之一是对电机转动有直观的感受,二是熟悉整个开发流程 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分,相关基础教程网上很多,可以自行学习 一、软件清单 需要用到的软件有keil5编译软件、STC程序烧录软件 二、控制原理 根据TB6600驱动器原理,向PUL口发送脉冲,每发送一个脉冲,电机就转一步。通过单片机延时的方式,切换PUL口电平产生脉冲,从而控制电机转动。 三、程序代码 //毫秒延时函数 void delay(unsigned int z) { unsigned int x,y; for(x=z;x 0;x--) for(y
[单片机]