tao1996311 发表于 2017-6-20 10:00:00

我想做一个红外遥控控制直流电机的课题

我有直流电机调速的源码,但是不知道怎么吧红外遥控的功能接上去

tao1996311 发表于 2017-6-20 11:32:31

/*******************************************************************************
* 函 数 名       : main
* 函数功能               : 主函数
* 输    入       : 无
* 输    出           : 无
*******************************************************************************/
void main()
{       

        IrInit();
        while(1)
        {       
                DisplayData = smgduan/16];
                DisplayData = smgduan%16];
                DisplayData = smgduan;
          DigDisplay();
        }
}               
/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能                   : 读取红外数值的中断函数
* 输入         : 无
* 输出                : 无
*******************************************************************************/

void ReadIr() interrupt 0
{
        u8 j,k;
        u16 err;
        Time=0;                                       
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {       
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去               
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))               //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))       //计算高电平的时间长度。
                                        {
                                                delay(10);       //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue>>=1;       //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue!=~IrValue)
                {
                        return;
                }
        }                       
}
比如这个红外通信的示例程序,我想我按键按开关键,数码管显示45H的时候第一个LED灯亮应该怎么加

大瓶子凌凌漆 发表于 2017-6-20 16:02:11

tao1996311 发表于 2017-6-20 11:32
/*******************************************************************************
* 函 数 名       : ...

参考一下,我的帖子,你增加一个返回数值就可以了

HC6800-ES-V2.0 发表于 2017-6-21 12:34:06

这是我用红外遥控小车的程序,你可以看看,当然会遥控电机了。单片机STC89C52RC,直流电机驱动L298N模块/*
试验成功。但没意义,因为小车开跑了,红外线找不到接收端。所以要用无线电摇控。
*/

#include "reg51.h"

sbit hwx=P3^3;//红外接收数据引脚,也是外部中断1的I/O口

sbit ZLDJ10=P2^3;//控制电机转动I/O口
sbit ZLDJ11=P2^2;
sbit ZLDJ20=P2^1;
sbit ZLDJ21=P2^0;

unsigned char ly_lhj;//保存NEC的四个字节数据,本例程只用第三个

bit ly_flag=1;//成功接收标志

void delay(void);

void main(void)//主函数
{
        ZLDJ10=0;
        ZLDJ11=0;
        ZLDJ20=0;
        ZLDJ21=0;

        EA=1;//开启总中断
        EX1=1;//开启外部中断1,红外接收数据引脚
        IT1=1;//设置成下降沿触发方式
       
        TMOD=0X10;
ET1=1;
        ly_flag=0;
       
        while(1)//主循环
        {       
                if(ly_flag)
                {
                        ly_flag=0;

                        if ((ly_lhj==0x46))//前进Mode键
                        {
                                ZLDJ10=1;
                                ZLDJ11=0;
                                ZLDJ20=1;
                                ZLDJ21=0;                               
                        }

                        if ((ly_lhj==0x40))//停止|<<键
                        {
                                ZLDJ10=0;
                                ZLDJ11=0;
                                ZLDJ20=0;
                                ZLDJ21=0;                               
                        }

                        if ((ly_lhj==0x15))//后退2键
                        {
                                ZLDJ10=0;
                                ZLDJ11=1;
                                ZLDJ20=0;
                                ZLDJ21=1;                               
                        }

                        if ((ly_lhj==0x44))//左转>||键
                        {
                                ZLDJ10=1;
                                ZLDJ11=0;
                                ZLDJ20=0;
                                ZLDJ21=1;                               
                        }

                        if ((ly_lhj==0x43))//右转>>|键
                        {
                                ZLDJ10=0;
                                ZLDJ11=1;
                                ZLDJ20=1;
                                ZLDJ21=0;                               
                        }
}
        }               
}

void hongwai(void)   interrupt 2
{
        unsigned char i,ia;
        TL1=0;
        TH1=0;
        TR1=1;
        while(!hwx);
        TR1=0;
        if(TH1<30||TH1>40)
                return;

        TH1=0;
        TR1=1;
        while(hwx)                        //
        {
                delay();
                if(TH1>22)
                        return;               
        }
        TR1=0;
        if(TH1<12)
                return;

        for(i=0;i<4;i++)
        {
                for(ia=0;ia<8;ia++)
                {                               
                        while(!hwx);
                       
                        TH1=0;
                        TR1=1;
                        while(hwx)
                        {
                                delay();
                                if(TH1>15)               
                                        return;               
                        }
                        TR1=0;
ly_lhj>>=1;
                        if(TH1>4)
                        {
                                ly_lhj|=0x80;
                        }
}
        }
        ly_flag=1;
        TF1=0;
}

void delay(void)//延时子函数,短暂延时35.5us
{               
        unsigned char i=10;
        while(i--);
}

把夕阳灌醉 发表于 2018-2-1 15:33:00

HC6800-ES-V2.0 发表于 2017-6-21 12:34
这是我用红外遥控小车的程序,你可以看看,当然会遥控电机了。单片机STC89C52RC,直流电机驱动L298N模块

那个,你好 我应用了一下你的程序,发现只要启动电机之后 接下来就控制不了电机了,我也用红外线实验程序试了一下   发现只要启动电机之后我想关就关不了啦然后数码管上的数字也不会变化了 想请问一下你怎么解决这个问题的

HC6800-ES-V2.0 发表于 2018-2-2 14:10:29

把夕阳灌醉 发表于 2018-2-1 15:33
那个,你好 我应用了一下你的程序,发现只要启动电机之后 接下来就控制不了电机了,我也用红外线实验程序 ...

我是将小车拿在手里试验的,是成功的,完全可以控制小车前进、后退、转弯、停车!!!!!
小车放地上就不成了。为什么呢?
红外遥控,一般是直线遥控(高中物理课的知识),不像无线电遥控。当你的小车跑了,你就对不准红外接收管,或有东西挡住接收管,遥控就失效了。
所以,这个我做成功后,立即就淘汰了!!!!!
知道原理,就不做无畏的无用功。

Awpeng 发表于 2018-4-18 20:19:38

你好    可以请教下如何对直流电机进行调速么

wx_C11S1t2Z 发表于 2019-9-22 21:30:47

DisplayData = smgduan/16];
                DisplayData = smgduan%16];
                DisplayData = smgduan;
            DigDisplay();
这是啥意思 你知道嘛?

HJB 发表于 2019-10-8 15:53:25

借来参考一下
页: [1]
查看完整版本: 我想做一个红外遥控控制直流电机的课题