标题:
红外控制舵机
[打印本页]
作者:
keil321
时间:
2016-3-15 10:27
标题:
红外控制舵机
红外控制舵机
/*******************************************************************************
*具体操作: 使用配套的遥控,按按键,查看显示屏键值。 *
* 键值表: 45H 46H 47H *
* 44H 40H 43H *
* 07H 15H 09H *
* 16H 19H 0DH *
* 0CH 18H 5EH *
* 08H 1CH 5AH *
* 42H 52H 4AH *
*******************************************************************************/
#include<reg52.h>
#define uchar unsigned char
sbit IR=P3^3; //红外中断引脚
sbit wela=P2^6; //数码管为选位
sbit dula=P2^5; //数码管段选为
sbit PWM=P1^5; //PWM信号输出
uchar IRCOM[7]; //键值存储
uchar code tab[]={ //共阳极数码管段选数组
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
uchar dj,count; //dj舵机角度标识引脚
void delay0(uchar x) //延时0.14ms
{
uchar i;
while(x--)
{
for(i=0;i<13;i++);
}
}
void inter() interrupt 2 //外部中断
{
unsigned char j,k,N=0;
EX1=0;
delay0(15);
if(IR==1)
{
EX1=1;
return;
}
while(!IR)
delay0(1); //跳过9ms低电平引导码
for(j=0;j<4;j++)
{
for(k=0;k<8;k++)
{
while(IR)
delay0(1); //跳过4.5ms的高电平
while(!IR)
delay0(0); //跳过0.56ms低电平
while(IR) //计算高电平的时间
{
delay0(1);
N++;
if(N>=30) //高电平过长终止外部中断
{
EX1=1;
return;
}
}
IRCOM[j]=IRCOM[j]>>1;//向右移位补零
if(N>=8)
{
IRCOM[j]=IRCOM[j]|0X80;
} //如果为高电平IRCOM为1
N=0;
}
}
if(IRCOM[2]!=~IRCOM[3]) //原码与反码对比验证,如果不正确则停止
{
EX1=1;
// IROK=0;
return;
}
IRCOM[4]=IRCOM[2]>>4; //高四位变低四位
IRCOM[5]=IRCOM[2]&0X0F; //取键值得低四位
IRCOM[7]=IRCOM[4]*16+IRCOM[5];//十六进制换算成十进制
EX1=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar num) //十进制键值显示
{
uchar bai,shi,ge;
bai=num/100;
shi=(num%100)/10;
ge=num%10;
wela=1;
P0=0x01;
wela=0;
P0=0XFF;
dula=1;
P0=tab[bai];
dula=0;
delay(5);
wela=1;
P0=0X02;
wela=0;
P0=0xff;
dula=1;
P0=tab[shi];
dula=0;
delay(5);
wela=1;
P0=0x04;
wela=0;
P0=0xff;
dula=1;
P0=tab[ge];
dula=0;
delay(5);
switch(num)
{
case 7:
dj--;
count=0;
if(dj==0)
dj=1;
break;
case 21:
dj++;
count=0;
if(dj==6)
dj=5;
break;
default:
break;
}
}
/*void IRscan(uchar num)
{
uchar temp;
temp=num;
if(IROK!=0)
{
switch(num)
{
case 7:
dj--;
count=0;
if(dj==0)
dj=1;
break;
case 21:
dj++;
count=0;
if(dj==6)
dj=5;
break;
default:
break;
}
IROK=0;
}
} */
void main()
{
EA=1; //全局中断开
EX1=1; //外部中断1开
IT1=1;
TMOD=0X010;
TH1=0XFE;
TL1=0X0C;
ET1=1;
TR1=1;
count=0;
while(1)
{
// IRscan(IRCOM[7]);
display(IRCOM[7]);
delay(2);
}
}
void time1() interrupt 3
{
TH1=0XFE;
TL1=0X0C;
count++;
if(count<dj)
PWM=1;
else
PWM=0;
count=count%40;
}
复制代码
舵机 红外.rar
2016-3-15 10:27 上传
点击文件名下载附件
下载积分: 黑币 -5
21.55 KB, 下载次数: 48, 下载积分: 黑币 -5
作者:
357291542
时间:
2016-3-15 10:40
艾玛。。坨机 我现在正在研究
作者:
小菜鸟来学习
时间:
2016-4-3 20:44
希望能好好研究下
作者:
absflash
时间:
2016-4-4 09:40
我有个爱顶贴的好习惯
作者:
挖去12
时间:
2016-5-20 22:42
我想参考下
作者:
xyka
时间:
2016-5-23 08:47
认真学习
作者:
5551
时间:
2016-5-31 19:32
有没有原理图
作者:
冥空
时间:
2016-6-12 17:26
谢谢楼主 一起学习一起加油
作者:
15773130960
时间:
2016-8-2 01:51
新手
作者:
eversence213
时间:
2016-12-5 11:22
我有个爱顶贴的好习惯
作者:
fine
时间:
2017-4-18 16:43
46和47行代码应该在41行后面,因为接收引导码是9ms低电平+4.5ms高电平,不分开~
作者:
安若兮
时间:
2017-4-18 19:13
舵机,就是挺多用的,程序有点不知道怎么入手
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1