单片机/MCUwilliam hill官网
直播中

姜恒

10年用户 65经验值
擅长:嵌入式技术
私信 关注
[问答]

大神们帮我看看这程序错在哪

我想要实现的是,按下正转或反转键,定时器T0按table1的数据来输出周期越来越小的脉冲,最后周期稳定在20US,按键一直按着电机转,按键松开电机不转。松开按键,关闭T0,开T1,按table2的数据输出周期越来越大的脉冲,直至停止。大神们帮忙看看这段程序错在哪里了?谢谢啦


#include

#define uchar unsigned char
#define uint unsigned int

***it CLK=P1^0;
***it DIR=P1^1;
***it ENA=P1^2;
***it CW=P2^0;      //正转按键
***it CCW=P2^1;      //反转按键

bit cw_up=0;   //正转按键释放标志
bit ccw_up=0;  //反转按键释放标志

uint clock;   //周期变量
uint a,b;   //a为T0的table1变量,b为T1的table2变量
uchar code table1[]={     //匀加速启动速率表
10000,6666,3333,1000,
500,200,100,60,30,10};  
uchar code table2[]={     //匀减速停止速率表
100,500,1000,3333,
6666,10000};     

void delayms(uint xms)       //延时子程序
{
   uint i,j;
   for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}

void discontinue(void)      //定时器中断子程序
{
   IE=0X8A;                 //开总中断,开T0,T1中断
   TMOD=0X11;             //设置定时器0和1位工作方式1
   TH0=(65536-clock)/256;     //T0装初值
   TL0=(65536-clock)%256;
   TH1=(65536-clock)/256;     //T1装初值
   TL1=(65536-clock)%256;
}

void sys_init()     // 系统初始化
{
   P2=0XFF;
   ENA=0;
}

void keyscan()   //案件扫描
{
   if(!CW)         //正转
   {
     delayms(10);       //消抖
     if(!CW)
     {
       ENA=1;
       DIR=0;
       TR0=1;        //开T0,加速启动
       while(!CW);    //等待按键释放,若不释放,程序一直停在while(!CW)语句处
       cw_up=1;         //按键释放后,置 1
       if(cw_up==1)
       {
         cw_up=0;     //清零
         TR1=1;         //开T1,减速停止
         if(b==7)     //b=7时,关闭T1
         {
           TR1=0;
         }
       }
     }
   }
   else if(!CCW)       //反转
   {
     delayms(10);
     if(!CCW)
     {
       ENA=1;
       DIR=1;
       TR0=1;
       while(!CCW);    //等待按键释放
       ccw_up=1;
       if(ccw_up==1)
       {
         cw_up=0;
         TR1=1;
         if(b==7)
         {
           TR1=0;
         }
       }
     }
   }
}

void main()             //主函数
{
   discontinue();
   sys_init();
   while(1)
   {
      keyscan();
   }
}

void T0_time() interrupt 1
{
   for(a=0;a<10;a++)
   {
     clock=table1[a];
     TH0=(65536-clock)/256;     //重装初值
     TL0=(65536-clock)%256;
     CLK=~CLK;
   }
}

void T1_time() interrupt 3
{
   for(b=0;b<=7;b++)
   {
     clock=table2;
     TH1=(65536-clock)/256;     //重装初值
     TL1=(65536-clock)%256;
     CLK=~CLK;
   }
}

回帖(2)

hsiwei556463

2015-1-30 22:07:47
这个看不太懂啊
举报

姜恒

2015-1-30 22:17:02
引用: hsiwei556463 发表于 2015-1-30 22:07
这个看不太懂啊

哪里看不懂,我可以说一下
举报

更多回帖

×
20
完善资料,
赚取积分