找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10421|回复: 5
收起左侧

同时使用两个单片机定时器的问题

[复制链接]
ID:430571 发表于 2018-12-13 19:26 | 显示全部楼层 |阅读模式
请问有谁能用定时器1方式2-----蓝牙     定时器0-------舵机        以此来实现蓝牙控制舵机旋转和小车行驶吗?
回复

使用道具 举报

ID:123289 发表于 2018-12-13 22:52 | 显示全部楼层
再多都可以,一片单片机的定时器即可。
回复

使用道具 举报

ID:410399 发表于 2018-12-14 08:10 | 显示全部楼层
2个定时器就这样用,功能你自己搞定了
  1. void main()
  2. {
  3. TMOD = 0x11;
  4.        
  5.         TH0 = (65536 - 15000) / 256;                //定时器 0: 15ms
  6.         TL0 = (65536 - 15000) % 256;
  7.        
  8.         TH1 = (65536 - 50000) / 256;                //定时器 1: 50ms
  9.         TL1 = (65536 - 50000) % 256;
  10.        
  11.         IE = 0x8a;
  12.        
  13.         TR0 = 1;
  14.         TR1 = 1;
  15. }
  16. void Time0(void) interrupt 1
  17. {
  18.         TH0 = (65536 - 15000) / 256;                //恢复定时器0初值
  19.         TL0 = (65536 - 15000) % 256;
  20.        
  21.         if(++tc0 == 10)                                                //150ms 转换状态
  22.         {
  23.                 tc0 = 0;
  24.                 //
  25.                
  26.         }
  27.        
  28. }

  29. //T1中断函数
  30. void Time1(void) interrupt 3
  31. {
  32.         TH1 = (65536 - 50000) / 256;                //恢复定时器1初值
  33.         TL1 = (65536 - 50000) % 256;
  34.        
  35.         if(++tcl == 10)                                                //500ms 转换状态
  36.         {
  37.                 tc1 = 0;
  38.                 //
  39.         }
  40. }
复制代码
回复

使用道具 举报

ID:430571 发表于 2018-12-16 20:55 | 显示全部楼层
mosqu 发表于 2018-12-14 08:10
2个定时器就这样用,功能你自己搞定了

if(++tc0 == 10)                                                //150ms 转换状态
        {
                tc0 = 0;
                //
               
        }
if(++tcl == 10)                                                //500ms 转换状态
        {
                tc1 = 0;
                //
        }
这两个是用来避开中断优先级的吧,  tco和tcl应该定义初值为0吗?    且应这样写吧  
++tc0;           // 加这个否则if  这不好使吧
if(++tc0 == 10)                                                //150ms 转换状态
        {
                tc0 = 0;
                //
               
        }
回复

使用道具 举报

ID:641036 发表于 2019-11-13 11:04 | 显示全部楼层
如果同时用四个定时器程序怎么写
回复

使用道具 举报

ID:155507 发表于 2019-11-13 20:50 | 显示全部楼层
nidhoggll 发表于 2019-11-13 11:04
如果同时用四个定时器程序怎么写

