微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 解码和步进电机程序已经写好 求达人帮忙添加红外遥控

解码和步进电机程序已经写好 求达人帮忙添加红外遥控

时间: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)        ;
                }
        }
}
上面两个程序都已经验证过,
求达人帮忙加一个红外遥控步进电机的主功能函数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top