继C51精确延时函数,再次写的PIC18精确延时函数

2020-02-07 09:39发布

/* PIC18 software interface header */
#define Fosc 11059200                    //XTAL = 11.0592MHz
#define Fcy    (Fosc/4)                    //2764800Hz

void
User_Delay_Ms(uchar number)    //delay=((((num1*4)+4)*num2+6)*number+13)/Fcy        
{
    static unsigned char     num1,
                         num2;
    do
    {
        num2 = 10;
        do
        {
            num1 = Fcy/40322;   
            while(--num1);   
        }while(--num2);   
    }while(--number);   
}
欢迎测试!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
wangqh1983
1楼-- · 2020-02-08 07:58
感谢你的评说,不过也确实有道理。
this will create a problem when num1 is calculated to be 0 - from very low Fcy for example. I would use "while (num1--) continue;" instead.
但是这个形参如果输入0,将是错误的;不过也让人很难理解。不会有人需要0ms的延时吧。有些时候要求时序比较严格的情况下,我们可以将总中断关闭。
millwood0
2楼-- · 2020-02-08 13:42
"不会有人需要0ms的延时吧。"

it is about the (predictable) behavior of the code: delay_ms(2) is 1 ms, delay_ms(1) is 1ms, delay_ms(0) is 256ms (or32kms, depending on the data type).

that kind of behavior is unexpected for most people.
wangqh1983
3楼-- · 2020-02-08 18:13
it is about the (predictable) behavior of the code: delay_ms(2) is 1 ms

(原文件名:2012-2-26 7-23-49.png)
这个不会啊,但是输入0是错误的。
wangqh1983
4楼-- · 2020-02-08 20:07
I would use "while (num1--) continue;" instead.

如果将代码改成while(number--);汇编代码将会增加,须从新计算Tcy。
ZYBing
5楼-- · 2020-02-09 01:05
 精彩回答 2  元偷偷看……
steaven2000
6楼-- · 2020-02-09 05:15
考虑到中断了吗?呵呵

一周热门 更多>