单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc单片机的三个定时器中断的使用Timer0-Timer1-Timer2

[复制链接]
跳转到指定楼层
楼主
tong001 发表于 2019-2-14 12:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
三个定时器的使用的C程序和汇编程序  ,用到的请拿走

单片机源程序如下:
  1. /*************        功能说明        **************

  2. 本程序演示3个定时器的使用, 本例程均使用16位自动重装.

  3. 下载时, 选择时钟 24MHZ (用户可自行修改频率).

  4. 定时器0做16位自动重装, 中断频率为1000HZ,中断函数从P1.7取反输出500HZ方波信号.

  5. 定时器1做16位自动重装, 中断频率为2000HZ,中断函数从P1.6取反输出1000HZ方波信号.

  6. 定时器2做16位自动重装, 中断频率为3000HZ,中断函数从P4.7取反输出1500HZ方波信号.

  7. ******************************************/


  8. #define         MAIN_Fosc                24000000UL        //定义主时钟

  9. #include        "STC15Fxxxx.H"

  10. #define        Timer0_Reload        (MAIN_Fosc / 1000)                //Timer 0 中断频率, 1000次/秒
  11. #define        Timer1_Reload        (MAIN_Fosc / 2000)                //Timer 1 中断频率, 2000次/秒
  12. #define        Timer2_Reload        (MAIN_Fosc / 3000)                //Timer 2 中断频率, 3000次/秒

  13. void        Timer0_init(void);
  14. void        Timer1_init(void);
  15. void        Timer2_init(void);



  16. //========================================================================
  17. // 函数: void main(void)
  18. // 描述: 主函数.
  19. // 参数: none.
  20. // 返回: none.
  21. // 版本: V1.0, 2015-1-12
  22. //========================================================================
  23. void main(void)
  24. {
  25.         P0M1 = 0;        P0M0 = 0;        //设置为准双向口
  26.         P1M1 = 0;        P1M0 = 0;        //设置为准双向口
  27.         P2M1 = 0;        P2M0 = 0;        //设置为准双向口
  28.         P3M1 = 0;        P3M0 = 0;        //设置为准双向口
  29.         P4M1 = 0;        P4M0 = 0;        //设置为准双向口
  30.         P5M1 = 0;        P5M0 = 0;        //设置为准双向口
  31.         P6M1 = 0;        P6M0 = 0;        //设置为准双向口
  32.         P7M1 = 0;        P7M0 = 0;        //设置为准双向口

  33.         EA = 1;                //打开总中断
  34.        
  35.         Timer0_init();
  36.         Timer1_init();
  37.         Timer2_init();

  38.         while (1)
  39.         {

  40.         }
  41. }

  42. //========================================================================
  43. // 函数: void        Timer0_init(void)
  44. // 描述: timer0初始化函数.
  45. // 参数: none.
  46. // 返回: none.
  47. // 版本: V1.0, 2015-1-12
  48. //========================================================================
  49. void        Timer0_init(void)
  50. {
  51.                 TR0 = 0;        //停止计数

  52.         #if (Timer0_Reload < 64)        // 如果用户设置值不合适, 则不启动定时器
  53.                 #error "Timer0设置的中断过快!"

  54.         #elif ((Timer0_Reload/12) < 65536UL)        // 如果用户设置值不合适, 则不启动定时器
  55.                 ET0 = 1;        //允许中断
  56.         //        PT0 = 1;        //高优先级中断
  57.                 TMOD &= ~0x03;
  58.                 TMOD |= 0;        //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
  59.         //        TMOD |=  0x04;        //对外计数或分频
  60.                 TMOD &= ~0x04;        //定时
  61.         //        INT_CLKO |=  0x01;        //输出时钟
  62.                 INT_CLKO &= ~0x01;        //不输出时钟

  63.                 #if (Timer0_Reload < 65536UL)
  64.                         AUXR |=  0x80;        //1T mode
  65.                         TH0 = (u8)((65536UL - Timer0_Reload) / 256);
  66.                         TL0 = (u8)((65536UL - Timer0_Reload) % 256);
  67.                 #else
  68.                         AUXR &= ~0x80;        //12T mode
  69.                         TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
  70.                         TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
  71.                 #endif

  72.                 TR0 = 1;        //开始运行

  73.         #else
  74.                 #error "Timer0设置的中断过慢!"
  75.         #endif
  76. }

  77. //========================================================================
  78. // 函数: void        Timer1_init(void)
  79. // 描述: timer1初始化函数.
  80. // 参数: none.
  81. // 返回: none.
  82. // 版本: V1.0, 2015-1-12
  83. //========================================================================
  84. void        Timer1_init(void)
  85. {
  86.                 TR1 = 0;        //停止计数

  87.         #if (Timer1_Reload < 64)        // 如果用户设置值不合适, 则不启动定时器
  88.                 #error "Timer1设置的中断过快!"

  89.         #elif ((Timer1_Reload/12) < 65536UL)        // 如果用户设置值不合适, 则不启动定时器
  90.                 ET1 = 1;        //允许中断
  91.         //        PT1 = 1;        //高优先级中断
  92.                 TMOD &= ~0x30;
  93.                 TMOD |= (0 << 4);        //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
  94.         //        TMOD |=  0x40;        //对外计数或分频
  95.                 TMOD &= ~0x40;        //定时
  96.         //        INT_CLKO |=  0x02;        //输出时钟
  97.                 INT_CLKO &= ~0x02;        //不输出时钟

  98.                 #if (Timer1_Reload < 65536UL)
  99.                         AUXR |=  0x40;        //1T mode
  100.                         TH1 = (u8)((65536UL - Timer1_Reload) / 256);
  101.                         TL1 = (u8)((65536UL - Timer1_Reload) % 256);
  102.                 #else
  103.                         AUXR &= ~0x40;        //12T mode
  104.                         TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
  105.                         TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
  106.                 #endif

  107.                 TR1 = 1;        //开始运行

  108.         #else
  109.                 #error "Timer1设置的中断过慢!"
  110.         #endif
  111. }

  112. //========================================================================
  113. // 函数: void        Timer2_init(void)
  114. // 描述: timer2初始化函数.
  115. // 参数: none.
  116. // 返回: none.
  117. // 版本: V1.0, 2015-1-12
  118. //========================================================================
  119. void        Timer2_init(void)
  120. {
  121.                 AUXR &= ~0x1c;                //停止计数, 定时模式, 12T模式

  122.         #if (Timer2_Reload < 64)        // 如果用户设置值不合适, 则不启动定时器
  123.                 #error "Timer2设置的中断过快!"

  124.         #elif ((Timer2_Reload/12) < 65536UL)        // 如果用户设置值不合适, 则不启动定时器
  125.         //        IE2  &= ~(1<<2);        //禁止中断
  126.                 IE2  |=  (1<<2);        //允许中断
  127.         //        INT_CLKO |=  0x04;        //输出时钟
  128.                 INT_CLKO &= ~0x04;        //不输出时钟

  129.         //        AUXR |=  (1<<3);        //对外计数或分频
  130.         //        INT_CLKO |=  0x02;        //输出时钟
  131.                 INT_CLKO &= ~0x02;        //不输出时钟

  132.                 #if (Timer1_Reload < 65536UL)
  133.                         AUXR |=  (1<<2);        //1T mode
  134.                         T2H = (u8)((65536UL - Timer2_Reload) / 256);
  135.                         T2L = (u8)((65536UL - Timer2_Reload) % 256);
  136.                 #else
  137.                         T2H = (u8)((65536UL - Timer2_Reload/12) / 256);
  138.                         T2L = (u8)((65536UL - Timer2_Reload/12) % 256);
  139.                 #endif

  140.                         AUXR |=  (1<<4);        //开始运行

  141.         #else
  142.                 #error "Timer2设置的中断过慢!"
  143.         #endif
  144. }


  145. //========================================================================
  146. // 函数: void timer0_int (void) interrupt TIMER0_VECTOR
  147. // 描述:  timer0中断函数.
  148. // 参数: none.
  149. // 返回: none.
  150. // 版本: V1.0, 2015-1-12
  151. //========================================================================
  152. void timer0_int (void) interrupt TIMER0_VECTOR
  153. {
  154.    P17 = ~P17;
  155. }

  156. //========================================================================
  157. // 函数: void timer1_int (void) interrupt TIMER1_VECTOR
  158. // 描述:  timer1中断函数.
  159. // 参数: none.
  160. // 返回: none.
  161. // 版本: V1.0, 2015-1-12
  162. //========================================================================
  163. void timer1_int (void) interrupt TIMER1_VECTOR
  164. {
  165.    P16 = ~P16;

  166. }

  167. //========================================================================
  168. // 函数: void timer2_int (void) interrupt TIMER2_VECTOR
  169. // 描述:  timer2中断函数.
  170. // 参数: none.
  171. // 返回: none.
  172. // 版本: V1.0, 2015-1-12
  173. //========================================================================
  174. void timer2_int (void) interrupt TIMER2_VECTOR
  175. {
  176.         P47 = ~P47;
  177. }
复制代码

所有资料51hei提供下载:
02-Timer0-Timer1-Timer2(三个定时器)测试程序.zip (28.32 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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