找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+PNP三极管红外线发射与接受程序Proteus仿真 实现遥控车

  [复制链接]
跳转到指定楼层
楼主
单片机与红外收发装置及数码管,独立按键实现的遥控车仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机红外线发射源程序如下:
  1. /***************************************************************
  2.         作品:红外线发射
  3.   单片机:STC89C52RC
  4.     晶振:12M
  5. 编译环境:Keil uVision4 V9.00
  6. ***************************************************************/
  7. //
  8. //        发射引脚(接PNP三极管b极)
  9. //        PNP三极管e极接2Ω电阻,c极接红外发射管
  10.      
  11. #include <REG51.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int

  15. #define SBM   0x80                //识别码

  16. #define m9    (65536-9000)               //约9mS
  17. #define m4_5  (65536-4500)               //约4.5mS
  18. #define m1_6  (65536-1630)               //约1.65mS
  19. #define m_65  (65536-580)               //约0.65mS
  20. #define m_56  (65536-560)               //约0.56mS
  21. #define m40   (65536-40000)       //约40mS
  22. #define m56   (65536-56000)       //56mS
  23. #define m2_25 (65536-2250)        //约2.25mS

  24. sbit IR  = P3^6;                                  //定义发射引脚(接PNP三极管基极)
  25. //按键
  26. sbit key1=P1^1;
  27. sbit key2=P1^2;
  28. sbit key3=P1^3;
  29. sbit key4=P1^4;
  30. sbit key5=P1^5;
  31. sbit key6=P1^6;
  32. sbit key7=P1^7;
  33. void  keyscan(void);
  34. void  ZZ(uchar x);
  35. void  Z0(uchar temp);
  36. void  TT0(bit BT,uint x);
  37. void  YS(uchar time);

  38. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  39. 函数功能:主函数
  40. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  41. void main(void)
  42. {

  43.   TMOD = 0x01;         //T0 16位工作方式
  44.   IR=1;                                   //发射端口常态为高电平

  45.   while(1)
  46.   {
  47.    keyscan();
  48.   }
  49. }

  50. /***************************************************************
  51. 函数功能:散转程序
  52. 入口参数:v
  53. //
  54. //  13 14 15 16
  55. //  9  10 11 12
  56. //  5  6  7  8
  57. //  1  2  3  4
  58. ***************************************************************/
  59. void keyscan(void)
  60. {
  61. //发送0x01
  62.   if(key1==0)                                          
  63.     {
  64.       YS(5);
  65.      if(key1==0)
  66.           {
  67.                   ZZ(0x01);
  68.                  
  69.                      while(!key1);//等待按键释放
  70.           }
  71.         }
  72. //发送0x02
  73.   if(key2==0)                                          
  74.     {
  75.       YS(5);
  76.      if(key2==0)
  77.           {
  78.                   ZZ(0x02);
  79.                  
  80.                      while(!key2);//等待按键释放
  81.           }
  82.         }
  83. //发送0x03
  84.   if(key3==0)                                          
  85.     {
  86.       YS(5);
  87.      if(key3==0)
  88.           {
  89.                   ZZ(0x03);
  90.                  
  91.                      while(!key3);//等待按键释放
  92.           }
  93.         }
  94. //发送0x04
  95.   if(key4==0)                                          
  96.     {
  97.       YS(5);
  98.      if(key4==0)
  99.           {
  100.                   ZZ(0x04);
  101.                  
  102.                      while(!key4);//等待按键释放
  103.           }
  104.         }
  105. //发送0x05
  106.   if(key5==0)                                          
  107.     {
  108.       YS(5);
  109.      if(key5==0)
  110.           {
  111.                   ZZ(0x05);
  112.                  
  113.                      while(!key5);//等待按键释放
  114.           }
  115.         }
  116. //发送0x06
  117.   if(key6==0)                                          
  118.     {
  119.       YS(5);
  120.      if(key6==0)
  121.           {
  122.                   ZZ(0x06);
  123.                  
  124.                      while(!key6);//等待按键释放
  125.           }
  126.         }
  127. //发送0x07
  128.   if(key7==0)                                          
  129.     {
  130.       YS(5);
  131.      if(key7==0)
  132.           {
  133.                   ZZ(0x07);
  134.                      while(!key7);//等待按键释放
  135.           }
  136.         }
  137. }
  138. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  139. 函数功能:发送主程序
  140. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  141. void ZZ(uchar x)
  142. {
  143.   TT0(1,m9);                   //高电平9mS
  144.   TT0(0,m4_5);               //低电平4.5mS

  145.   /*┈ 发送4帧数据 ┈*/
  146.   Z0(SBM);                                                                                                                                       
  147.   Z0(~SBM);
  148.   Z0(x);
  149.   Z0(~x);

  150.   /*┈┈ 结束码 ┈┈*/
  151.   TT0(1,m_65);
  152.   TT0(0,m40);
  153.                   

  154. }
  155. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  156. 函数功能:单帧发送程序
  157. 入口参数:1帧数据
  158. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  159. void Z0(uchar temp)
  160. {
  161.   uchar v;
  162.   for (v=0;v<8;v++)                     //循环8次移位
  163.        {     
  164.                  TT0(1,m_65);                        //高电平0.65mS         
  165.                          if(temp&0x01) TT0(0,m1_6); //发送最低位
  166.                          else          TT0(0,m_56);     
  167.                          temp >>= 1;                //右移一位
  168.         }   
  169. }

  170. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  171. 函数功能:38KHz脉冲发射 + 延时程序
  172. 入口参数:(是否发射脉冲,延时约 x (uS))
  173. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  174. void TT0(bit BT,uint x)
  175. {
  176.   TH0 = x>>8;                    //输入T0初始值
  177.   TL0 = x;
  178.   TF0=0;                                //清0
  179.   TR0=1;                                //启动定时器0
  180.   if(BT == 0) while(!TF0);        //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
  181.   else while(1)                            //38KHz脉冲,占空比5:26
  182.          {
  183.                   IR = 0;
  184.                   if(TF0)break;
  185.               if(TF0)break;
  186.                   IR = 1;
  187.                 if(TF0)break;
  188.                  if(TF0)break;
  189.                  if(TF0)break;
  190.                   if(TF0)break;
  191.                  if(TF0)break;
  192.                  if(TF0)break;
  193.                  if(TF0)break;
  194.                  if(TF0)break;
  195.                  if(TF0)break;
  196.                   if(TF0)break;
  197.                  }
  198.   TR0=0;                                //关闭定时器0
  199.   TF0=0;                                //标志位溢出则清0

  200.   IR =1;                                //脉冲停止后,发射端口常态为高电平
  201. }
  202. /***************************************************************
  203. 函数功能:按键消抖    延时程序
  204. 入口参数:1ms×time       (晶振=12MHz)
  205. ***************************************************************/
  206. void YS(uchar time)
  207. {
  208.      uchar i,j;
  209.          for(i=0; i<time; i++)
  210.      for(j=0; j<247; j++)_nop_();
  211. }