5个定时器就这样用


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 定时器0的16位自动重装载模式举例---------------*/
  4. /* --- STC15F4K60S4 系列 定时器1的16位自动重装载模式举例---------------*/
  5. /* --- STC15F4K60S4 系列 定时器2的16位自动重装载模式举例---------------*/
  6. /* --- STC15F4K60S4 系列 定时器3的16位自动重装载模式举例---------------*/
  7. /* --- STC15F4K60S4 系列 定时器4的16位自动重装载模式举例---------------*/
  8. /* --- Mobile: (86)13922805190 -------------- -------------------------*/
  9. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  10. /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
  11. /* --- Web: www.STCMCU.com --------------------------------------------*/
  12. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  13. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  14. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  15. /*---------------------------------------------------------------------*/

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

  18. #include "reg51.h"

  19. typedef unsigned char BYTE;
  20. typedef unsigned int WORD;

  21. //-----------------------------------------------

  22. #define FOSC 11059200L

  23. #define T0_1MS (65536-FOSC/1000)      //1T模式
  24. //#define T0_1MS (65536-FOSC/12/1000) //12T模式
  25. #define T1_2MS (65536-FOSC/2000)      //1T模式
  26. //#define T1_2MS (65536-FOSC/12/2000) //12T模式
  27. #define T2_3MS (65536-FOSC/3000)      //1T模式
  28. //#define T2_3MS (65536-FOSC/12/3000) //12T模式
  29. #define T3_38_4KHz (256-18432000/38400/2)         //1T模式
  30. //#define T3_38_4KHz (256-18432000/12/38400/2)    //12T模式
  31. #define T4_38_4KHz (256-18432000/38400/2)         //1T模式
  32. //#define T4_38_4KHz (256-18432000/12/38400/2)    //12T模式


  33. sfr P0M1 = 0x93;
  34. sfr P0M0 = 0x94;
  35. sfr P1M1 = 0x91;
  36. sfr P1M0 = 0x92;
  37. sfr P2M1 = 0x95;
  38. sfr P2M0 = 0x96;
  39. sfr P3M1 = 0xb1;
  40. sfr P3M0 = 0xb2;
  41. sfr P4M1 = 0xb3;
  42. sfr P4M0 = 0xb4;
  43. sfr P5M1 = 0xC9;
  44. sfr P5M0 = 0xCA;
  45. sfr P6M1 = 0xCB;
  46. sfr P6M0 = 0xCC;
  47. sfr P7M1 = 0xE1;
  48. sfr P7M0 = 0xE2;

  49. sfr IE2       = 0xAF;               //中断使能寄存器2
  50. sfr AUXR      = 0x8e;               //辅助寄存器 //Auxiliary register
  51. sfr T2H       = 0xD6;               //定时器2高8位
  52. sfr T2L       = 0xD7;               //定时器2低8位

  53. sfr T4T3M   = 0xD1;                 //定时器3和定时器4控制寄存器
  54. sfr T4H     = 0xD2;                 //定时器4高8位
  55. sfr T4L     = 0xD3;                 //定时器4低8位
  56. sfr T3H     = 0xD4;                 //定时器3高8位
  57. sfr T3L     = 0xD5;                 //定时器3低8位
  58.                   
  59. sbit P10 = P1^0;
  60. sbit P11 = P1^1;
  61. sbit P12 = P1^2;
  62. sbit P13 = P1^3;
  63. sbit P14 = P1^4;

  64. //-----------------------------------------------

  65. /* Timer0 interrupt routine */
  66. void tm0_isr() interrupt 1
  67. {
  68.     P10 = ! P10;                    //将测试口取反
  69. }

  70. //-----------------------------------------------

  71. //-----------------------------------------------

  72. /* Timer1 interrupt routine */
  73. void tm1_isr() interrupt 3
  74. {
  75.     P11 = ! P11;                    //将测试口取反
  76. }

  77. //-----------------------------------------------
  78. //中断服务程序
  79. void t2int() interrupt 12           //中断入口
  80. {
  81.     P12 = !P12;                     //将测试口取反
  82.       
  83. //  IE2 &= ~0x04;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
  84. //  IE2 |= 0x04;                    //然后再开中断即可
  85. }

  86. //-----------------------------------------------
  87. //中断服务程序
  88. void t3int() interrupt 19           //中断入口
  89. {
  90.     P13 = !P13;                     //将测试口取反
  91.       
  92. //  IE2 &= ~0x20;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
  93. //  IE2 |= 0x20;                    //然后再开中断即可
  94. }

  95. //-----------------------------------------------
  96. //中断服务程序
  97. void t4int() interrupt 20           //中断入口
  98. {
  99.     P14 = !P14;                     //将测试口取反
  100.       
  101. //  IE2 &= ~0x40;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
  102. //  IE2 |= 0x40;                    //然后再开中断即可
  103. }

  104. //-----------------------------------------------

  105. /* main program */
  106. void main()
  107. {
  108.     P0M0 = 0x00;
  109.     P0M1 = 0x00;
  110.     P1M0 = 0x00;
  111.     P1M1 = 0x00;
  112.     P2M0 = 0x00;
  113.     P2M1 = 0x00;
  114.     P3M0 = 0x00;
  115.     P3M1 = 0x00;
  116.     P4M0 = 0x00;
  117.     P4M1 = 0x00;
  118.     P5M0 = 0x00;
  119.     P5M1 = 0x00;
  120.     P6M0 = 0x00;
  121.     P6M1 = 0x00;
  122.     P7M0 = 0x00;
  123.     P7M1 = 0x00;

  124.     AUXR |= 0x80;                   //定时器0为1T模式
  125. //  AUXR &= 0x7f;                   //定时器0为12T模式
  126.     AUXR |= 0x40;                   //定时器1为1T模式
  127. //  AUXR &= 0xdf;                   //定时器1为12T模式
  128.     AUXR |= 0x04;                   //定时器2为1T模式
  129. //  AUXR &= ~0x04;                  //定时器2为12T模式
  130.     T4T3M |= 0x02;                  //定时器3为1T模式
  131. //  T4T3M &= ~0x02;                 //定时器3为12T模式
  132.     T4T3M |= 0x20;                  //定时器4为1T模式
  133. //  T4T3M &= ~0x20;                 //定时器4为12T模式


  134.     TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
  135.     TL0 = T0_1MS;                     //初始化计时值
  136.     TH0 = T0_1MS >> 8;
  137.     TR0 = 1;                        //定时器0开始计时
  138.     ET0 = 1;                        //使能定时器0中断

  139.     TMOD |= 0x00;                    //设置定时器为模式0(16位自动重装载)
  140.     TL1 = T1_2MS;                     //初始化计时值
  141.     TH1 = T1_2MS >> 8;
  142.     TR1 = 1;                        //定时器1开始计时
  143.     ET1 = 1;                        //使能定时器0中断

  144.     T2L = T2_3MS;                     //初始化计时值
  145.     T2H = T2_3MS >> 8;
  146.     AUXR |= 0x10;                   //定时器2开始计时
  147.    
  148.     IE2 |= 0x04;                    //开定时器2中断

  149.     T3L = T3_38_4KHz;                 //初始化计时值
  150.     T3H = T3_38_4KHz >> 8;
  151.    
  152.     T4T3M |= 0x08;                  //定时器3开始计时
  153.     IE2 |= 0x20;                    //开定时器3中断

  154.     T4L = T4_38_4KHz;                 //初始化计时值
  155.     T4H = T4_38_4KHz >> 8;
  156.    
  157.     T4T3M |= 0x80;                  //定时器4开始计时
  158.     IE2 |= 0x40;                    //开定时器4中断
  159.    
  160.     EA = 1;

  161.     while (1);
  162. }



复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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