找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能遥控车程序、PCB电路图PPT、图片

[复制链接]
跳转到指定楼层
楼主
敬请共同爱好者欣赏浏览提意见

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)





单片机源程序如下:
  1. /*小车用遥控器控制程序
  2. L298N的IN1234对应单片机的P1.0123
  3. 直行P1=0xfa
  4. 左转0xf9(小车两轮胎正反转 调向)或0xf8(往哪面转 哪面的的轮胎不转)
  5. 右转0xf6或0xf2
  6. 后退0xf5
  7. 停车oxff
  8. */
  9. #include<reg52.h>      //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义h
  10. sbit IR=P3^2;          //红外接口标志 ,ir是红外辐射 的意思
  11. #define DataPort P0    //定义数据端口 程序中遇到DataPort 则用P0 替换
  12. sbit dula=P2^6;        //定义锁存使能端口 段锁存
  13. sbit wela=P2^7;        //                 位锁存

  14. unsigned char code DuanMa[14]={0x3f,0x06,0x5b,0x4f,0x40,0x38,0x31};// 显示段码值0~9
  15. unsigned char  irtime,gao_num,di_num,l,r,back,stop;//红外、PWM用全局变量

  16. bit irpro_ok,irok;                //标志位,处理完成irpro_ok=1,接收完成irok=1
  17. unsigned char IRcord[4];  //红外码值有4个(客户码1+客2+操作码+操作反码),4*8=32位
  18. unsigned char irdata[33]; //32位红外码值+1位引导码,也就是接受一次需要存储的字节数

  19. void Ir_work(void);                  //红外散转函数声明
  20. void Ircordpro(void);          //红外码值处理函数声明


  21. void delay(int i)                //延时i ms
  22. {
  23.   int j,k;
  24.   for(j=i;j>0;j--)
  25.     for(k=110;k>0;k--);
  26. }  

  27. void tim0_isr (void) interrupt 1 using 1
  28. {
  29.   irtime++;  //用于计数2个下降沿之间的时间
  30. }

  31. /*------------------------------------------------
  32.                   外部中断0中断处理
  33. ------------------------------------------------*/
  34. void EX0_ISR (void) interrupt 0         //外部中断0服务函数
  35. {
  36.   static unsigned char  i;             //接收红外信号处理
  37.   static bit startflag;                //是否开始处理标志位

  38. if(startflag)                        
  39.    {
  40.     if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  41.                         i=0;
  42.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  43.                     irtime=0;
  44.                     i++;
  45.                             if(i==33)
  46.                               {
  47.                                    irok=1;
  48.                                  i=0;
  49.                                   }
  50.           }
  51.            else
  52.                 {
  53.                 irtime=0;
  54.                 startflag=1;
  55.                 }

  56. }

  57. /*------------------------------------------------
  58.                 定时器0初始化
  59. ------------------------------------------------*/
  60. void TIM0init(void)//定时器0初始化
  61. {

  62.   TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  63.   TH0=0x00; //重载值
  64.   TL0=0x00; //初始化值
  65.   ET0=1;    //开中断
  66.   TR0=1;    //启动定时器0
  67. }
  68. /*------------------------------------------------
  69.                   外部中断0初始化
  70. ------------------------------------------------*/
  71. void EX0init(void)
  72. {
  73. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  74. EX0 = 1;   //使能外部中断
  75. EA = 1;    //开总中断
  76. }
  77. /*------------------------------------------------
  78.                   解码散转处理
  79. ------------------------------------------------*/

  80. void Ir_work(void)//红外散转程序,解码后用以选择执行指令
  81. {
  82.        switch(IRcord[2])//判断第三个数码值
  83.                  {
  84.                          case 0x0c:DataPort=DuanMa[1];gao_num=1;di_num=1;break;//1 速度,并显示相应的按键值        0x3f,0x06,0x5b,0x4f,0x40,0x38,0x31
  85.                          case 0x18:DataPort=DuanMa[2];gao_num=2;di_num=1;break;//2
  86.                          case 0x5e:DataPort=DuanMa[3];gao_num=8;di_num=1;break;//3

  87.                          case 0x1C:DataPort=DuanMa[0];stop=1;break;//8 停车
  88.                
  89.                          case 0x52:DataPort=DuanMa[4];back=1;break;//8 倒退
  90.         
  91.                          case 0x08:DataPort=DuanMa[5];l=1;break;//转弯控制 左转
  92.                          case 0x5A:DataPort=DuanMa[6];r=1;break; //转弯控制 右转
  93.              default:break;
  94.                          }                                                                                       

  95.                   irpro_ok=0;//处理完成标志
  96.   }

  97. void qudong()
  98.         {
  99.           unsigned char i;
  100.           if(di_num!=0)                 //前行时,PWM调速
  101.                           {
  102.                                     for(i=0;i<di_num;i++)
  103.                                                 {
  104.                                                    P1=0xff;
  105.                                                 }

  106.                                     for(i=0;i<gao_num;i++)
  107.                                            {
  108.                                               P1=0xfa;
  109.                                            }
  110.                           }

  111.           if(l==1)                         //左转 动作:左转延时300ms后直行
  112.                    {        l=0;
  113.                                    P1=0xf8;
  114.                                 delay(300);
  115.                                 P1=0xfa;
  116.                         }
  117.           if(r==1)                     //右转 动作:右转延时300ms后直行
  118.                    {        r=0;
  119.                                    P1=0xf2;
  120.                                 delay(300);
  121.                                 P1=0xfa;
  122.                                  
  123.                    }
  124.            if(back==1)                //后退 动作:停车,然后一直后退
  125.                    {
  126.                             back=0;
  127.                          P1=0;            //停车
  128.                          P1=0xf5;        //后退
  129.                    }
  130.                 if(stop==1)                //后退 动作
  131.                 {
  132.                         stop=0;
  133.                         P1=0;
  134.                 }
  135.         }
  136. /*------------------------------------------------
  137.                 红外码值处理
  138. ------------------------------------------------*/
  139. void Ircordpro(void)//红外码值处理函数
  140. {
  141.   unsigned char i, j, k;
  142.   unsigned char cord,value;

  143.   k=1;
  144.   for(i=0;i<4;i++)      //处理4个字节
  145.      {
  146.       for(j=1;j<=8;j++) //处理1个字节8位
  147.          {
  148.           cord=irdata[k];
  149.           if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  150.              value|=0x80;
  151.           if(j<8)
  152.                     {
  153.                          value>>=1;
  154.                         }
  155.            k++;
  156.          }
  157.      IRcord[i]=value;
  158.      value=0;     
  159.      }
  160.          irpro_ok=1;//处理完毕标志位置1
  161. }

  162. /*------------------------------------------------
  163.                     主函数
  164. ------------------------------------------------*/
  165. void main(void)
  166. {
  167. ……………………

  168. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码





所有资料51hei提供下载:
遥控车(程序 电路图 实物图).7z (11.29 MB, 下载次数: 74)


评分

参与人数 1黑币 +5 收起 理由
wdehyz + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:435690 发表于 2018-11-29 13:49 | 只看该作者
可以很强的
回复

使用道具 举报

板凳
ID:537645 发表于 2019-5-14 09:53 | 只看该作者
厉害啊
回复

使用道具 举报

地板
ID:438432 发表于 2019-5-16 21:00 | 只看该作者
有元器件清单吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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