51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。
波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特 率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600 不是每秒种可以传送9600个字节,而是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10=960 字节。
51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。
模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率,就是说定时器 1每溢出一次,串口发送一次数据。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。
上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计 数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这 个定时模式2下定时器1溢出速率的计算公式如下:
溢出速率=(计数速 率)/(256-TH1初值)
溢出速 率=fosc/[12*(256-TH1初值)]
上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51芯片上,那么51的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
关键字:定时计数器 串口 波特率
引用地址:
51的定时计数器和串口的波特率到底关系
推荐阅读最新更新时间:2024-03-16 14:39
基于STM32实现串口的两个分案解析
首先总结一下串口232,422,485 串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”,+3V~+15V逻辑“0”。 串口422:可双向传输,4线全双工,2线单工。 串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V~+6V逻辑“1”,-2V~-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。 对于串口的实现有以两个方案: 方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进
[单片机]
【C51自学笔记】数码管(静态与动态显示)+74HC138+点阵的动态显示
数码管: 数码管由7个发光二极管组成一个日字形,如果需要显示小数点,那么就再加一个点,就是8段数码管。 数码管显示亮度高,响应速度快,分共阴和共阳两种形式,常用的有单个的和4联的,还有两联的和专门用来显示时间的。 分类:共阴;共阳 编码问题: 必须对数字或字符进行编码。因此为LED显示器提供的编码正好是一个字节。也有采用BCD-7段译码芯片的。 显示问题: 静态显示方式 静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。 动态显示
[单片机]
用51单片机定时计数器控制LED1s闪烁一次
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 void Timer0()//使用定时计数器所做的处理函数,用做定时器 { TMOD=0x01;//定时器0,方式1 TH0=0xFC;//定时1ms的初值 TL0=0x18;//定时1ms的初值 ET0=1;//打开定时计数器0使能控制位 EA=1;//打开总中断 TR0=1;//打开定时计数器0的启动控制位 } void main()//主函数 { Timer0();//调用函数 while(1); } void ledxs()interrupt 1//中断执行内容函数,用定时器
[单片机]
S51及CPLD通用下载线,S51 programmer
下载线的种类很多,用的比较多的有ByteBlaster、ByteBlaster II、ByteBIasterMV、ATMEL ISP线等。其中ByteBlaster线支持的EDA开发下载工具最多,可以用在51、CPLD、FPGA 的下载和可编程逻辑器件的周边设备仿真。一般一条商品下载线售价都在50元以上,原厂的更贵,要100元左右,而自己做一条下载线花费不到20元。适合自己制作的电路图有很多种。下面是一种可以用来对AT89S51和CPLD/FPGA芯片进行烧写的简单ByteBlaster线,如图1所示。 如果是对AT89S51板进行编程,那么LPT接并口,使用25孔电缆将借助DB25针插座与PC机的25针并口插座相连接。IDC
[单片机]
采用97C51的多功能时间控制器
摘 要: 介绍了由97C51单片机、MSM6242实时日历/时钟、X25165串行E2PROM等组成的多功能时间控制器。该时间控制器具有走时准确、多路输出、不受停电影响、操作方便、成本低等特点。并已通过软件解决了千年问题。
关键词: 日历 时钟 时间控制 千年问题
目前使用的时间控制器种类较多,如数字式、触点式等,在应用时有一定的局限性,有的功耗较大,停电后走时被复位,定时时间也需重新设定,有的定时精度差,且仅能提供一种输出,输出时段数较少。本文介绍用MSM6242作为实时时钟、X25165存放定时数据、以97C51单片机作为处理核心组成的一种多功能时间控制器。
1 时间控制器
[应用]
51单片机学习笔记:基于状态机的按键对时程序(短按,长按,连
之前的电子钟程序中,用的按键消抖处理方法是10ms的延时,这种方法效率比较低 所以现在利用状态机原理重写一下,效率很高啊 4个独立按键中用到3个, keys5用于切换对时分秒等状态,keys2是减小数值,keys3是增加数值 同时可以判断按键的 短按,长按,连发 等功能 小于2秒视为短按, 大于2秒视为长按, 在长按状态下每0.2秒自动连发一次, 这样对时的时候就不用按N次了 欢迎一起交流,qq 102351263 验证码 iteye 程序分很多个文件 ,Keil uVision4 打包 C代码 #include MY51.H #include keyScan.h #include sm
[单片机]
MSP430单片机驱动MSM7512程序
#include msp430x14x.h #define uint unsigned int #define uchar unsigned char //P1.2接RD(第9脚) #define MOD1_1 P1OUT |= BIT0 //P1.0接MOD1(第14脚) #define MOD1_0 P1OUT &= ~BIT0 #define MOD2_1 P1OUT |= BIT1 //P1.1接MOD2(第15脚) #define MOD2_0 P1OUT %= ~BIT1 void SysInit(uint x) { if (x == 1) { P1DIR = 0XFF;P1OUT = 0
[单片机]