找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控小车的单片机源程序,希望能帮到大家

[复制链接]
跳转到指定楼层
楼主
ID:261485 发表于 2018-8-5 03:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近偶然翻到以前的红外小车程序,分享给大家,希望对大家有帮助。

单片机源程序如下:
  1. #include<reg52.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;        

  4. sbit IRIN=P3^2;        

  5. sbit PWM1=P1^4;
  6. sbit PWM2=P1^5;

  7. sbit LSA=P2^2;
  8. sbit LSB=P2^3;
  9. sbit LSC=P2^4;

  10. sbit IN1=P1^0;
  11. sbit IN2=P1^1;
  12. sbit IN3=P1^2;
  13. sbit IN4=P1^3;



  14. u8 IrValue[6];
  15. u8 Time;
  16. void qianjin();
  17. void houtui();
  18. void zuozhuan();
  19. void youzhuan();
  20. void Time1Config();

  21. u8 DisplayData[8];
  22. u8 code smgduan[17]={
  23. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  24. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};


  25. #define L_go IN3=1;IN4=0         //×ó???°??
  26. #define R_go IN1=1;IN2=0         //óò???°??
  27. #define L_back IN3=0;IN4=1         //×ó??oóí?
  28. #define R_back IN1=0;IN2=1         //óò??oóí?
  29. #define L_stop IN3=0;IN4=0         //×ó??í£?1
  30. #define R_stop IN1=0;IN2=0         //óò??í£?1
  31. #define car_go            L_go;R_go             //D?3μ?°??
  32. #define car_back    L_back;R_back         //D?3μoóí?
  33. #define car_left    R_stop;L_go                 //D?3μ×ó×a
  34. #define car_right   L_stop;R_go                 //D?3μóò×a
  35. #define car_stop    L_stop;R_stop         //D?3μí£?1

  36. unsigned char timer1;

  37. void Delay(u16 i)
  38. {
  39.         while(i--);
  40. }

  41. void DigDisplay()                            //switch case 语句
  42. {
  43.         u8 i;
  44.         for(i=0;i<3;i++)
  45.         {
  46.                 switch(i)         
  47.                 {
  48.                         case(0):
  49.                                 LSA=0;LSB=0;LSC=0; break;
  50.                         case(1):
  51.                                 LSA=1;LSB=0;LSC=0; break;
  52.                         case(2):
  53.                                 LSA=0;LSB=1;LSC=0; break;        
  54.                 }
  55.                 P0=DisplayData[2-i];
  56.                 Delay(100);         
  57.                 P0=0x00;
  58.         }               
  59. }

  60. void IrInit()
  61. {
  62.         IT0=1;
  63.         EX0=1;
  64.         EA=1;

  65.         IRIN=1;
  66. }

  67. void qianjin()
  68. {
  69.           while(1)
  70.           {
  71.                         car_go;
  72.                 if(timer1>100)  //PWM周期为100*0.5ms
  73.                          {
  74.                                  timer1=0;
  75.                         }
  76.                        if(timer1 < 50)        //改变30这个值可以改变直流电机的速度
  77.                          {
  78.                                  PWM2=1;
  79.                         }
  80.                         else
  81.                         {
  82.                                 PWM2=0;
  83.                                 }
  84.                                 }
  85.                            if(timer1 < 20)
  86.                                 {
  87.                                         PWM1=1;
  88.                                 }
  89.                                 else
  90.                                 {  
  91.                                           PWM1=0;
  92.                                 }
  93.                                 if(IrValue[2]!=0x18) break;
  94.           }
  95. }

  96. void houtui()
  97. {
  98.         while(1)
  99.         {
  100.                 car_back;
  101.                 if(timer1>100)  //PWM周期为100*0.5ms
  102.                          {
  103.                                  timer1=0;
  104.                         }
  105.                        if(timer1 < 40)        //改变30这个值可以改变直流电机的速度
  106.                          {
  107.                                  PWM1=1;
  108.                         }
  109.                         else
  110.                         {
  111.                                 PWM1=0;
  112.                                 }
  113.                                 }
  114.                            if(timer1 < 20)
  115.                                 {
  116.                                         PWM2=1;        
  117.                                 }
  118.                                 else
  119.                                 {  
  120.                                         PWM2=0;
  121.                                 }
  122.                 if(IrValue[2]!=0x52) break;
  123.         }
  124. }

  125. void zuozhuan()
  126. {
  127.         while(1)
  128.         {
  129.                 car_left;
  130.                 if(timer1>100)  //PWM周期为100*0.5ms
  131.                          {
  132.                                  timer1=0;
  133.                         }
  134.                        if(timer1 < 40)        //改变30这个值可以改变直流电机的速度
  135.                          {
  136.                                  PWM1=1;
  137.                         }
  138.                         else
  139.                         {
  140.                                 PWM1=0;
  141.                                 }
  142.                                 }
  143.                            if(timer1 < 20)
  144.                                 {
  145.                                         PWM2=1;        
  146.                                 }
  147.                                 else
  148.                                 {  
  149.                                         PWM2=0;
  150.                                 }
  151.                 if(IrValue[2]!=0x08)
  152.                 {
  153.                     break;        
  154.                 }
  155.         }
  156. }

  157. void youzhuan()
  158. {
  159.         while(1)
  160.    {
  161.            car_right;
  162.         if(timer1>100)  //PWM周期为100*0.5ms
  163.                          {
  164.                                  timer1=0;
  165.                         }
  166.                        if(timer1 < 40)        //改变30这个值可以改变直流电机的速度
  167.                          {
  168.                                  PWM1=1;
  169.                         }
  170.                         else
  171.                         {
  172.                                 PWM1=0;
  173.                                 }
  174.                                 }
  175.                            if(timer1 < 20)
  176.                                 {
  177.                                         PWM2=1;        
  178.                                 }
  179.                                 else
  180.                                 {  
  181.                                         PWM2=0;
  182.                                 }
  183.         if(IrValue[2]!=0x5a)          break;        
  184.    }
  185. }

  186. void main()
  187. {
  188.         IrInit();
  189.         Time1Config();
  190.         while(1)
  191.     {
  192.             DisplayData[0] = smgduan[IrValue[2]/16];
  193.                 DisplayData[1] = smgduan[IrValue[2]%16];
  194.                 DisplayData[2] = smgduan[16];
  195.             DigDisplay();


  196.                 switch(IrValue[2])
  197.                 {
  198.                         case 0x52 :qianjin();break;               
  199.                         case 0x18 :houtui();break;               
  200.                 case 0x45 :car_stop;break;
  201.                         case 0x5a :zuozhuan();break;                 
  202.                         case 0x08 :youzhuan();break;               
  203.                 }
  204.         }
  205. }         


  206. void ReadIr() interrupt 0
  207. {
  208.         u8 j,k;
  209.         u16 err;
  210.         Time=0;                                         
  211.         Delay(700);        //7ms
  212.         if(IRIN==0)                //è·è?ê?·???μ??óê?μ??yè·μ?D?o?
  213.         {         
  214.                
  215.                 err=1000;                                //1000*10us=10ms,3?1y?μ?÷?óê?μ?′í?óμ?D?o?
  216.                 /*μ±á???ì??t???a??ê??-?·£?è?1?óDò???ì??t?a?ùμ?ê±oòì?3??-?·£??aμ?3ìDò3?′íμ?ê±
  217.                 o?£?3ìDò?à?ú?aà?*/        
  218.                 while((IRIN==0)&&(err>0))        //μè′y?°??9msμ?μíμ???1y襠                 
  219.                 {                        
  220.                         Delay(1);
  221.                         err--;
  222.                 }
  223.                 if(IRIN==1)                        //è?1??yè·μèμ?9msμíμ???
  224.                 {
  225.                         err=500;
  226.                         while((IRIN==1)&&(err>0))                 //μè′y4.5msμ??eê???μ???1yè¥
  227.                         {
  228.                                 Delay(1);
  229.                                 err--;
  230.                         }
  231.                         for(k=0;k<4;k++)                //12óD4×éêy?Y
  232.                         {                                
  233.                                 for(j=0;j<8;j++)        //?óê?ò?×éêy?Y
  234.                                 {

  235.                                         err=60;               
  236.                                         while((IRIN==0)&&(err>0))//μè′yD?o??°??μ?560usμíμ???1yè¥
  237.                                         {
  238.                                                 Delay(1);
  239.                                                 err--;
  240.                                         }
  241.                                         err=500;
  242.                                         while((IRIN==1)&&(err>0))         //??????μ???μ?ê±??3¤?è?£
  243.                                         {
  244.                                                 Delay(10);         //0.1ms
  245.                                                 Time++;
  246.                                                 err--;
  247.                                                 if(Time>30)
  248.                                                 {
  249.                                                         return;
  250.                                                 }
  251.                                         }
  252.                                         IrValue[k]>>=1;         //k±íê?μú??×éêy?Y
  253.                                         if(Time>=8)                        //è?1???μ???3???′óóú565us£????′ê?1
  254.                                         {
  255.                                                 IrValue[k]|=0x80;
  256.                                         }
  257.                                         Time=0;                //ó?íêê±??òa??D??3?μ                                                        
  258.                                 }
  259.                         }
  260.                 }
  261.                 if(IrValue[2]!=~IrValue[3])
  262.                 {
  263.                         return;
  264.                 }
  265.         }                        
  266. }

  267. void Time1Config()
  268. {
  269.         TMOD|= 0x10;   //设置定时计数器工作方式1为定时器

  270.         //--定时器赋初始值,12MHZ下定时0.5ms--//  
  271.         TH1 = 0xFE;
  272.         TL1 = 0x0C;

  273.         
  274.         ET1 = 1;          //开启定时器1中断
  275.         EA = 1;
  276.         TR1 = 1;         //开启定时器        
  277. }

  278. void Time1(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
  279. {
  280.         TH1 = 0xFE;  //重新赋初值
  281.         TL1 = 0x0C;
  282.         timer1++;   
  283. }
复制代码

所有资料51hei提供下载:
遥控小车 - 副本.zip (27.78 KB, 下载次数: 17)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:375880 发表于 2018-8-5 21:58 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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