|
最近正在做一个机器人,但是我在用红外控制舵机的时候。比如一个按键控制舵机正转一个按键控制电机反转,只有刚通电时通过按遥控板正转键电机正转,之后按反转就不能了。。。如果要反转又只能断电后按才能转动。。。我用的是stc51单片机,用了两个中断。一个检测按键,一个控制pwm波。想了一天了就只是觉得可能是中断的时候可能有问题,但是有查不出原因。。还望各位大虾帮忙看一下啊,小弟不胜感激!!!!
红外键盘程序:
#include<reg52.h>
#include<string.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
extern unsigned char ir_code[4]; /*遥控接收数据*/
unsigned char ir_liangfa=0; /*连_发码位*/
sbit ir_port=P1^1; /*遥控输入脚*/
uint tt,flag,flag1;
extern unsigned char ir_bit; /*遥控接收成功*/
/*void Delay_M(unsigned int a) //主函数延时函数 1MS/次
{
uchar i;
while(--a!=0)
{
for(i=0;i<125;i++);
}
}*/
void open_yaokong(void) /*开启遥控接收*/
{
uchar i,j;
TMOD=0x01;
TH1=0xff;
TL1=0xa3;
EA=1;
ET1=1;//打开定时器0中断
TR1=0;//启动定时器0
//EX0=1;
//ir_port=1;
// while(ir_port);
while(!ir_port)
{
tt=0; //TMOD=0x01;
TH1=0xff;
TL1=0xa3;
TR1=1;
while(!ir_port);
if(tt>75)
{
tt=0;
TR1=0;
flag=1;
}
}
if(flag==1)
{
flag=0;
while(ir_port==0); /*等待高电平避开9毫秒低电平引导脉冲*/
TH1=0xff;
TL1=0xa3;
TR1=1;
tt=0;
while(ir_port); //>4.5ms
if(tt>35)
{
tt=0;
TR1=0;
flag1=1;
}
}
if(flag1==1)
{
flag1=0;
while(ir_port==1); //等高电平4.5ms
/*以下32数据码的读取,0和1的识别*/
for(i=4;i>0;i--)
{
for(j=0;j<8;j++)
{
//Nop();
while(ir_port==0); /*等待地址码第一位的高电平信号*/
TH1=0xff;
TL1=0xa3;
tt=0;
TR1=1;
ir_code[i-1]=(ir_code[i-1]<<1);
while(ir_port==1);//等待高电平
if(tt>11)
{
ir_code[i-1]=(ir_code[i-1]|0x01);
//while(ir_port==1);
}
}
tt=0;TR1=0;
}
if(ir_code[1]==(~ir_code[0]))
{
ir_liangfa=0; /*连_发码位置0*/
ir_bit=1; /*遥控接收正确,置位1*/
}
//return;
//while(ir_port);
}
}
void interru() interrupt 3 //延时0.1ms
{
TH1=0xff;
TL1=0xa3;
tt++;
}
控制电机程序:
#include<reg52.h>
#include<intrins.h>
#include<red.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char ir_code[4]; /*遥控接收数据*/
sbit ir_port = P1^1; /*遥控输入脚*/
sbit led = P1^2; /*LED*/
sbit DJZ = P1^3; // ;中间伺服马达引脚定义
unsigned char ir_bit,t; /*遥控接收成功*/
unsigned char TEMP_FOR=0;
void delay_1000(void) //1000us 伺服马达反转
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay_1500(void) //1500us 伺服马达回到中点
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=248;a>0;a--);
}
void delay_2000(void) //2000us 伺服马达正转 45°
{
unsigned char a,b;
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void delay(uint z) //Z ms
{
uint t,y;
for(t=z;t>0;t--)
for(y=110;y>0;y--);
}
void LED() //发光二极管闪烁子程序
{
WLED=0;
delay(1000);
WLED=1;
}
void SPEAK() //压电喇叭发出嘀的一声
{
SPK=0;
delay(400);
SPK=1;
}
void go_home() //机器人中各伺服电机回中点控制子程序
{ // ****注意延时
TEMP_FOR=7;
}
void DJZ_FOR() //中间电机正转子程序
{
TEMP_FOR=1;
ET0 = 1;
}
void DJZ_BACK() //中间电机反转子程序
{
TEMP_FOR=2;
ET0 = 1;
}
void main(void) //主函数
{
TMOD = 0x01;
TH0 = 0x0B1;
TL0 = 0x0E0;
EA = 1;
//ET0 = 1;
TR0 = 1;
DJZ = 0;
DJL = 0;
DJR = 0;
ir_code[1]=0xFF; //用户数据码初始化
//Delay_M(2000); //延时2秒
//Beep_set(); //进入系统确定音
DB2=1;
//led=1;
LED1=0;
while(1)
{
dula = 0; //关数码管
wela = 0;
while(ir_port);
open_yaokong();
if(ir_bit==1)
{ir_bit=0;
if(ir_code[1]==0xe1)
{
DJZ_FOR();
DB2=1;
//GO_L();
//led=0;
LED1=1;
delay(500);
LED1=0;
ir_code[1]=0;
//EA=1;
}
if(ir_code[1]==0xa1)
{
DJZ_BACK();
//DJZ_BACK();
//GO_R();
//led=0;
LED1=1;
delay(500);
LED1=0;
ir_code[1]=0;
}
}
}
void Timer0Interrupt(void) interrupt 1
{
//20ms中断
TH0 = 0x0B1;
TL0 = 0x0E0;
if(TEMP_FOR==1&t<4) ////中间电机正转子程序
{ t++;
//TEMP_FOR=0;
DJZ=1;
delay_2000();
DJZ=0;
if (t==3) ET0 = 0;
}
t=0;
if(TEMP_FOR==2&t<4) ////中间电机反转子程序
{
//TEMP_FOR=0;
DJZ=1;
delay_1000();
DJZ=0;
if (t==3) ET0 = 0;
}
t=0;
}
谢谢啦。。。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|