找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12676|回复: 14
收起左侧

51单片机红外遥控小车源程序

  [复制链接]
ID:226728 发表于 2017-8-10 20:53 | 显示全部楼层 |阅读模式
自己做的红外遥控小车器件练手

单片机源程序如下:
  1. /*******************************************************************************
  2. --------------------------------------------------------------------------------
  3. * 实 验 名                 : 红外线试验
  4. * 实验说明       : 数码管显示红外线发送过来的键值。
  5. * 连接方式       : 见连接图
  6. * 注    意                 :
  7. *******************************************************************************/

  8. //#include<reg51.h>
  9. #include<reg52.h>
  10. //--定义使用的IO--//


  11. sbit IRIN = P3^2;
  12. sbit PWM1  = P0^1;
  13. sbit PWM2  = P0^2;

  14. //--定义一个全局变量--//
  15. unsigned char timer1;
  16. unsigned char IrValue[6];          //用来存放读取到的红外值
  17. unsigned char Time;

  18. //--声明全局函数--//
  19. void IrInit();
  20. void DelayMs(unsigned int );
  21. void Time1Config();
  22. void speedup();
  23. void Slowdown();
  24. void go();
  25. void left();
  26. void right();
  27. void pwm_left(int x);
  28. void pwm_right(int x);
  29. /*******************************************************************************
  30. * 函数名         : main
  31. * 函数功能                   : 主函数
  32. * 输入           : 无
  33. * 输出                  : 无
  34. *******************************************************************************/

  35. void main()
  36. {
  37.         PWM1=0;
  38.         PWM2=0;
  39.         IrInit();
  40.         Time1Config();
  41.         while(1)
  42.         {
  43.                 IrValue[4]=IrValue[2]>>4;                          //高位
  44.                 IrValue[5]=IrValue[2]&0x0f;                //低位
  45.            if(IrValue[4]==0x0e&&IrValue[5]==0x08)
  46.                   {         
  47.                    pwm_left(37);
  48.                         pwm_right(40);

  49.                 }

  50.                    if(IrValue[4]==0x0d&&IrValue[5]==0x04)
  51.                      {         
  52.                 pwm_left(0);
  53.                                 pwm_right(0);

  54.                 }
  55. //           
  56.                    if(IrValue[4]==0x0e&&IrValue[5]==0x02)
  57.                   {         
  58.                    pwm_left(35);
  59.                         pwm_right(22);


  60.                 }
  61.                    if(IrValue[4]==0x0e&&IrValue[5]==0x00)
  62.                   {         
  63.                    pwm_left(22);
  64.                         pwm_right(35);


  65.                 }
  66.         }
  67. }


  68.         
  69.                         

  70. void pwm_left(int x)
  71. {
  72.                 if(timer1>100)  //PWM周期为100*0.5ms
  73.                 {
  74.                         timer1=0;
  75.                 }
  76.                 if(timer1 < x)        //改变30这个值可以改变直流电机的速度
  77.                 {
  78.                         PWM1=1;
  79.                 }
  80.                 else
  81.                 {
  82.                         PWM1=0;
  83.                 }        
  84. }
  85.          
  86. void pwm_right(int y)
  87. {
  88.                 if(timer1>100)  //PWM周期为100*0.5ms
  89.                 {
  90.                         timer1=0;
  91.                 }
  92.                 if(timer1 < y)        //改变30这个值可以改变直流电机的速度
  93.                 {
  94.                         PWM2=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         PWM2=0;
  99.                 }        
  100. }
  101. /*******************************************************************************
  102. * 函数名         : DelayMs()
  103. * 函数功能                   : 延时
  104. * 输入           : x
  105. * 输出                  : 无
  106. *******************************************************************************/

  107. void DelayMs(unsigned int x)   //0.14ms误差 0us
  108. {
  109.         unsigned char i;
  110.         while(x--)
  111.         {
  112.                 for (i = 0; i<13; i++)
  113.                 {}
  114.         }
  115. }
  116. /*******************************************************************************
  117. * 函数名         : IrInit()
  118. * 函数功能                   : 初始化红外线接收
  119. * 输入           : 无
  120. * 输出                  : 无
  121. *******************************************************************************/

  122. void IrInit()
  123. {
  124.         IT0=1;//下降沿触发
  125.         EX0=1;//打开中断0允许
  126.         EA=1;        //打开总中断

  127.         IRIN=1;//初始化端口
  128.     PWM1=0;
  129.         PWM2=0;
  130. }
  131. /*******************************************************************************
  132. * 函数名         : ReadIr()
  133. * 函数功能                   : 读取红外数值的中断函数
  134. * 输入           : 无
  135. * 输出                  : 无
  136. *******************************************************************************/

  137. void ReadIr() interrupt 0
  138. {
  139.         unsigned char j,k;
  140.         unsigned int err;
  141.         Time=0;                                         
  142.         DelayMs(70);

  143.         if(IRIN==0)                //确认是否真的接收到正确的信号
  144.         {         
  145.                
  146.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  147.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  148.                 侯,程序死在这里*/        
  149.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  150.                 {                        
  151.                         DelayMs(1);
  152.                         err--;
  153.                 }
  154.                 if(IRIN==1)                        //如果正确等到9ms低电平
  155.                 {
  156.                         err=500;
  157.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  158.                         {
  159.                                 DelayMs(1);
  160.                                 err--;
  161.                         }
  162.                         for(k=0;k<4;k++)                //共有4组数据
  163.                         {                                
  164.                                 for(j=0;j<8;j++)        //接收一组数据
  165.                                 {

  166.                                         err=60;               
  167.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  168.                                         {
  169.                                                 DelayMs(1);
  170.                                                 err--;
  171.                                         }
  172.                                         err=500;
  173.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  174.                                         {
  175.                                                 DelayMs(1);//0.14ms
  176.                                                 Time++;
  177.                                                 err--;
  178.                                                 if(Time>30)
  179.                                                 {
  180.                                                         EX0=1;
  181.                                                         return;
  182.                                                 }
  183.                                         }
  184.                                         IrValue[k]>>=1;         //k表示第几组数据
  185.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  186.                                         {
  187.                                                 IrValue[k]|=0x80;
  188.                                         }
  189.                                         Time=0;                //用完时间要重新赋值                                                        
  190.                                 }
  191.                         }
  192.                 }
  193.                 if(IrValue[2]!=~IrValue[3])
  194.                 {
  195.                         return;
  196.                 }
  197.         }                        
  198. }

  199. /*******************************************************************************
  200. * 函 数 名       : Time1Config
  201. * 函数功能                 : 设置定时器
  202. * 输    入       : 无
  203. * 输    出       : 无
  204. *******************************************************************************/

  205. void Time1Config()
  206. ……………………

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

