找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3140|回复: 2
打印 上一主题 下一主题
收起左侧

自己做的单片机红外遥控遥控小车程序及Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
制作的的遥控小车,要求自己写小车程序和遥控器程序,自己就选择做的用红外线控制的,该设计包含红外遥控小车的程序与控制器程序,可以实现小车前进、后退、左转、右转,以及利用PWM控制小车的加减速,另外还加了控制时按键数值显示,可以作为传输信号是否正确。期间所学到的东西在本次设计中都有体现,可以作为初学者的学习程序。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


遥控器的发送程序如下:
  1. #include <AT89X51.h>

  2. static bit OP;        //红外发射管的亮灭
  3. static unsigned int count;       //延时计数器
  4. static unsigned int endcount; //终止延时计数
  5. static unsigned char Flag;      //红外发送标志
  6. char iraddr1;  //十六位地址的第一个字节
  7. char iraddr2;  //十六位地址的第二个字节

  8. void SendIRdata(char p_irdata);
  9. //void delay();
  10. char getkey()
  11. {
  12.         if(!P2_0)return 1;   //go
  13.         if(!P2_1)return 2;   //back
  14.         if(!P2_2)return 3;   //right
  15.         if(!P2_3)return 4;   //back
  16.         if(!P2_4)return 5;   //up
  17.         if(!P2_5)return 6;   //down
  18.         return 0;
  19. }

  20. void main(void)
  21. {
  22.         char key;
  23.         count = 0;
  24.         Flag = 0;
  25.         OP = 0;
  26.         P3_4 = 1;
  27.         EA = 1; //允许CPU中断
  28.         TMOD = 0x11; //设定时器0和1为16位模式1
  29.         ET0 = 1; //定时器0中断允许

  30.         P1=0xff;
  31.         TH0 = 0xFF;
  32.         TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  33.         TR0 = 1;//开始计数

  34.         iraddr1=0xff;
  35.         iraddr2=0xff;


  36.         do{
  37.                 key=getkey();
  38.                 if(key==1)SendIRdata(0x12);//go
  39.               if(key==2)SendIRdata(0x0b);//back
  40.               if(key==3)SendIRdata(0x1a);//right
  41.               if(key==4)SendIRdata(0x1e);//left
  42.               if(key==5)SendIRdata(0x0e);//up
  43.               if(key==6)SendIRdata(0x1d);//dowm
  44.           }
  45.          while(1);
  46. }
  47. //定时器0中断处理
  48. void timeint(void) interrupt 1
  49. {
  50.         TH0=0xFF;
  51.         TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  52.         count++;
  53. }


  54. void SendIRdata(char p_irdata)
  55. {
  56.         int i;
  57.         char irdata=p_irdata;

  58.   //发送9ms的起始码
  59.         endcount=223;
  60.           Flag=1;
  61.           count=0;
  62.           P3_4=0;
  63.           do{}while(count<endcount);

  64.   //发送4.5ms的结果码
  65.           endcount=117;
  66.           Flag=0;
  67.          count=0;
  68.           P3_4=1;
  69.           do{}while(count<endcount);

  70.   //发送十六位地址的前八位
  71.           irdata=iraddr1;
  72.           for(i=0;i<8;i++)
  73.           {

  74.      //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
  75.                 endcount=10;
  76.              Flag=1;
  77.              count=0;
  78.                  P3_4=0;
  79.              do{}
  80.                 while(count<endcount);

  81.     //停止发送红外信号(即编码中的高电平)
  82.                 if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
  83.              {
  84.                        endcount=15;  //1为宽的高电平
  85.              }
  86.             else
  87.              {
  88.                      endcount=41;   //0为窄的高电平
  89.              }
  90.             Flag=0;
  91.             count=0;
  92.                 P3_4=1;
  93.             do{}while(count<endcount);

  94.             irdata=irdata>>1;
  95.           }

  96.   //发送十六位地址的后八位
  97.           irdata=iraddr2;
  98.           for(i=0;i<8;i++)
  99.           {
  100.              endcount=10;
  101.              Flag=1;
  102.              count=0;
  103.                  P3_4=0;
  104.              do{}
  105.                 while(count<endcount);

  106.              if(irdata-(irdata/2)*2)
  107.              {
  108.                 endcount=15;
  109.              }
  110.              else
  111.              {
  112.                       endcount=41;
  113.              }
  114.              Flag=0;
  115.              count=0;
  116.                  P3_4=1;
  117.              do{}while(count<endcount);

  118.              irdata=irdata>>1;
  119.           }

  120.   //发送八位数据
  121.           irdata=~p_irdata;
  122.           for(i=0;i<8;i++)
  123.           {
  124.              endcount=10;
  125.              Flag=1;
  126.              count=0;
  127.                  P3_4=0;
  128.              do{}while(count<endcount);

  129.              if(irdata-(irdata/2)*2)
  130.              {
  131.                  endcount=15;
  132.              }
  133.              else
  134.              {
  135.                        endcount=41;
  136.              }
  137.              Flag=0;
  138.              count=0;
  139.                  P3_4=1;
  140.              do{}while(count<endcount);

  141.              irdata=irdata>>1;
  142.           }

  143.   //发送八位数据的反码
  144.           irdata=p_irdata;
  145.           for(i=0;i<8;i++)
  146.           {
  147.              endcount=10;
  148.              Flag=1;
  149.              count=0;
  150.                  P3_4=0;
  151.              do{}while(count<endcount);

  152.              if(irdata-(irdata/2)*2)
  153.              {
  154.                  endcount=15;
  155.              }
  156.              else
  157.              {
  158.                        endcount=41;
  159.              }
  160.              Flag=0;
  161.              count=0;
  162.                  P3_4=1;
  163.              do{}while(count<endcount);

  164.              irdata=irdata>>1;
  165.           }

  166.           endcount=10;
  167.           Flag=1;
  168.           count=0;
  169.           P3_4=0;
  170.          do{}while(count<endcount);
  171.           P3_4=1;
  172.           Flag=0;
  173. }
复制代码

Keil代码与Proteus8.8仿真下载: 遥控小车.7z (79.47 KB, 下载次数: 92)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2022-4-14 16:44 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:1031405 发表于 2022-6-2 13:44 | 只看该作者
大佬,红外小车的可以出教程吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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