复制代码
  1. #include <REGX52.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char   
  4. #define uint  unsigned int
  5. #define duanma P0  
  6. #define weima P2
  7. //按键
  8. sbit key1=P1^1;
  9. sbit key2=P1^2;
  10. sbit key3=P1^3;
  11. sbit key4=P1^4;
  12. sbit key5=P1^5;
  13. sbit key6=P1^6;
  14. sbit key7=P1^7;
  15. //红外接收头
  16. sbit        IR=P3^2;
  17. //电机接口       
  18. sbit motor1=P3^4;
  19. sbit motor2=P3^5;
  20. sbit motor3=P3^6;
  21. sbit motor4=P3^7;
  22. uchar code table[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};//数码管显示0~9和 -
  23. uchar        N[4];                                 //识别码,操作码存放
  24. uchar num,count;//状态,加减选择
  25. uint speed=100;//速度
  26. //延时函数
  27. void delay(uint mux)
  28. {                              
  29.   uint i,j;
  30.   
  31.   for(i=mux;i>0;i--)
  32.     for(j=100;j>0;j--);

  33. }
  34. //数码管显示内容函数
  35. void display()
  36. {
  37.   
  38.     delay(1);
  39.   weima=0x01;
  40.   duanma=table[num];//显示状态
  41.      delay(1);
  42.   weima=0x02;
  43.   duanma=table[10];//显示-
  44.      delay(1);
  45.   weima=0x04;
  46.   duanma=table[10];//显示-
  47.      delay(1);
  48.   weima=0x08;
  49.   duanma=table[speed/100];//显示档位
  50.      delay(1);

  51. }
  52. //前进
  53. void go()
  54. {
  55.   uint i;
  56.   for(i=speed;i>0;i=i-5)
  57.   {
  58.      if(i>10)
  59.          {
  60.        motor1=0;
  61.        motor2=1;

  62.        motor3=1;
  63.        motor4=0;
  64.           }
  65.          if(i<11)
  66.           {
  67.        motor1=0;
  68.        motor2=0;

  69.        motor3=0;
  70.        motor4=0;
  71.           }
  72.   }

  73. }
  74. //后退
  75. void back()
  76. {
  77.   uint i;
  78.   for(i=speed;i>0;i=i-5)
  79.   {
  80.      if(i>10)
  81.          {
  82.        motor1=1;
  83.        motor2=0;

  84.        motor3=0;
  85.        motor4=1;
  86.           }
  87.            if(i<11)
  88.           {
  89.        motor1=0;
  90.        motor2=0;

  91.        motor3=0;
  92.        motor4=0;
  93.           }
  94.   }

  95. }
  96. //停止
  97. void stop()
  98. {
  99.   motor1=0;
  100.   motor2=0;

  101.   motor3=0;
  102.   motor4=0;

  103. }
  104. //左转
  105. void turn_left()
  106. {
  107.    uint i;
  108.   for(i=speed;i>0;i=i-5)
  109.   {
  110.      if(i>10)
  111.          {
  112.        motor1=1;
  113.        motor2=0;

  114.        motor3=1;
  115.        motor4=0;
  116.           }
  117.            if(i<11)
  118.           {
  119.        motor1=0;
  120.        motor2=0;

  121.        motor3=0;
  122.        motor4=0;
  123.           }
  124.   }

  125. }
  126. //右转
  127. void turn_right()
  128. {
  129.    uint i;
  130.   for(i=speed;i>0;i=i-5)
  131.   {
  132.      if(i>10)
  133.          {
  134.        motor1=0;
  135.        motor2=1;

  136.        motor3=0;
  137.        motor4=1;
  138.           }
  139.            if(i<11)
  140.           {
  141.        motor1=0;
  142.        motor2=0;

  143.        motor3=0;
  144.        motor4=0;
  145.           }
  146.   }

  147. }
  148. //按键控制
  149. void keyscan()
  150. {
  151.   //加速
  152.   if(key1==0)                                          
  153.     {
  154.       delay(10);
  155.      if(key1==0)
  156.           {
  157.                   
  158.                   count=1;
  159.                      while(!key1);//等待按键释放
  160.           }
  161.         }
  162. //左转
  163.   if(key2==0)                                          
  164.     {
  165.        delay(10);
  166.      if(key2==0)
  167.           {
  168.                   
  169.                  num=3;
  170.                      while(!key2);//等待按键释放
  171.           }
  172.         }
  173. //前进
  174.   if(key3==0)                                          
  175.     {
  176.        delay(10);
  177.      if(key3==0)
  178.           {
  179.                   
  180.                   num=1;
  181.                      while(!key3);//等待按键释放
  182.           }
  183.         }
  184. //停止
  185.   if(key4==0)                                          
  186.     {
  187.        delay(10);
  188.      if(key4==0)
  189.           {
  190.                   
  191.                   num=0;
  192.                      while(!key4);//等待按键释放
  193.           }
  194.         }
  195. //后退
  196.   if(key5==0)                                          
  197.     {
  198.        delay(10);
  199.      if(key5==0)
  200.           {
  201.                   
  202.                    num=2;
  203.                      while(!key5);//等待按键释放
  204.           }
  205.         }
  206. //减速
  207.   if(key6==0)                                          
  208.     {
  209.        delay(10);
  210.      if(key6==0)
  211.           {
  212.                   
  213.                    count=2;
  214.                      while(!key6);//等待按键释放
  215.           }
  216.         }
  217. //右转
  218.   if(key7==0)                                          
  219.     {
  220.        delay(10);
  221.      if(key7==0)
  222.           {
  223.                    num=4;
  224.                      while(!key7);//等待按键释放
  225.           }
  226.         }

  227. }
  228. //主函数
  229. void main(void)
  230. {        
  231.   IT0 = 1;
  232.   EX0 = 1;
  233.   EA  = 1;

  234.   while(1)
  235.   {
  236.         display();
  237.         keyscan();
  238.            switch(num)
  239.         {
  240.           case 0: stop(); break;//暂停
  241.           case 1: go(); break;//前进
  242.           case 2: back(); break; //后退
  243.           case 3: turn_left(); break;// 左转
  244.           case 4: turn_right(); break; // 右转
  245.        
  246.         }
  247.         if((count==1)&&(speed<410)){speed=speed+100;count=0;}        //加速
  248.         if((count==2)&&(speed>110)){speed=speed-100;count=0;}//减速
  249.   }
  250. }



  251. /********************** 外部中断函数************************/
  252. void exint0() interrupt 0
  253. {          
  254.    uint cnt;
  255.    uchar i;

  256.    EX0 = 0;
  257.    cnt = 0;       
  258.        
  259. ……………………

  260. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载,仿真必须要Proteus7.5版本才能打开:
红外遥控车 独立按键.zip (191.29 KB, 下载次数: 121)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:27161 发表于 2021-5-14 13:09 | 只看该作者
请教这个发射线路程序如何移植到STC15F104W上去运行?我只需要简单的1到4按键按下发射对应的键码就可以,网上所有的发射程序我试了都可以在AT89和stc89系列上运行,但在STC15F100系列上郡运行不了,对C不太懂,只会看简单的程序。正在学习中。
回复

使用道具 举报

板凳
ID:905775 发表于 2021-5-20 16:11 来自手机 | 只看该作者
完全不用定时器中断能做出来这个吗
回复

使用道具 举报

地板
ID:1044977 发表于 2022-9-18 01:12 来自手机 | 只看该作者
楼主把这个做出来需要什么零件呢,有没有清单什么的
回复

使用道具 举报

5#
ID:1075299 发表于 2023-5-4 19:10 来自手机 | 只看该作者
楼主,为什么我用的时候两个电机同时动的。还有左边遥控器用了没反应的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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