|
各位大神,請教一下我用定時(shí)器中斷產(chǎn)生pwm方波控制舵機(jī),想讓舵機(jī)在兩個(gè)角度循環(huán)然后用了兩個(gè)定時(shí)器,但是定時(shí)器1死活不管用,但是定時(shí)器0是有用的,是不是我的代碼有問題啊
代碼如下,我現(xiàn)在是把定時(shí)器0先放在一邊然后用定時(shí)器1的,就是沒有反應(yīng)
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P1_0=P1^0; //PWM信號輸出端
void Init_t0(void); //子函數(shù)聲明
void Init_t1(void);
void delay(unsigned int x) //延時(shí) x ms
{
unsigned int i,j;
for(i=x;i>0;i--);
for(j=110;j>0;j--);
}
void main()
{
P1_0=0; //置PWM初始輸出為高電平
//Init_t0();
// TR0=1;
// while(1); //等待中斷
// TR0=0;
Init_t1();
TR1=1;
while(1);
// TR1=0;
}
void Init_t0(void)
{
TMOD=0x01; //設(shè)置定時(shí)器0工作方式1后面運(yùn)行TR位啟動(dòng)
TH0=(65536-1500)/256;
TL0=(65536-1500)%256; //1.5ms 的高電平
EA=1;
ET0=1;
// TR0=1;
}
void Init_t1(void)
{
TMOD=0x10; //設(shè)置定時(shí)器1工作方式1后面運(yùn)行TR位啟動(dòng)
TH1=(65536-1500)/256;
TL1=(65536-1500)%256; //1.5ms 的高電平
EA=1;
ET1=1;
// TR0=1;
}
/*******************中斷服務(wù)程序**********************/
void PWM0() interrupt 1 //定時(shí)器0中斷,產(chǎn)生方波
{
if(P1_0==1) //如果上個(gè)電平為1,則下個(gè)低電平的時(shí)間為18.5ms
{
TH0=(65536-18000)/256; //試過t1=1500;t0=20000-t1;但舵機(jī)老是吱吱的響,推測:運(yùn)算耗時(shí).
TL0=(65536-18000)%256; //1800是抓取
}
else //如果上個(gè)電平為0,則下個(gè)高電平為1.5ms
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
}
P1_0=~P1_0;
}
void PWM1() interrupt 2 //定時(shí)器0中斷,產(chǎn)生方波
{
if(P1_0==1) //如果上個(gè)電平為1,則下個(gè)低電平的時(shí)間為18.5ms
{
TH1=(65536-18000)/256; //試過t1=1500;t0=20000-t1;但舵機(jī)老是吱吱的響,推測:運(yùn)算耗時(shí).
TL1=(65536-18000)%256;
}
else //如果上個(gè)電平為0,則下個(gè)高電平為1.5ms
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
}
P1_0=~P1_0;
}
|
|