找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15单片机定时器问题 一直卡死在中断里执行中断的内容

[复制链接]
跳转到指定楼层
楼主
ID:983394 发表于 2023-2-7 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下图所示 ,本想用定时器4做计数器的,但是测试发现一直卡死在中断里执行中断的内容,无论咋样都挑不来,现在用的定时器还是不行 ,进入中断后先把中断关了执行完再开还是都不,加入io口还是不行,实在搞不懂了,请教一下大佬们


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:57657 发表于 2023-2-7 17:25 | 只看该作者
打开中断后必须有中断入口函数,否则程序会跑飞,具体请提供源码。
回复

使用道具 举报

板凳
ID:130230 发表于 2023-2-7 17:53 | 只看该作者
你看看定时器4的中断号是多少,keil只支持32个编号,如果大于32需要自己用空闲的中断写个跳转。
回复

使用道具 举报

地板
ID:1034262 发表于 2023-2-7 20:19 | 只看该作者
楼主,STC官方有很多完善的例子源码,为什么不下来试试呢?自己摸索浪费时间。
回复

使用道具 举报

5#
ID:1034262 发表于 2023-2-7 20:19 | 只看该作者
jizhongbiao 发表于 2023-2-7 17:53
你看看定时器4的中断号是多少,keil只支持32个编号,如果大于32需要自己用空闲的中断写个跳转。

定时器的中断号不会大于31的。
回复

使用道具 举报

6#
ID:965189 发表于 2023-2-7 21:42 | 只看该作者
把程序帖出来大家就容易帮你。
回复

使用道具 举报

7#
ID:130230 发表于 2023-2-8 16:32 | 只看该作者
coody_sz 发表于 2023-2-7 20:19
定时器的中断号不会大于31的。

51架构是3个定时器,定时器4的中断号大概率是大于31的
回复

使用道具 举报

8#
ID:155507 发表于 2023-2-8 17:47 | 只看该作者
STC官方有很多完善的例子源码,为什么不下来试试呢?


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 定时器4可编程时钟分频输出举例-----------------*/

  4. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  5. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  8. //若无特别说明,工作频率一般为11.0592MHz


  9. #include "reg51.h"

  10. typedef unsigned char BYTE;
  11. typedef unsigned int WORD;

  12. #define FOSC 11059200L

  13. //-----------------------------------------------

  14. sfr P0M1 = 0x93;
  15. sfr P0M0 = 0x94;
  16. sfr P1M1 = 0x91;
  17. sfr P1M0 = 0x92;
  18. sfr P2M1 = 0x95;
  19. sfr P2M0 = 0x96;
  20. sfr P3M1 = 0xb1;
  21. sfr P3M0 = 0xb2;
  22. sfr P4M1 = 0xb3;
  23. sfr P4M0 = 0xb4;
  24. sfr P5M1 = 0xC9;
  25. sfr P5M0 = 0xCA;
  26. sfr P6M1 = 0xCB;
  27. sfr P6M0 = 0xCC;
  28. sfr P7M1 = 0xE1;
  29. sfr P7M0 = 0xE2;

  30. sfr T4T3M   = 0xD1;                 //定时器3和定时器4控制寄存器
  31. sfr T4H     = 0xD2;                 //定时器4高8位
  32. sfr T4L     = 0xD3;                 //定时器4低8位
  33. sfr T3H     = 0xD4;                 //定时器3高8位
  34. sfr T3L     = 0xD5;                 //定时器3低8位

  35. sbit T3     = P0^7;                 //定时器3的外部引脚
  36. sbit T4     = P0^5;                 //定时器4的外部引脚
  37. sbit T3CLKO = P0^6;                 //定时器3的时钟输出脚
  38. sbit T4CLKO = P0^4;                 //定时器4的时钟输出脚

  39. #define F38_4KHz (65536-FOSC/2/38400)    //1T模式
  40. //#define F38_4KHz (65536-FOSC/2/12/38400) //12T模式

  41. //-----------------------------------------------

  42. void main()
  43. {
  44.     P0M0 = 0x00;
  45.     P0M1 = 0x00;
  46.     P1M0 = 0x00;
  47.     P1M1 = 0x00;
  48.     P2M0 = 0x00;
  49.     P2M1 = 0x00;
  50.     P3M0 = 0x00;
  51.     P3M1 = 0x00;
  52.     P4M0 = 0x00;
  53.     P4M1 = 0x00;
  54.     P5M0 = 0x00;
  55.     P5M1 = 0x00;
  56.     P6M0 = 0x00;
  57.     P6M1 = 0x00;
  58.     P7M0 = 0x00;
  59.     P7M1 = 0x00;

  60.     T4T3M |= 0x20;                  //定时器4为1T模式
  61. //  T4T3M &= ~0x20;                 //定时器4为12T模式

  62.     T4T3M &= ~0x40;                 //T4_C/T=0, 对内部时钟进行时钟输出
  63. //  T4T3M |= 0x40;                  //T4_C/T=1, 对T4引脚的外部时钟进行时钟输出

  64.     T4L = F38_4KHz;                 //初始化计时值
  65.     T4H = F38_4KHz >> 8;
  66.    
  67.     T4T3M |= 0x80;                  //定时器4开始计时
  68.     T4T3M |= 0x10;                  //使能定时器4的时钟输出功能

  69.     while (1);                      //程序终止
  70. }

