求问MCU小问题

[复制链接]
2851|13
 楼主| sqcumt123 发表于 2012-10-30 20:48 | 显示全部楼层 |阅读模式
void delayms(int ms)
{   
   int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<3338;jj++);    //40MHz--1ms      
}
这段程序问什么能实现40MHz--?1ms
永远的不知 发表于 2012-10-30 21:41 | 显示全部楼层
1# sqcumt123 首先要先看系统系统和指令时钟的关系,实现1ms,靠的是指令的延时。
如果定时器有空余,最好用定时器来做延时。
爱之翼V 发表于 2012-10-31 09:21 | 显示全部楼层
40mhz 没有分频了话 也就是说一个时钟周期是1/40us,,,这个程序是说   ms等于几 就是延时几毫秒。最少是延时1ms,因为这句话(  if (ms<1) ms=1;)
接着,,,两个for循环意思是 数这么多下:ms*3338
数一下的时间是一个机器周期,    机器周期=2n*时钟周期(n代表这个类型的mcu的一个机器周期是由几个状态周期组成的,而一个状态周期=2个时钟周期)
假设你用的51内核,机器周期=12时钟周期
当ms=1时
delay=1*3338*1/40*12=1001.4us=1.0014ms
tianm 发表于 2012-10-31 09:24 | 显示全部楼层
这种方法对定时要求不高的时候  可以用
hawksabre 发表于 2012-11-2 18:02 | 显示全部楼层
可以实现   不过用C语言实现   精度可能不高   如果想要精确实现   建议使用汇编语言实现   采用混合编程   这一块   需要使用C语言实现汇编语言的调用
happy啦啦啦 发表于 2012-11-2 21:01 | 显示全部楼层
这种延迟精度很差劲的,不高的话可以用
happybird21 发表于 2012-11-2 21:03 | 显示全部楼层
看你选什么晶振了,有公式的可以计算 不过精度不高
springspring 发表于 2012-11-2 21:07 | 显示全部楼层
一般延迟可以用的
lasbell2012 发表于 2012-11-2 21:09 | 显示全部楼层
汇编的精度还是很不错的
51xlf 发表于 2012-11-2 23:02 | 显示全部楼层
应该是分频了吧,要不怎么可能是1ms呢?
eemyicworld 发表于 2012-12-7 12:07 | 显示全部楼层
这样使用精度都不高.
lapeno 发表于 2012-12-7 13:59 | 显示全部楼层
可以用啊,用定时器也得有响应中断的时间,都不会特别准确,做一般的延时足够了。
readygo2012 发表于 2012-12-7 23:07 | 显示全部楼层
这延时的时间系统时钟有关,但是如果这样延时有点浪费处理器资源。
gaochy1126 发表于 2012-12-7 23:08 | 显示全部楼层
应该是分频了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

2107

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部