找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC98C52单片机制作的蓝牙智能小车源码

[复制链接]
跳转到指定楼层
楼主
ID:312835 发表于 2018-4-24 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
支持功能,指示灯指示方向,车灯开启关闭,喇叭

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define ulong unsigned long
  6. sbit led1=P1^0;     //车灯
  7. sbit led2=P1^1;     //车灯
  8. sbit go_led= P1^2; //前进指示灯
  9. sbit back_led = P1^3;         //后退指示灯
  10. sbit right_led = P1^4;         //右转指示灯
  11. sbit left_led = P1^5;         //左转指示灯
  12. sbit beep=P1^6;                        //        喇叭
  13. sbit IN1=P3^5;      //电机逻辑1           //红外线控制时的引脚sbit IN1=P3^0;   
  14. sbit IN2=P3^4;      //电机逻辑2           //红外线控制时的引脚sbit IN2=P3^1;
  15. sbit IN3=P3^3;      //电机逻辑3           //红外线控制时的引脚sbit IN3=P3^2;   
  16. sbit IN4=P3^2;      //电机逻辑4           //红外线控制时的引脚sbit IN4=P3^4;   
  17. sbit ENA=P3^7;            //ENA
  18. sbit ENB=P3^6;            //ENB
  19. uchar code ona[]={0x41};  //上 被按下       
  20. uchar code onb[]={0x42};         //下 被按下       
  21. uchar code onc[]={0x43};        //左 被按下       
  22. uchar code ond[]={0x44};        //右 被按下       
  23. uchar code onf[]={0x46};  //按键被松开
  24. uint n,timex,PWM_T=0;          //T(单位秒S)/((1/SYSCLK)*12)                T=需要定时的时间比如10ms=0.01,SYSCLK是晶振频率,如32.768MHZ; 0.01/((1/32768000)*12)=27306=6AAAH
  25. uchar cpu_counter=0,cpu_counter2=0;num=0;
  26. void system_init();
  27. void baojing_sound(void);
  28. void car_liang();
  29. void car_mei();
  30. void car_go();
  31. void car_back();                          
  32. void car_stop();         
  33. void car_turn_left();                  
  34. void car_turn_right();
  35. void getkey();
  36. void delay(uint tt);
  37. void delay1MS(void);
  38. void delay5000us(void);
  39. void delay10ms(void);
  40. void delay1000us(void);
  41. void main()
  42. {   
  43.                                                                                                
  44.                      
  45.                                                                                        
  46.         system_init();           //串口初始化   
  47.         while(1)  
  48.         {
  49.         getkey();
  50. }
  51. }                                            
  52. void getkey()
  53. {       
  54.          switch(num)
  55.          {
  56.                  
  57.          case '2' : delay10ms();baojing_sound();delay10ms();break;           
  58.          case '4' : car_liang();break;                                                   
  59.          case '5' : car_mei();break;
  60.    case '8' : delay10ms();PWM_T+=5;delay10ms();delay10ms();beep=0;delay10ms();delay10ms();beep=1;delay10ms();delay10ms();if(PWM_T==10){beep=0;delay10ms();beep=1;delay10ms();beep=0;delay10ms();beep=1;delay10ms();}if(PWM_T>10){PWM_T=0;} ;break;
  61.          default: break;
  62.         }          
  63.                  if(num==onf[0])                //        方向键松手检测        可使用体感控制,缺点电机停止稍欠缺。
  64. {

  65.                         delay10ms();
  66.                                 car_stop();
  67.          
  68. }
  69.                        
  70.                         if(num==ona[0])
  71.         {
  72.                         delay10ms();
  73.                                         car_go();
  74. }

  75.        
  76. if(num==onb[0])
  77. {
  78.         delay10ms();                                                                         
  79.         car_back();
  80. }                  
  81. if(num==onc[0])
  82. {
  83.                        
  84.          delay10ms();
  85.          car_turn_left();
  86. }
  87.         if(num==ond[0])
  88. {
  89.          delay10ms();
  90.                  car_turn_right();
  91. }                                      
  92. }                          
  93. void baojing_sound(void)
  94. {
  95.          ulong n_time;
  96.          uchar nnm;
  97.         for(n_time=0;n_time<3000;n_time++) //输出一个频率的声音         改动此数值 可修改声音频率高低
  98.         {
  99.         for(nnm=0;nnm<200;nnm++); //延时                        修改此数值可修改音调
  100.         beep=~beep; //取反输出到喇叭的信号
  101.         }
  102.        
  103.         for(n_time=0;n_time<2000;n_time++) //输出另一个频率的声音
  104.         {
  105.         for(nnm=0;nnm<210;nnm++); //延时
  106.         beep=~beep; //取反输出到喇叭的信号
  107.    }
  108. }
  109. void system_init()        //系统定时器和串口初始化
  110. {  

  111.             TMOD = 0x21;  
  112.             SCON = 0x50;      //特殊功能寄存器   SM0 SM1  SM2  REN   TB8  RB8  TI   RI 自动置1软件清零
  113.             
  114.                                   //方式 0x50         0   1   0     1     0    0    0    0 (默认)          
  115.                 TH0 = 0x0FE;          //546us
  116.         TL0 = 0x09;           
  117.         TH1 = 0xFD;
  118.         TL1 = TH1;//11.0592MHZ 9600bps
  119.                 ET0=1;       
  120.                 TR0=1;
  121.             TR1=1;                     //定时器1关闭                                         已验证
  122.             ES=1;                     //串口1中断允许位
  123.             EA = 1;           //开总中断                  
  124.                
  125. }
  126. void timer0() interrupt 1                    //  1ms
  127. {       
  128.           
  129.          static int aag;
  130.                  aag++;                  

  131.                           TH0 = 0x0FE;          //546us
  132.         TL0 = 0x09;                             
  133.                          if(aag==12)                 //PWM_T振幅大小值 //PWM比较值
  134.                                 {
  135.                                         aag=0;                                                                                                           
  136.                                   ENA=1;             //PWM调制电机驱动板第1路使能端打开
  137.                                         ENB=1;                         //PWM调制电机驱动板第1路使能端打开
  138.                                 }
  139.                                 if(PWM_T == aag)
  140.                                 {               
  141.                                         ENA=0;                  //PWM调制电机驱动板第1路使能端关闭
  142.                                         ENB=0;                  //PWM调制电机驱动板第1路使能端关闭
  143.                                  }       
  144. }
  145. void interrupt_uart() interrupt 4 //using1切换寄存器组到1,进入中断就要判断是发送中断TI,还是接收中断RI。
  146. {
  147.    
  148.     if(TI)  //判断是否为发送端TI中断,中断结束之后,只需发送端清零,表示发送完成。
  149.    {
  150.      TI = 0;

  151.      REN = 1;  // ******允许接收数据。 ********

  152.    }         
  153.    if(RI) //判断是否为接收端RI中断,中断结束之后,只需接收端清零,表示接收完成。
  154.   {
  155.        RI = 0; //只要数据接收端清零,就可以取出数据。
  156.    
  157.            num = SBUF;         //SBUF取数据
  158.                     
  159.            SBUF = num;         //*******把数据num从SBUF送出去。************
  160.            REN = 0;        //严谨的写法,发送数据的时候禁止接收数据。
  161.   }
  162.   
  163.    //发送的时候不接收数据 ,发送完了再接收数据。  
  164. }
  165.   void car_liang(void)
  166. {
  167.         led1=0;led2=0;
  168.   
  169. }
  170.   void car_mei(void)
  171. {
  172.         led1=1;led2=1;
  173. }      

  174.       void car_go()                                       
  175.                   
  176.                        
  177.                 {
  178.                     delay5000us();
  179.                         IN1=0;                  //+
  180.                         IN2=1;                  //-
  181.                         IN3=1;                  //-
  182.                         IN4=0;                  //+
  183.                         go_led= 1; //前进指示灯
  184.       back_led =0;         //后退指示灯
  185.       right_led =0;         //右转指示灯
  186.       left_led = 0;         //左转指示灯
  187.                         delay5000us();  //5ms
  188.                 }
  189.           
  190.                 void car_back()
  191.                 {  
  192.                     delay5000us();
  193.                         IN1=1;                  //+
  194.                         IN2=0;                  //-
  195.                         IN3=0;                  //-
  196.                         IN4=1;                  //+       
  197.                         go_led= 0; //前进指示灯
  198.       back_led =1;         //后退指示灯
  199.       right_led =0;         //右转指示灯
  200.       left_led = 0;         //左转指示灯
  201.                         delay5000us();
  202.                 }
  203.                 void car_turn_left()
  204.                 {   
  205.                     delay5000us();
  206.                         IN1=0;                  //+
  207.                         IN2=1;                  //-
  208.                         IN3=0;                  //-
  209.                         IN4=1;                  //+
  210.                         go_led= 0; //前进指示灯
  211.       back_led =0;         //后退指示灯
  212.       right_led =0;         //右转指示灯
  213.       left_led = 1;         //左转指示灯
  214.                     delay5000us();
  215.                 }
  216.                 void car_turn_right()
  217.                 {       
  218.                     delay5000us();
  219.                         IN1=1;                  //+
  220.                         IN2=0;                  //-
  221.                         IN3=1;                  //-
  222.                         IN4=0;                  //+       
  223.                         go_led= 0; //前进指示灯
  224.       back_led =0;         //后退指示灯
  225.       right_led =1;         //右转指示灯
  226.       left_led = 0;         //左转指示灯
  227.                     delay5000us();
  228.                 }
  229.                 void car_stop()               
  230.                 {
  231.                         delay5000us();
  232.                         IN1=0;                  //+         
  233.                         IN2=0;                  //-         
  234.                         IN3=0;                  //-         
  235.                         IN4=0;                  //+         
  236.                     delay5000us();
  237.                 }

  238.    void delay10ms(void)   //误差 0us
  239. {
  240.   unsigned char ad,bd;
  241.     for(bd=249;bd>0;bd--)
  242.         for(ad=17;ad>0;ad--);
  243. }
  244. void delay5000us(void)   //误差 0us
  245. {
  246.     unsigned char af,bf;
  247.     for(bf=15;bf>0;bf--)
  248.         for(af=152;af>0;af--);
  249. }       
复制代码

所有资料51hei提供下载:
蓝牙小车源程序.7z (20.3 KB, 下载次数: 20)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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