本帖最后由 xueyeteng 于 2023-10-20 08:53 编辑
写了个STC8系列的软件延时程序不知道咱们坛子里有没有,转过来,谁需要可以拿去。用的时候把主频改一下,keil的代码优先级设为默认8即可。这个程序每次调用比实际需要多5个机器周期。懒得弄了。一般用途也够了。
- #define MainFosc 35 // 定义晶振的主频(MHz)
- #define DelayCount (MainFosc/3)-1 //取得主频除3的整数部分-1
- #define DelayRemainder MainFosc%3 //取得主频除3的余数部分
-
- /*----------------------------
- 延时函数 1us*N 适用于STC8系列Y6指令集
- 延时 t us,就是延时 round(t * CPU / SPEED) 个机器周期
- CPU=主频/SPEED=1或12 表示单片机机器周期与时钟周期的比值 STC8为1 即时钟周期=机器周期
- t:0~65535(unsigned int) 0~255(unsigned char)
- Code:xueyeteng(引用请保留)
- ----------------------------*/
-
- void Delay(unsigned int t)
- {
- unsigned char i ;
- //未考虑首us的跳转和程序返回的call+RET共6个时钟周期时,每调用一次该函数会额外多5个机器周期(后续比较时找回一个差距)
- do //每个do while 循环运行MainFosc个时钟周期
- {
- i = DelayCount;//对应汇编代码MOV 消耗1个时钟周期 赋值i=0时消耗2个周期,即多一个CLR
- #if (DelayRemainder==1)//补齐空指令
- _nop_();
- #elif (DelayRemainder==2)
- _nop_();_nop_();
- #endif
- while (--i); //对应汇编代码DJNZ, i-1个跳转+1个不跳转 共T1=(i-1)*3+2个时钟=3i-1
- } while (--t);//对应汇编代码DJNZ , t-1个(循环体消耗的时间+跳转)+1个(循环体消耗的时间+不跳转)即(t-1)*(T1+3)+(T1+2)=t*(T1+3)-1=t*(3i+2)-1=35t
- }
复制代码
|