找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 185|回复: 2
打印 上一主题 下一主题
收起左侧

请详细讲解一下不同时钟下延时、定时自适配问题

[复制链接]
跳转到指定楼层
楼主
ID:33548 发表于 2025-8-27 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手们详细讲解一下,STC单片机,在不同时钟频率下,不用改代码,有关延时函数、定时时间、波特率等自适配问题,代码怎么写?最好出一期详细的视频讲解。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1073939 发表于 2025-8-29 16:11 | 只看该作者
本帖最后由 ydatou 于 2025-8-30 08:48 编辑

我的做法·是定义3个常量。
系统时钟频率
指令机器周期数
定时器机器周期数
有了这3个常量可以适配任何51mcu,不用改代码,只改这3个常量。
下面的配置是十速的51mcu。
  1. #define FOSC                7.3728//11.0592        //
  2. #define MACHINE_NUM 2                //定时器
  3. #define M_NUM       2                //程序  SH88F2051 程序是1T,定时器1T/12T可选
  4. #define COVERT(T) ( (T*FOSC+M_NUM) / (M_NUM*2) -1 )

  5. #define _COUNT_560uS_ ((uint16)(-560L*FOSC/MACHINE_NUM))//560uS
  6.         #define _COUNT_560uS_LO        (_COUNT_560uS_ & 0x00FF)
  7.         #define _COUNT_560uS_HI        (_COUNT_560uS_ >> 8)
  8. #define _COUNT_1mS_ ((uint16)(-1000L*FOSC/MACHINE_NUM))//1000uS
  9.         #define _COUNT_1mS_LO        (_COUNT_1mS_ & 0x00FF)
  10.         #define _COUNT_1mS_HI        (_COUNT_1mS_ >> 8)

  11. #define DELAY_uS(DlyTime) do{uint8 nCount;nCount=MIN(MAX(COVERT(DlyTime),1),256);do{}while(--nCount);}while(0)
  12.         //Note:实际延时效果C51                12M         4<= DlyTime <= 514(uS)
  13.         //Note:实际延时效果88F54        16.6M        1<= DlyTime <= 31(uS)
  14. //#if (M_NUM==1)
  15. //        #define delay_1mS() do{ uint8 x=30; do{ DELAY_uS(33.0); }while(--x);        }while(0)
  16. //#else
  17. //        #if(M_NUM==12)
  18. //                #define delay_1mS() do{ DELAY_uS(333.0);DELAY_uS(333.0); DELAY_uS(333.0); }while(0)
  19. //        #else
  20. //                #define delay_1mS() do{ uint8 x=10; do{ DELAY_uS(99.0); }while(--x); }while(0)
  21. //        #endif
  22. //#endif
  23. //#define delay_mS(mSEC) do{uint16 ms=mSEC; do{delay_1mS();WDT_reset();T2CON=0x04;}while(--ms);                }while(0)
复制代码




回复

使用道具 举报

板凳
ID:1133081 发表于 2025-8-29 22:14 | 只看该作者
  1. /*********************************************
  2.    程序名称:延时函数
  3. *********************************************/

  4. //#define MAIN_Fosc 48000000L        //定义主时钟
  5. //#define MAIN_Fosc 44236800L        //定义主时钟
  6. //#define MAIN_Fosc 40000000L        //定义主时钟
  7. //#define MAIN_Fosc 36864000L        //定义主时钟
  8. //#define MAIN_Fosc 35000000L        //定义主时钟
  9. //#define MAIN_Fosc 33177600L        //定义主时钟
  10. //#define MAIN_Fosc 30000000L        //定义主时钟
  11. //#define MAIN_Fosc 27000000L        //定义主时钟
  12. //#define MAIN_Fosc 24000000L        //定义主时钟
  13. //#define MAIN_Fosc 22118400L        //定义主时钟
  14. //#define MAIN_Fosc 20000000L        //定义主时钟
  15. //#define MAIN_Fosc 18432000L        //定义主时钟
  16. #define MAIN_Fosc 12000000L        //定义主时钟
  17. //#define MAIN_Fosc 11059200L        //定义主时钟
  18. //#define MAIN_Fosc 6000000L        //定义主时钟
  19. //#define MAIN_Fosc 5529600L        //定义主时钟

  20. void Delay(unsigned int ms)//注:ms_max=65536
  21. {
  22.         unsigned int i;
  23.         do
  24.         {
  25. //                i=MAIN_Fosc/96000L; //STC89_12T
  26. //                i=MAIN_Fosc/48000L; //STC89_6T
  27. //                i=MAIN_Fosc/14000;  //STC12
  28. //                i=MAIN_Fosc/13000;  //STC15
  29.                 i=MAIN_Fosc/10000;  //STC8
  30. //                i=MAIN_Fosc/6030;   //STC32
  31.                 while(--i);
  32.         }
  33.         while(--ms);
  34. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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