找回密码
 立即注册
查看: 531|回复: 3

STC8H8K64U, T2/T3/T4做24位定时器不正常 | 已解决

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:49
  • 最近打卡:2025-04-30 15:23:41

2

主题

6

回帖

292

积分

中级会员

积分
292
发表于 2024-7-1 16:52:47 | 显示全部楼层 |阅读模式
今天在一个项目中打算用24位定时器做个长定时,但忙了一天没结果。
不知是什么原因?
修改分频寄存器TM2PS,TM3PS,TM4PS定时时长没改变!
demo.rar (43.3 KB, 下载次数: 59)

IMG_20240701_162029_edit_3914797084165147[1].jpg
截图202407011648397821.jpg

  1. #include <STC8H.H>
  2. #define ET2         0x04
  3. #define ET3         0x20
  4. #define ET4         0x40
  5. #define T2IF        0x01
  6. #define T3IF        0x02
  7. #define T4IF        0x04
  8. #define PIN_LED1    P46
  9. #define PIN_LED2    P00
  10. #define PIN_LED3    P01
  11. void Reset(void){
  12. //        IAP_CONTR = 0x20;           //软件复位,系统重新从用户代码区开始运行程序
  13.         IAP_CONTR = 0x60;           //软件复位,系统重新从ISP代码区开始运行程序
  14. }
  15. void TM2_Isr() interrupt 12
  16. {
  17.     PIN_LED1 = !PIN_LED1;                                 //测试端口
  18. }
  19. void TM3_Isr() interrupt 19
  20. {
  21.     PIN_LED2 = !PIN_LED2;                                 //测试端口
  22. }
  23. void TM4_Isr() interrupt 20
  24. {
  25.     PIN_LED3 = !PIN_LED3;                                 //测试端口
  26. }
  27. void UART1_Isr() interrupt 4
  28. {
  29.     if (TI)
  30.     {
  31.         TI = 0;                                 //清中断标志
  32.     }
  33.     if (RI)
  34.     {
  35.         RI = 0;                                 //清中断标志
  36.         Reset();
  37.     }
  38. }
  39. void Timer2_Init(void)                //200毫秒@6.000MHz
  40. {
  41.         TM2PS = 0x01;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  42.         AUXR &= 0xFB;                        //定时器时钟12T模式
  43.         T2L = 0xB0;                                //设置定时初始值
  44.         T2H = 0x3C;                                //设置定时初始值
  45.         AUXR |= 0x10;                        //定时器2开始计时
  46.     IE2 |= ET2;             //使能定时器中断
  47. }
  48. void Timer3_Init(void)                //300毫秒@6.000MHz
  49. {
  50.         TM3PS = 0x02;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  51.         T4T3M &= 0xFD;                        //定时器时钟12T模式
  52.         T3L = 0xB0;                                //设置定时初始值
  53.         T3H = 0x3C;                                //设置定时初始值
  54.         T4T3M |= 0x08;                        //定时器3开始计时
  55.     IE2 |= ET3;             //使能定时器中断
  56. }
  57. void Timer4_Init(void)                //400毫秒@6.000MHz
  58. {
  59.         TM4PS = 0x03;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  60.         T4T3M &= 0xDF;                        //定时器时钟12T模式
  61.         T4L = 0xB0;                                //设置定时初始值
  62.         T4H = 0x3C;                                //设置定时初始值
  63.         T4T3M |= 0x80;                        //定时器4开始计时
  64.     IE2 |= ET4;             //使能定时器中断
  65. }
  66. void Uart1_Init(void)        //4800bps@6.000MHz
  67. {
  68.         SCON = 0x50;                //8位数据,可变波特率
  69.         AUXR &= 0xBF;                //定时器时钟12T模式
  70.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  71.         TMOD &= 0x0F;                //设置定时器模式
  72.         TL1 = 0xE6;                        //设置定时初始值
  73.         TH1 = 0xFF;                        //设置定时初始值
  74.         ET1 = 0;                        //禁止定时器中断
  75.         TR1 = 1;                        //定时器1开始计时
  76.     ES = 1;             //使能串口1中断
  77. }
  78. void main(void){
  79.     P0M0 = 0x00;
  80.     P0M1 = 0x00;
  81.     P1M0 = 0x00;
  82.     P1M1 = 0x00;
  83.     P2M0 = 0x00;
  84.     P2M1 = 0x00;
  85.     P3M0 = 0x00;
  86.     P3M1 = 0x00;
  87.     P4M0 = 0x00;
  88.     P4M1 = 0x00;
  89.     P5M0 = 0x00;
  90.     P5M1 = 0x00;
  91.     Uart1_Init();
  92.     Timer2_Init();
  93.     Timer3_Init();
  94.     Timer4_Init();
  95.    
  96.     P0 = 0;
  97.     P1 = 0xC0;
  98.     P2 = 0;
  99.     P3 = 3;
  100.     P4 = 0x80;
  101.     P5 = 0;
  102.     EA = 1;
  103.     while (1);
  104. }
复制代码




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-1 17:12:12 | 显示全部楼层
#define EAXSFR() P_SW2 |= 0x80 ;
/* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */

加上这个,,主函数里面
void main(void){
EAXSFR();
...
}

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-1 17:12:54 | 显示全部楼层
不加这个 你调一个月也调不出来
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:49
  • 最近打卡:2025-04-30 15:23:41

2

主题

6

回帖

292

积分

中级会员

积分
292
发表于 2024-7-1 17:50:29 | 显示全部楼层
谢谢指点。
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 21:43 , Processed in 0.113783 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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