找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 304|回复: 6
收起左侧

求教STC单片机软件延时问题

[复制链接]
ID:483407 发表于 2024-12-12 16:37 | 显示全部楼层 |阅读模式
在使用1602液晶延时函数时,发现了这个STC8F2K6S2,在使用延时函数的时候,修改毫秒、50毫秒、秒这3个函数的循环次数,都可以改变延时的结果,但是对于50微秒这个函数中,将i改为100,50,20,最后的延时都没有改变!搞不明白这是为什么?
void delay_50us(uchar us50){        //@12.000MHz
        uchar  i;
        i = 198;                  //i=198:STC软件中查到的12M时钟数据
        while(us50--)while (--i);
}
void delay_ms(unsigned char ms){
        while(ms--)delay_50us(20);          //100
}
void delay_50ms(uchar i){
        while(i--)delay_ms(50);
}
void delay_s(unsigned char s){
        while(s--)delay_50ms(20);
}


clock.rar

137.18 KB, 下载次数: 0

回复

使用道具 举报

ID:92781 发表于 2024-12-13 10:47 | 显示全部楼层
重新看了一下,楼下是对的,void delay_50us(uchar us50)的局部变量i在第一次循环到0之后没有重新赋值,后面相当于都是while(0),直接跳过了
回复

使用道具 举报

ID:161164 发表于 2024-12-13 11:47 | 显示全部楼层
因为i没有重装
  1. void delay_50us(uchar us50)         //@12.000MHz
  2. {
  3.         uchar  i;
  4.         while(us50--)
  5.         {
  6.                 i = 198;                  //i=198:STC软件中查到的12M时钟数据
  7.                 while (--i);
  8.         }
  9. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
jjy1039 + 5 很给力!很认真,我第一次看的时候忽略了,.

查看全部评分

回复

使用道具 举报

ID:1109793 发表于 2024-12-13 13:14 | 显示全部楼层
板凳说的对,局部变量只初始化一次,所以只在调用时=198;之后都是0,--i就是255了。在循环内部I = 198;就OK了。
回复

使用道具 举报

ID:1139662 发表于 2024-12-13 14:58 来自手机 | 显示全部楼层
1.循环变量初始化位置:在delay_50us函数中,变量i的初始化应该放在内层while循环的内部,以确保每次外层while循环时i都能被重新初始化。如果i只初始化一次,那么不论外层循环执行多少次,i的值都不会改变,导致延时不变。正确的做法是将i = 198;放在内层while循环内部,如下所示: void delay_50us(uchar us50){     //@12.000MHz     uchar  i;     while(us50--){         i = 198; // i=198:STC软件中查到的12M时钟数据         while (--i);     } } 这样
回复

使用道具 举报

ID:1139664 发表于 2024-12-13 17:08 | 显示全部楼层
是不是太快了你没看出来啊
回复

使用道具 举报

ID:483407 发表于 2024-12-19 11:40 | 显示全部楼层
论坛里有经验的高手很多呀,感谢2、3、4、5、6楼的各位。仔细看了一下代码,确实如各位所说。我还是经验缺
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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