找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请大家帮我 单片机定时器的问题

[复制链接]
跳转到指定楼层
楼主
ID:143584 发表于 2017-11-24 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人初学者,有一问题请教大家.
我用STC89C52,三个定时器一起用,T0是计外脉冲的,T1是输出方波,T2用来采样和控制T1输出相应频率的方波,
问题是T1输出的方波不太稳定,波型上横向有过冲现象,表现在步进电机上就是转速不大稳,但是不用T2,把T2关掉,直接打开T1就好多了,
但这样又实现不了我想要的功能,这是怎么回事,该怎样修改,或是哪位大神有更好的方法,请帮我解惑.

  1. #include<STC89C5xRC.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. u8 t0,t1,i,bb=100;
  5. u16 t2;
  6. u8 code tab[]={0x3f,0x06,0x5b,0x4f,0x66,
  7.               0x6d,0x7d,0x07,0x7f,0x6f};

  8. unsigned char Dis_Shiwei;//定义十位
  9. unsigned char Dis_Gewei; //定义个位
  10. unsigned char Dis_Baiwei; //定义百位
  11. sbit sucu=P1^0;          //方波输出
  12. sbit deng1=P1^1;  //高转速指示
  13. sbit deng2=P1^2;  //低转速指示
  14. sbit led0= P1^6;  //这3个调试用,没什么实际意义
  15. sbit led1=P1^7;
  16. sbit led2=P1^5;

  17. bit kong;

  18. delay(u16 a)
  19.   {
  20.           while(a--);

  21.   }

  22. timor()
  23. {
  24.             TMOD |= 0x10;
  25.                   T2MOD |= 0;                //初始化模式寄存器
  26.                 T2CON = 0;                //初始化控制寄存器
  27.                 TL2 = 0x18;                //设置定时初值
  28.                 TH2 = 0xfC;                //设置定时初值
  29.                 RCAP2L = 0x18;                //设置定时重载值
  30.                 RCAP2H = 0xfC;                //设置定时重载值
  31.                
  32.           ET2=1;                     //打开定时2器中断
  33.           EA=1;                      //打开总中断
  34.           TR2=1;                                         //定时器2启动
  35.          
  36.           EX0=1;      //外部中断0打开;
  37.           IT0=1;     //外部中断0选择下降沿触发

  38.           TH1 = 0xfe;  //定时器1赋初值
  39.           TL1 = bb;                //由bb的值决定转速
  40.           ET1 = 1;                //打开定时1器中断
  41.           //TR1 = 1;     //定时器1启动
  42.          


  43.          
  44.                   
  45. }

  46. xianshi()
  47.   {

  48.                   
  49.                   P0=Dis_Baiwei; //显示百位
  50.                   P2=5;                //P2口控制位选端,数5表示选中的第六位数码管 下同
  51.                   delay(300);
  52.                   P0=Dis_Shiwei;//显示十位
  53.                   P2=6;
  54.                   delay(300);   //短暂延时
  55.                   P0=Dis_Gewei; //显示个位
  56.                   P2=7;
  57.                   delay(300);
  58.                   
  59.                   
  60.   }

  61. main()
  62.   {
  63.           timor();
  64.         while(1)
  65.         {
  66.                 xianshi();
  67.          }
  68.   }


  69. void InitTimer0(void) interrupt 0  //using 1//外中断0入口
  70. {

  71.         t0++; //用来计INT0输入的脉冲数
  72.         led0=~led0;

  73. }


  74. void InitTimer1(void)  interrupt 3        using 1//定时器1中断入口
  75. {


  76.       
  77.         TH1 = 0xfe;        //赋初值
  78.     TL1 = bb;        //bb决定转速
  79.         t1++;
  80.         //led1=~led1;
  81.         if(t1==2)         //二分频
  82.           {
  83.                   t1=0;
  84.                 sucu=~sucu;
  85.           }
  86.       
  87.       

  88. }

  89. void InitTimer2(void) interrupt 5         //定时器2中断入口 1ms定时
  90. {

  91.       
  92.         TF2=0;       //定时器2溢出位清零      
  93.         t2++;
  94.         if(t2==50)
  95.                  {      
  96.                          EX0=0;          //外中断0关闭
  97.                      TR2=0; //定时器2关闭                                                                                                
  98.                          t2=0;         //t2清零
  99.                        

  100.                             Dis_Baiwei=tab[t0/100%10];  //百位显示值处理
  101.                                 Dis_Shiwei=tab[t0/10%10];   //十位显示值处理
  102.                             Dis_Gewei=tab[t0%10];      //个位显示处理
  103.                                                                                                                   
  104.                         if(t0>=9 && t0<=10)        //如果i大于9而小于10,执行  
  105.                       {                                //花括号内的函数  下同
  106.                                  
  107.                                   deng1=0;
  108.                                   deng2=1;
  109.                                   kong=1;
  110.                                   //bb=190;
  111.                                   //TR1=1; //定时器1启动
  112.                           
  113.                             }
  114.                                 else if(t0>=6 && t0<=7)
  115.                                     {
  116.                                                 
  117.                                                  deng2=0;
  118.                                                  deng1=1;
  119.                                                  bb=70;
  120.                                                  TR1=1;
  121.                                         }

  122.                            
  123.                 else                        //如果上述值都不等于
  124.                    {
  125.                            deng1=1;                //指示灯关闭
  126.                            deng2=1;
  127.                            kong=0;                          
  128.                            TR1=0;                   //定时器1关闭,电机停转
  129.                            bb=100;      
  130.                            sucu=1;         

  131.                    }

  132.                                          
  133.                             TR2=1;                                 //定时器2启动
  134.                             EX0=1;                                 //外中断0打开
  135.                             t0=0;                                  //外中断0计数值清0
  136.                                                       
  137.                
  138.                 }
  139.                
  140.                
  141.                    if(kong==1)             //步进电机软启动
  142.                                  {
  143.                                  
  144.                                    if(bb<190)
  145.                                        {
  146.                                          bb++;
  147.                                                  TR1=1; //定时器1启动                                                                    
  148.                                              led1=~led1;
  149.                                             }      
  150.                                          
  151.                                        
  152.                                        
  153.                           }
  154.                
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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