解码和步进电机程序已经写好 求达人帮忙添加红外遥控
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P3^2; //红外接口定义
sbit BEEP=P1^2;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0xfe,0xfd,0xfb,0xf7,0xef,0xdf
uchar irtime; //00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
uchar irdata[33];
uchar bitnum;
uchar startflag;
uchar irok;
uchar ircode[4];
uchar irprosok; //红外处理
uchar disnum[8];
/*************************************************************************
延时函数
**************************************************************************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=20;j>0;j--);
}
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*************************************************************************
蜂鸣器
**************************************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<5;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(50); //延时
}
/*************************************************************************
定时器初始化
**************************************************************************/
void timer0init (void) //定时器0初始化 256*(1/11.0592M)*12=0.28ms
{
TMOD=0x02; //工作模式2
TH0=0x00; //初值0
TL0=0x00; //初值0
ET0=1; //打开中断
EA=1; //开总开关
TR0=1; //启动定时器
}
/*************************************************************************
中断功能函数
**************************************************************************/
void int0init (void)
{
IT0=1; //下降沿触发
EX0=1; //打开外部中断
EA=1; //开中断开关
}
/*************************************************************************
定时器中断
**************************************************************************/
void timer0() interrupt 1 //定时器0中断
{
irtime++;
}
/*************************************************************************
外部中断函数
**************************************************************************/
void int0 () interrupt 0 //外部中断0
{
if (startflag)
{
if(irtime>32&&irtime<60) //8-16ms之间既认为是引导码
{
bitnum=0; //bitnum清零,准备开始接收引导码
}
irdata[bitnum]=irtime; //1位引导码接收完毕
irtime=0; //irtime清零,准备开始计时接收8位客户码,8位客户反码,8位操作码和8位操作反码
bitnum++; //码数加1
if(bitnum==33) //接收完一帧33位
{
bitnum=0; //bitnum清零
irok=1; //1帧数据接收完毕
}
}
else
{
irtime=0;
startflag=1;
}
}
/*************************************************************************
函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中
**************************************************************************/
void irpros(void) //红外处理 0码irtime (0.56+0.56)/0.28=4
{ // 1码irtime (0.56+1.68)/0.28=6.56
uchar no,k,i,j;
k=1; //跳过1位引导码
for(j=0;j<4;j++) //4组代码
{
for(i=0;i<8;i++)
{
no=no>>1; //右移1位
if(irdata[k]>6)
{
no=no|0x80; //最高位置1
}
k++;
}
ircode[j]=no;
}
irprosok=1;
}
/*************************************************************************
红外码值转换
**************************************************************************/
void irwork(void) //红外码值转换 将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示
{
disnum[0]=ircode[0]/16;
disnum[1]=ircode[0]%16;
disnum[2]=ircode[1]/16;
disnum[3]=ircode[1]%16;
disnum[4]=ircode[2]/16;
disnum[5]=ircode[2]%16;
disnum[6]=ircode[3]/16;
disnum[7]=ircode[3]%16;
}
/*************************************************************************
数码管显示程序
**************************************************************************/
void display() //数码管显示程序
{
uchar i;
for(i=2;i<6;i++) //只显示客户反码,操作码 只有4个数码管,只能显示4位数字
{
P0=table_du[disnum[i]]; //disnum[8] 0,1,2,3, 4,5,6,7
P2=table_we[i+4]; //4位数码管连接的是P2^4-P2^7高4位
delay_50us(20);
}
}
/*************************************************************************
主函数
**************************************************************************/
void main()
{
timer0init();
int0init();
while(1)
{
if(irok==1)
{
irpros();
irok=0;
}
if(irprosok==1)
{
irwork();
beep();
irprosok=0;
}
display();
}
}
遥控解码键值:
00 01 02
04 05 06
08 09 0A
0C 0D 0E
10 11 12
14 15 16
18 19 1A
步进电机正反转
#include<reg52.H>
#include <intrins.h> //内部包含延时函数 _nop_();
typedef unsigned char u8;
typedef unsigned int u16;
sbit key =P3^7;
u8 code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
u8 code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
bit flag=1;
void sdelay(u8 n) //延时程序
{
u8 i,k;
for(i=3*n;i>0;i--)
for(k=225;k>0;k--);
}
void main(void)
{
u8 i;
while(1)
{
for (i=0; i<8; i++) //一个周期--八拍
{
if(flag) P2 = FFW[i]; //取数据
else P2 = REV[i];
sdelay(5); //节拍延时,用于调节转速
}
if(!key)
{
sdelay(10);
if(!key) flag=~flag;
while(!key) ;
}
}
}
上面两个程序都已经验证过,
求达人帮忙加一个红外遥控步进电机的主功能函数
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P3^2; //红外接口定义
sbit BEEP=P1^2;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table_we[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//0xfe,0xfd,0xfb,0xf7,0xef,0xdf
uchar irtime; //00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
uchar irdata[33];
uchar bitnum;
uchar startflag;
uchar irok;
uchar ircode[4];
uchar irprosok; //红外处理
uchar disnum[8];
/*************************************************************************
延时函数
**************************************************************************/
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=20;j>0;j--);
}
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*************************************************************************
蜂鸣器
**************************************************************************/
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<5;i++)
{
delay1ms();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(50); //延时
}
/*************************************************************************
定时器初始化
**************************************************************************/
void timer0init (void) //定时器0初始化 256*(1/11.0592M)*12=0.28ms
{
TMOD=0x02; //工作模式2
TH0=0x00; //初值0
TL0=0x00; //初值0
ET0=1; //打开中断
EA=1; //开总开关
TR0=1; //启动定时器
}
/*************************************************************************
中断功能函数
**************************************************************************/
void int0init (void)
{
IT0=1; //下降沿触发
EX0=1; //打开外部中断
EA=1; //开中断开关
}
/*************************************************************************
定时器中断
**************************************************************************/
void timer0() interrupt 1 //定时器0中断
{
irtime++;
}
/*************************************************************************
外部中断函数
**************************************************************************/
void int0 () interrupt 0 //外部中断0
{
if (startflag)
{
if(irtime>32&&irtime<60) //8-16ms之间既认为是引导码
{
bitnum=0; //bitnum清零,准备开始接收引导码
}
irdata[bitnum]=irtime; //1位引导码接收完毕
irtime=0; //irtime清零,准备开始计时接收8位客户码,8位客户反码,8位操作码和8位操作反码
bitnum++; //码数加1
if(bitnum==33) //接收完一帧33位
{
bitnum=0; //bitnum清零
irok=1; //1帧数据接收完毕
}
}
else
{
irtime=0;
startflag=1;
}
}
/*************************************************************************
函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中
**************************************************************************/
void irpros(void) //红外处理 0码irtime (0.56+0.56)/0.28=4
{ // 1码irtime (0.56+1.68)/0.28=6.56
uchar no,k,i,j;
k=1; //跳过1位引导码
for(j=0;j<4;j++) //4组代码
{
for(i=0;i<8;i++)
{
no=no>>1; //右移1位
if(irdata[k]>6)
{
no=no|0x80; //最高位置1
}
k++;
}
ircode[j]=no;
}
irprosok=1;
}
/*************************************************************************
红外码值转换
**************************************************************************/
void irwork(void) //红外码值转换 将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示
{
disnum[0]=ircode[0]/16;
disnum[1]=ircode[0]%16;
disnum[2]=ircode[1]/16;
disnum[3]=ircode[1]%16;
disnum[4]=ircode[2]/16;
disnum[5]=ircode[2]%16;
disnum[6]=ircode[3]/16;
disnum[7]=ircode[3]%16;
}
/*************************************************************************
数码管显示程序
**************************************************************************/
void display() //数码管显示程序
{
uchar i;
for(i=2;i<6;i++) //只显示客户反码,操作码 只有4个数码管,只能显示4位数字
{
P0=table_du[disnum[i]]; //disnum[8] 0,1,2,3, 4,5,6,7
P2=table_we[i+4]; //4位数码管连接的是P2^4-P2^7高4位
delay_50us(20);
}
}
/*************************************************************************
主函数
**************************************************************************/
void main()
{
timer0init();
int0init();
while(1)
{
if(irok==1)
{
irpros();
irok=0;
}
if(irprosok==1)
{
irwork();
beep();
irprosok=0;
}
display();
}
}
遥控解码键值:
00 01 02
04 05 06
08 09 0A
0C 0D 0E
10 11 12
14 15 16
18 19 1A
步进电机正反转
#include<reg52.H>
#include <intrins.h> //内部包含延时函数 _nop_();
typedef unsigned char u8;
typedef unsigned int u16;
sbit key =P3^7;
u8 code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
u8 code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
bit flag=1;
void sdelay(u8 n) //延时程序
{
u8 i,k;
for(i=3*n;i>0;i--)
for(k=225;k>0;k--);
}
void main(void)
{
u8 i;
while(1)
{
for (i=0; i<8; i++) //一个周期--八拍
{
if(flag) P2 = FFW[i]; //取数据
else P2 = REV[i];
sdelay(5); //节拍延时,用于调节转速
}
if(!key)
{
sdelay(10);
if(!key) flag=~flag;
while(!key) ;
}
}
}
上面两个程序都已经验证过,
求达人帮忙加一个红外遥控步进电机的主功能函数