所有资料51hei提供下载:
程序.zip (30.61 KB, 下载次数: 264)
回复

使用道具 举报

ID:298119 发表于 2018-3-28 08:50 | 显示全部楼层
顶顶顶 刚好需要 谢谢楼主
回复

使用道具 举报

ID:298119 发表于 2018-3-28 09:09 | 显示全部楼层
谢谢无私分享
回复

使用道具 举报

ID:317135 发表于 2018-5-18 14:37 | 显示全部楼层
下载后发现里面的前后左右程序没有写

下载后发现里面的前后左右程序没有写

下载后发现里面的前后左右程序没有写
回复

使用道具 举报

ID:343934 发表于 2018-6-7 16:11 来自手机 | 显示全部楼层
好好好,,谢谢楼主
回复

使用道具 举报

ID:89217 发表于 2018-6-18 01:49 | 显示全部楼层
灰常感谢楼主,共享资料。学习了
回复

使用道具 举报

ID:326450 发表于 2018-11-4 18:48 | 显示全部楼层
邮电路图和其他详细资料么?
回复

使用道具 举报

ID:426007 发表于 2018-11-15 23:28 | 显示全部楼层
灰常感谢楼主,共享资料。学习了
回复

使用道具 举报

ID:428746 发表于 2018-11-18 16:26 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:426007 发表于 2018-11-18 23:48 | 显示全部楼层
楼主打不开啊
回复

使用道具 举报

ID:165792 发表于 2018-11-26 21:52 | 显示全部楼层
好,下载来试试
回复

使用道具 举报

ID:584662 发表于 2019-8-1 20:03 | 显示全部楼层
没看到连接图啊
回复

使用道具 举报

ID:592788 发表于 2019-8-6 23:38 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:661170 发表于 2019-12-11 01:11 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:661170 发表于 2019-12-11 01:11 | 显示全部楼层
帮大忙了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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