STC8h的Delay延时函数 | 已解决
本帖最后由 未元星系 于 2024-5-26 12:44 编辑STC8H8K64U的毫秒延时函数只能精确在1-255ms吗
你可以用这个啊。精确在1-65535ms
/*********************************************
程序名称 :延时函数
*********************************************/
//#define MAIN_Fosc 48000000L //定义主时钟
//#define MAIN_Fosc 44236800L //定义主时钟
//#define MAIN_Fosc 40000000L //定义主时钟
//#define MAIN_Fosc 36864000L //定义主时钟
//#define MAIN_Fosc 35000000L //定义主时钟
//#define MAIN_Fosc 33177600L //定义主时钟
//#define MAIN_Fosc 30000000L //定义主时钟
//#define MAIN_Fosc 27000000L //定义主时钟
//#define MAIN_Fosc 24000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 20000000L //定义主时钟
//#define MAIN_Fosc 18432000L //定义主时钟
#define MAIN_Fosc 12000000L //定义主时钟
//#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 6000000L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
void Delay(unsigned int ms) //注:ms_max=65536
{
unsigned int i;
do
{
// i=MAIN_Fosc/96000L; //STC89/90_12T
// i=MAIN_Fosc/48000L; //STC89/90_6T
// i=MAIN_Fosc/14000; //STC12
// i=MAIN_Fosc/13000; //STC15
i=MAIN_Fosc/10000; //STC8
// i=MAIN_Fosc/6030; //STC32
while(--i) ;
}
while(--ms);
}
时钟不同,能延时的范围也不同,还有分频,这些都有关系.修改一下看看 angmall 发表于 2024-5-19 00:19
你可以用这个啊。精确在1-65535ms
好资料,先收藏,谢谢分享! 这个不错只要有主频就可以计算延时 很好的万能延时函数,收藏了。{:4_196:} 还是用定时器+计数器比较好
如果只是临时需要延时,直接可以把库函数中的unsigned char里把char改成int,这样肯定比255大,不会出现溢出。
如果使用延时函数,有相对高的要求,可以参考以下三种方案:
第一种,在常用的主频确定的情况下,用STC-ISP里的“软件延时计数器”,分别生成1us和1ms的精确延时,然后改写成对应的Delay_us和Delay_ms函数,如下:
void Delay1ms(void) //@22.1184MHz
{
u8 data i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void Delay_ms(u16 ms)
{
u16 i;
for(i=0;i<ms;i++)
{
Delay1ms();
}
}
第二种:把一个不经常用的定时器,改写成延时函数,可以实现非常精准的延时。
第三种:二楼那位的回答。
每一种方式都各有优略,但还是推荐第一种,毕竟初学者一般从开始点灯到后期整板成一个小项目,基本不会过多的去改变主频。利用官方isp生成相对精准且可靠的延时满足使用即可。 Yim_Hom 发表于 2024-5-19 11:53
如果只是临时需要延时,直接可以把库函数中的unsigned char里把char改成int,这样肯定比255大,不会出现溢 ...
谢谢大佬,很有帮助{:handshake:}
页:
[1]
2