复制代码

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 定时器4的16位自动重装载模式举例---------------*/

  4. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  5. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  8. //若无特别说明,工作频率一般为11.0592MHz


  9. #include "reg51.h"

  10. typedef unsigned char BYTE;
  11. typedef unsigned int WORD;

  12. //-----------------------------------------------

  13. #define FOSC 11059200L

  14. #define T38_4KHz        (256-FOSC/38400/2)          //1T
  15. //#define T38_4KHz      (256-FOSC/12/38400/2)       //12T

  16. sfr P0M1 = 0x93;
  17. sfr P0M0 = 0x94;
  18. sfr P1M1 = 0x91;
  19. sfr P1M0 = 0x92;
  20. sfr P2M1 = 0x95;
  21. sfr P2M0 = 0x96;
  22. sfr P3M1 = 0xb1;
  23. sfr P3M0 = 0xb2;
  24. sfr P4M1 = 0xb3;
  25. sfr P4M0 = 0xb4;
  26. sfr P5M1 = 0xC9;
  27. sfr P5M0 = 0xCA;
  28. sfr P6M1 = 0xCB;
  29. sfr P6M0 = 0xCC;
  30. sfr P7M1 = 0xE1;
  31. sfr P7M0 = 0xE2;

  32. sfr IE2     = 0xAF;                 //中断使能寄存器2
  33. sfr T4T3M   = 0xD1;                 //定时器3和定时器4控制寄存器
  34. sfr T4H     = 0xD2;                 //定时器4高8位
  35. sfr T4L     = 0xD3;                 //定时器4低8位
  36. sfr T3H     = 0xD4;                 //定时器3高8位
  37. sfr T3L     = 0xD5;                 //定时器3低8位

  38. sbit P10 = P1^0;

  39. //-----------------------------------------------
  40. //中断服务程序
  41. void t4int() interrupt 20           //中断入口
  42. {
  43.     P10 = !P10;                     //将测试口取反
  44.       
  45. //  IE2 &= ~0x40;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
  46. //  IE2 |= 0x40;                    //然后再开中断即可
  47. }

  48. //-----------------------------------------------

  49. void main()
  50. {
  51.     P0M0 = 0x00;
  52.     P0M1 = 0x00;
  53.     P1M0 = 0x00;
  54.     P1M1 = 0x00;
  55.     P2M0 = 0x00;
  56.     P2M1 = 0x00;
  57.     P3M0 = 0x00;
  58.     P3M1 = 0x00;
  59.     P4M0 = 0x00;
  60.     P4M1 = 0x00;
  61.     P5M0 = 0x00;
  62.     P5M1 = 0x00;
  63.     P6M0 = 0x00;
  64.     P6M1 = 0x00;
  65.     P7M0 = 0x00;
  66.     P7M1 = 0x00;

  67.     T4T3M |= 0x20;                  //定时器4为1T模式
  68. //  T4T3M &= ~0x20;                 //定时器4为12T模式

  69.     T4L = T38_4KHz;                 //初始化计时值
  70.     T4H = T38_4KHz >> 8;
  71.    
  72.     T4T3M |= 0x80;                  //定时器4开始计时
  73.     IE2 |= 0x40;                    //开定时器4中断
  74.    
  75.     EA = 1;

  76.     while (1);
  77. }

复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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