找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51定时器问题,初值含参

[复制链接]
ID:137261 发表于 2016-11-11 15:14 | 显示全部楼层 |阅读模式
  1. void InitTimer0()
  2. {
  3.     TMOD = 0x01;
  4.     TH0 = (65536-sum)/256;
  5.     TL0 = (65536-sum)%256;
  6.     EA = 1;
  7.     ET0 = 0;
  8.     TR0 = 1;
  9. }
  10. void Timer0Interrupt() interrupt 1
  11. {
  12.     TH0 = (65536-sum)/256;
  13.     TL0 = (65536-sum)%256;
  14. }
复制代码

我想通过主函数中的计算得出sum值,然后通过sum值的改变,来实现定时器的定时时间的改变。请问大神们,为什么我这样子做并不能产生我需要的值呢?
回复

使用道具 举报

ID:137261 发表于 2016-11-11 15:21 | 显示全部楼层
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "stdio.h"
  4. typedef unsigned char uchar;
  5. typedef unsigned int uint;
  6. typedef int bool;
  7. #define false 0
  8. #define true 1
  9. sfr WDT_CONTR=0xe1;    //看门狗寄存器
  10. /***************************************************************
  11. 功能名称:变量定义
  12. *****************************************************************/
  13. uchar count=0;  //计数变量,脉冲标识
  14. uchar lf,ud,zo; //lf左右变量,ud上下变量,zo缩放变量
  15. uchar ex=20;//用于定位灯
  16. uint cnt;//用于复位计数
  17. float sa=7.5;//步进角
  18. float sm=1;//细分倍数
  19. float ms=26.46;//电机转速 r/s
  20. float t=4;//翻转倍数
  21. float sum1;//浮点型定时器初值
  22. uchar sum;//定时器初值
  23. /***************************************************************
  24. 功能名称:引脚定义
  25. ***************************************************************/

  26. sbit cw_lf=P2^2;//左右电机方向
  27. sbit clk_lf=P2^3 ;//左右电机脉冲
  28. sbit cw_ud=P2^4;//上下电机方向
  29. sbit clk_ud=P2^5 ;//上下电机脉冲
  30. sbit cw_zo=P2^6;//缩放电机方向
  31. sbit clk_zo=P2^7 ;//缩放电机脉冲                                                       

  32.                                                                                  

  33.                                                      
  34. sbit _left=P0^0;     //左右电机左限位
  35. sbit _right=P0^1;     //左右电机右限位
  36. sbit _up=P0^2;   //上下电机上限位
  37. sbit _down=P0^3;     //上下电机下限位
  38. sbit _small=P0^4;   //缩放电机升限位
  39. sbit _big=P0^5;   //缩放电机降限位
  40. sbit _reset=P1^6;          //复位
  41. sbit control=P1^7; //定位灯控制                                                  

  42.                
  43. sbit en_lf=P3^0;    //左右电机始能
  44. sbit en_ud=P3^1;  //上下电机始能
  45. sbit en_zo=P2^0;  //缩放电机始能
  46. sbit LED=P2^1;     //定位灯
  47. sbit BZ=P3^4;  //蜂鸣器报警
  48. sbit scl=P3^6; //时钟线
  49. sbit sda=P3^7;  //数据线


  50. /***************************************************************
  51. 功能名称:初始化引脚函数
  52. 函数名称:init
  53. 输入:
  54. 输出:
  55. 作者:
  56. 备注:
  57. ***************************************************************/
  58. void  init()
  59. {
  60.     en_ud=0;//上下模块使能
  61.     en_zo=0;//缩放模块使能
  62.     en_lf=0;         //左右模块使能
  63.                 LED=1;                //定位灯使能
  64.                 BZ=1;                        //蜂鸣器初值
  65. }
  66. /***************************************************************
  67. 功能名称:定时器100us
  68. 函数名称:InitTimer0
  69. 输入:
  70. 输出:clk_lf,clk_ud,clk_zo,cnt
  71. 作者:
  72. 备注:
  73. ***************************************************************/
  74. void InitTimer0()
  75. {
  76.     TMOD = 0x01;
  77.     TH0 = (65536-100)/256;
  78.     TL0 = (65536-100)%256;
  79.     EA = 1;//总中断打开
  80.     ET0 = 0;//定时器中断打开
  81.     TR0 = 1;//定时器开关打开
  82. }
  83. void Timer0Interrupt() interrupt 1
  84. {
  85.     TH0 = (65536-sum)/256;
  86.     TL0 = (65536-sum)%256;
  87.                 lf++;//左右
  88.                 ud++;//上下
  89.                 zo++;//缩放       
  90.                 cnt++;//复位用自增长变量
  91.                 if(count==1||count==4)
  92.                 {
  93.                 //左右脉冲频率
  94.                         if(lf==4)
  95.                         {clk_lf=1;}
  96.                         else if(lf>=8)
  97.                         {
  98.                                 clk_lf=0;
  99.                                 lf=1;
  100.                         }       
  101.                 }
  102.                 if(count==2||count==4)//7/14
  103.                 {
  104.                         //上下脉冲频率
  105.                         if(ud==7)
  106.                         {clk_ud=1;}
  107.                         else if(ud>=14)
  108.                         {
  109.                                 clk_ud=0;
  110.                                 ud=1;
  111.                         }
  112.                 }
  113.                 if(count==3)
  114.                 {
  115.                         //缩放脉冲频率
  116.                         if(zo==7)
  117.                         {clk_zo=1;}
  118.                         else if(zo>=14)
  119.                         {
  120.                                 clk_zo=0;
  121.                                 zo=1;
  122.                         }
  123.                 }
  124. }

  125. /***************************************************************
  126. 功能名称:电机控制函数
  127. 函数名称:Control_Motor
  128. 输入:P1,限位信号
  129. 输出:电机运行与停止
  130. 作者:
  131. 备注:
  132. ***************************************************************/
  133. void Control_Motor()
  134. {
  135.         if(P1==0x20&&_right==1)//左运动
  136.                 {
  137.                         ET0=1;//定时器0中断开关打开
  138.                         count=1;
  139.                         en_lf=1;//左右电机使能
  140.                         cw_lf=0;//左右电机方向       
  141.                 }
  142.         else if(P1==0x10&&_left==1)//右运动
  143.                 {
  144.                         ET0=1;
  145.                         count=1;
  146.                         en_lf=1;
  147.                         cw_lf=1;
  148.                 }
  149.         else if(P1==0x04&&_up==1)//上运动
  150.         {
  151.                 ET0=1;//定时器0中断开关打开
  152.                 en_ud=1;//上下电机使能
  153.                 cw_ud=0;//上下电机方向
  154.                 count=2;
  155.         }
  156.         else if(P1==0x08&&_down==1)//下运动
  157.         {
  158.                 ET0=1;
  159.                 en_ud=1;
  160.                 cw_ud=1;
  161.                 count=2;
  162.         }
  163.         else if(P1==0x01&&_small==1)      //缩放升,缩小                        

  164.                                                
  165.         {
  166.                 ET0=1;//定时器0中断开关打开
  167.                 en_zo=1;//缩放使能
  168.                 cw_zo=0;//缩放方向
  169.                 count=3;
  170.         }
  171.         else if(P1==0x02&&_big==1)     //缩放降,放大                            

  172.                                                
  173.         {
  174.                 ET0=1;               
  175.                 en_zo=1;
  176.                 cw_zo=1;
  177.                 count=3;
  178.         }
  179.         else if(P1==0x18&&_left==1&&_down==1)//左上
  180.         {
  181.                 ET0=1;//定时器0中断开关打开
  182.                 count=4;
  183.                 en_lf=1;//左右电机使能
  184.                 cw_lf=1;//左右电机方向
  185.                 en_ud=1;//上下电机使能
  186.                 cw_ud=1;//上下电机方向       
  187.         }
  188.         else if(P1==0x28&&_right==1&&_down==1) //右上
  189.         {
  190.                 ET0=1;//定时器0中断开关打开
  191.                 count=4;
  192.                 en_lf=1;//左右电机使能
  193.                 cw_lf=0;//左右电机方向
  194.                 en_ud=1;//上下电机使能
  195.                 cw_ud=1;//上下电机方向               
  196.         }
  197.         else if(P1==0x14&&_left==1&&_up==1) //左下
  198.         {
  199.                 ET0=1;//定时器0中断开关打开
  200.                 count=4;
  201.                 en_lf=1;//左右电机使能
  202.                 cw_lf=1;//左右电机方向
  203.                 en_ud=1;//上下电机使能
  204.                 cw_ud=0;//上下电机方向
  205.         }
  206.         else if(P1==0x24&&_right==1&&_up==1)//右下
  207.         {
  208.                 ET0=1;//定时器0中断开关打开
  209.                 count=4;
  210.                 en_lf=1;//左右电机使能
  211.                 cw_lf=0;//左右电机方向
  212.                 en_ud=1;//上下电机使能
  213.                 cw_ud=0;//上下电机方向
  214.         }
  215.         else
  216.                 {
  217.                         en_lf=0;en_ud=0;en_zo=0;ET0=0;count=0;
  218.                 }
  219. }
  220. /***************************************************************
  221. 功能名称:电机模块控制
  222. 函数名称:
  223. 输入:flag
  224. 输出:蜂鸣器以及电机控制
  225. 作者:
  226. 备注:
  227. ***************************************************************/               
  228. main()
  229. {
  230.         init();              //调用函数
  231.         sum1=12500/9*sa/sm/ms/t;
  232.         sum=sum1;
  233.         InitTimer0();        //调用定时中断函数
  234.         P1=0xFF;
  235.         while(1)
  236.         {
  237.                 Control_Motor();
  238.         }
  239. }
复制代码

回复

使用道具 举报

ID:7485 发表于 2016-11-11 20:12 | 显示全部楼层
中断函数不能输入参数,也不能返回参数。
回复

使用道具 举报

ID:147378 发表于 2016-11-11 20:51 | 显示全部楼层
加上EA=1;试一下
回复

使用道具 举报

ID:70330 发表于 2016-11-12 09:45 | 显示全部楼层
在void InitTimer0()里去掉    TH0 = (65536-sum)/256;
                                       TL0 = (65536-sum)%256;这两句,在中断处理函数里有就行了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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