【文件属性】:
文件名称:单片机控制电机驱动程序
文件大小:3KB
文件格式:TXT
更新时间:2013-05-30 13:27:16
电机 驱动
#include //器件库
#include //延时函数库
#include //标准I/O函数库
#include //标准函数库
unsigned char m0,m1,m2;
unsigned char s,s1;
// 单片机定时器0溢出中断服务程序段
// 产生伺服电机动作所需要的脉宽
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=0xBA;
if(s127)
{ s=0; s1=0;
TCCR0=0x00; TCCR1B=0x02;
TCNT1H=0xff; TCNT1L=0x59; }
}
// 单片机定时器1溢出中断服务程序段
// 产生0.5ms的开始脉宽和5ms以上的间隔脉宽
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
#asm("wdr"); //喂狗
TCNT1H=0xff; TCNT1L=0x59; s1++;
if(s1<65) PORTA=PORTA&0B11111000; //5ms以上的间隔脉宽
else
{ PORTA=PORTA|0B00000111; //0.5ms
if(s1>70)
{ TCCR1B=0x00;TCCR0=0x01;s1=0;TCNT0=0xBA;}
}
}
void main(void)
{ unsigned char i,j,count=0;
unsigned char c[3];
unsigned int k;
// 设置A口为输出状态,并且初始值为低电平
PORTA=0x00; DDRA=0xFF;
// 设置B、C、D、E口为高阻输入状态,在该程序中不使用
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x00;
PORTE=0x00; DDRE=0x00;
//设置定时器0的时钟来源为系统晶体
//设置计数周期为8000KHZ,清空计数寄存器
TCCR0=0x00; TCNT0=0x00; OCR0=0x00;
//设置定时器1的时钟来源为系统晶体
//设置计数周期为1000KHZ,清空计数寄存器
TCCR1A=0x00; TCCR1B=0x02;
TCNT1H=0x00; TCNT1L=0x00;
ICR1H=0x00; ICR1L=0x00;
OCR1AH=0x00; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00;
//使能定时器
TIMSK=0x82;
// 串口模数据:8个数据位,1个停止位,无奇偶效验
// 串口使能:发送、接收
// 串口模式:异步
// 串口速率:9600
UCSRA=0x02; UCSRB=0x18; UCSRC=0x86;
UBRRH=0x00; UBRRL=0x34;
//设置模拟比较器
ACSR=0x80;
//使能看门狗,设置喂狗周期为 时钟/2048
WDTCR=0x1F; WDTCR=0x0F;
// 打开总中断
#asm("sei")
delay_ms(500);
putchar(0x0d); putchar(0x0a);
putsf("***********************************\r");
putsf("* 3路舵机驱动小程序 *\r");
putsf("* 顺德职业技术学院 机电工程系 *\r");
putsf("* 罗建章 *\r");
putsf("***********************************\r");
while (1)
{ count=0;
putsf("输入舵机编号(1~3):");
putchar(0x0d);
n1:i=getchar();
if((i<0x31)||(i>0x38))
{ putsf("error\r");
putchar(0x0d);
goto n1;
}
putchar(i);
i=i-0x30;
putchar(0x0d); putchar(0x0a);
putsf("输入舵机位置值(0~127),默认为0:");
putchar(0x0d);
c[0]=0;c[1]=0;c[2]=0;
n2:j=getchar();
if(j!=0x0d)
{ if((j<0x30)||(j>0x39))
goto n2;
else
{ putchar(j);
c[count++]=j;
if(count<3)
goto n2;
else
goto n3;
}
}
n3:k=atoi(c);
if(k>127)
{ putsf("---error\r"); putchar(0x0d);
count=0; goto n2;
}
putsf("---OK\r");
putchar(0x0d);
switch (i)
{ case 1: m0=k; break;
case 2: m1=k; break;
case 3: m2=k; break;
}
}
}