请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册

扫一扫,访问微社区

搜索
查看: 4053|回复: 8

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

[复制链接]

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2017-6-20 10:00:00 | 显示全部楼层 |阅读模式
我有直流电机调速的源码,但是不知道怎么吧红外遥控的功能接上去
回复

使用道具 举报

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2017-6-20 11:32:31 | 显示全部楼层
/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       

        IrInit();
        while(1)
        {       
                DisplayData[0] = smgduan[IrValue[2]/16];
                DisplayData[1] = smgduan[IrValue[2]%16];
                DisplayData[2] = smgduan[16];
            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[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}
比如这个红外通信的示例程序,我想我按键按开关键,数码管显示45H的时候第一个LED灯亮应该怎么加
回复 支持 反对

使用道具 举报

42

主题

563

帖子

1915

积分

金牌会员

Rank: 6Rank: 6

积分
1915
发表于 2017-6-20 16:02:11 | 显示全部楼层
tao1996311 发表于 2017-6-20 11:32
/*******************************************************************************
* 函 数 名       : ...

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

使用道具 举报

19

主题

1240

帖子

4768

积分

论坛元老

Rank: 8Rank: 8

积分
4768
发表于 2017-6-21 12:34:06 | 显示全部楼层
这是我用红外遥控小车的程序,你可以看看,当然会遥控电机了。单片机STC89C52RC,直流电机驱动L298N模块
  1. /*
  2. 试验成功。但没意义,因为小车开跑了,红外线找不到接收端。所以要用无线电摇控。
  3. */

  4. #include "reg51.h"

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

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

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

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

  12. void delay(void);

  13. void main(void)//主函数
  14. {
  15.         ZLDJ10=0;
  16.         ZLDJ11=0;
  17.         ZLDJ20=0;
  18.         ZLDJ21=0;

  19.         EA=1;//开启总中断
  20.         EX1=1;//开启外部中断1,红外接收数据引脚
  21.         IT1=1;//设置成下降沿触发方式
  22.        
  23.         TMOD=0X10;
  24. ET1=1;
  25.         ly_flag=0;
  26.        
  27.         while(1)//主循环
  28.         {       
  29.                 if(ly_flag)
  30.                 {
  31.                         ly_flag=0;

  32.                         if ((ly_lhj[2]==0x46))//前进Mode键
  33.                         {
  34.                                 ZLDJ10=1;
  35.                                 ZLDJ11=0;
  36.                                 ZLDJ20=1;
  37.                                 ZLDJ21=0;                               
  38.                         }

  39.                         if ((ly_lhj[2]==0x40))//停止|<<键
  40.                         {
  41.                                 ZLDJ10=0;
  42.                                 ZLDJ11=0;
  43.                                 ZLDJ20=0;
  44.                                 ZLDJ21=0;                               
  45.                         }

  46.                         if ((ly_lhj[2]==0x15))//后退2键
  47.                         {
  48.                                 ZLDJ10=0;
  49.                                 ZLDJ11=1;
  50.                                 ZLDJ20=0;
  51.                                 ZLDJ21=1;                               
  52.                         }

  53.                         if ((ly_lhj[2]==0x44))//左转>||键
  54.                         {
  55.                                 ZLDJ10=1;
  56.                                 ZLDJ11=0;
  57.                                 ZLDJ20=0;
  58.                                 ZLDJ21=1;                               
  59.                         }

  60.                         if ((ly_lhj[2]==0x43))//右转>>|键
  61.                         {
  62.                                 ZLDJ10=0;
  63.                                 ZLDJ11=1;
  64.                                 ZLDJ20=1;
  65.                                 ZLDJ21=0;                               
  66.                         }
  67. }
  68.         }               
  69. }

  70. void hongwai(void)   interrupt 2
  71. {
  72.         unsigned char i,ia;
  73.         TL1=0;
  74.         TH1=0;
  75.         TR1=1;
  76.         while(!hwx);
  77.         TR1=0;
  78.         if(TH1<30||TH1>40)
  79.                 return;

  80.         TH1=0;
  81.         TR1=1;
  82.         while(hwx)                        //
  83.         {
  84.                 delay();
  85.                 if(TH1>22)
  86.                         return;               
  87.         }
  88.         TR1=0;
  89.         if(TH1<12)
  90.                 return;

  91.         for(i=0;i<4;i++)
  92.         {
  93.                 for(ia=0;ia<8;ia++)
  94.                 {                               
  95.                         while(!hwx);
  96.                        
  97.                         TH1=0;
  98.                         TR1=1;
  99.                         while(hwx)
  100.                         {
  101.                                 delay();
  102.                                 if(TH1>15)               
  103.                                         return;               
  104.                         }
  105.                         TR1=0;
  106. ly_lhj[i]>>=1;
  107.                         if(TH1>4)
  108.                         {
  109.                                 ly_lhj[i]|=0x80;
  110.                         }
  111. }
  112.         }
  113.         ly_flag=1;
  114.         TF1=0;
  115. }

  116. void delay(void)//延时子函数,短暂延时35.5us
  117. {               
  118.         unsigned char i=10;
  119.         while(i--);
  120. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

7

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2018-2-1 15:33:00 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-6-21 12:34
这是我用红外遥控小车的程序,你可以看看,当然会遥控电机了。单片机STC89C52RC,直流电机驱动L298N模块

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

使用道具 举报

19

主题

1240

帖子

4768

积分

论坛元老

Rank: 8Rank: 8

积分
4768
发表于 2018-2-2 14:10:29 | 显示全部楼层
把夕阳灌醉 发表于 2018-2-1 15:33
那个,你好 我应用了一下你的程序,发现只要启动电机之后 接下来就控制不了电机了,我也用红外线实验程序 ...

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

使用道具 举报

1

主题

3

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2018-4-18 20:19:38 | 显示全部楼层
你好    可以请教下如何对直流电机进行调速么
回复 支持 反对

使用道具 举报

3

主题

6

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2019-9-22 21:30:47 | 显示全部楼层
DisplayData[0] = smgduan[IrValue[2]/16];
                DisplayData[1] = smgduan[IrValue[2]%16];
                DisplayData[2] = smgduan[16];
            DigDisplay();
这是啥意思 你知道嘛?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2019-10-8 15:53:25 | 显示全部楼层
借来参考一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|51开发板专区 STM32开发板专区 PLC工控专区 PLC学习机专区 ( 粤ICP备18101765号 )

GMT+8, 2019-10-16 13:54 , Processed in 0.163640 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表