浅谈延迟函数执行一次延迟多少秒以及跑马灯的感想

1.波特率未知,下回再说,先洗澡
2.位移运算
3.P0和P0^0

/*******************************************************************************
延时函数
i=1,延时10微秒
i=50000,延时450ms
*******************************************************************************/
void delay(u16 i)
{
   
	while(i--);	
}

为什么是50000的时候延时450毫秒?在这里插入图片描述
在这里插入图片描述在这里插入图片描述
通过调试单步执行,我们可以看到两次之间间隔差不多就是450毫秒。
延时时间是多少,仅仅靠这条语句是无法确定的,与很多因素有关,比如晶振的大小,指令周期时间等等,比如同样是12M晶振,8051是指令周期是1us,而STC89C51是0.5us;STC12C5A60S2是1/12us。

《51系列单片机晶振12MHz与11.0592MHz应用区别》

设定T1工作于方式2,8位计数寄存器,自动重装计数初值,
N是初始化时写入THI及TH2的计数初值,
SMOD取0(不倍增)波特率 =Fosc/[(32x12x(256-N)]

若晶振为12MHz , N=243 ,
波特率=(12x10^6)/[32x12x(256-243)]=2403.846b/s
有3.846b/s的误差

若晶振为11.0592MHz,计数初值N=244 ,
产生的波特率=11059200/[32x12x(256-244)=2400b/s,精确。

[小结]
若单片机用于串行通信,为提高数据可靠性,应选用11.0592MHz晶振;
若单片机用于其它用途,可选用12MHz晶振。

板凳的说法很典型,看上去很有道理。
想想,11.0592,一定工作于11.0592吗?测过没有?
12M,一定工作于12M吗,波特率真的达不到9600?
如果变成了9606又会如何呢?

事实上,市场上的晶振多数不准。1、2毛钱一个的晶振常常偏差0.1%以上。在这个基础再讨论两者的区别意义就不大了。
但好的晶振,确如板凳所言。
对于串口通讯,是允许波特率有差异的,所以在要在9600附近即可。从这个意义上讲,11.0592与12.00可以随用。(当然参数还是不同的,并不是直接代换)。
如果两台机都用12M,或两台机都用11.0592,会比一台用12,一台用11.0952好一些。但也不是不能用。
楼主有此一问,是由于对串口通讯理解的不深,理解透了,就无所谓12或11.0592了。
只有一些特殊的场合才会出现只能11.0592而不能用12.00。主要是在硬件分频时,或是在有相位要求的场合,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值