我想要实现的是,按下正转或反转键,定时器T0按table1的数据来输出周期越来越小的脉冲,最后周期稳定在20US,
按键一直按着电机转,按键松开电机不转。松开按键,关闭T0,开T1,按table2的数据输出周期越来越大的脉冲,直至停止。大神们帮忙看看这段程序错在哪里了?谢谢啦
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^0;
sbit DIR=P1^1;
sbit ENA=P1^2;
sbit CW=P2^0; //正转按键
sbit 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 discon
tinue(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;
}
}
一周热门 更多>