找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2029|回复: 4
打印 上一主题 下一主题
收起左侧

单片机延时函数unsigned int为什么不能替换unsigned char

[复制链接]
跳转到指定楼层
楼主
ID:608872 发表于 2019-10-25 16:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*us级延时,延时时间约4+2*i*/
void Delayus(unsigned char i)
{
  while(--i);
}
Delayus(150);
Delayus(150);//产生上升沿,延时约15~60us

想把两个延时Delayus(150);合并成一个Delayus(300);
因为unsigned char范围是0-255,所以想用unsigned int范围0-65535替代
为什么替换后,程序读取不了DS18B20的数据呢

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-10-25 17:21 | 只看该作者
CPU处理16位数据与处理8位数据耗时不同,延时函数中只是简单改变数据类型并不能得到准确的想象中的延时时间。对于对时序敏感的外围器件往往不能如愿。
T=ix2+5 uS
void Delayus(unsigned char i)
{
  while(--i);
}
上述函数在12M时钟条件下Delayus(150);延时305us,改为unsigned int类型其它不变,延时长达1.2ms。如果参数再改为300,延时时间接近2.5ms。
回复

使用道具 举报

板凳
ID:89515 发表于 2019-10-25 17:22 来自手机 | 只看该作者
c语言无法用软件方式做到精确延时,数据大了,误差当然也大了。你需要从新仿真一下
回复

使用道具 举报

地板
ID:235200 发表于 2019-10-25 17:26 | 只看该作者
理论上是可行的,但实际中由于编译系统的问题可能会造成错误,我也曾是遇到过,把程序改成void Delayus(unsigned int i)
{
unsigned int j=0;
  while(j++>i);
}
又没有问题了
回复

使用道具 举报

5#
ID:617981 发表于 2019-10-25 17:51 | 只看该作者
最好拿示波器看下延时宽度,软件这样做的话编译后时间是不一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表