找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2523|回复: 1
收起左侧

基于51单片机使用gt38做的一套遥控动力船Proteus仿真程序

[复制链接]
ID:693204 发表于 2020-2-14 15:35 | 显示全部楼层 |阅读模式
51单片机做控制芯片,控制电机转速
GT38无线串口作为通信控制
自制控制板,控制电机正反转
整合作为遥控船的动力控制系统

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include <reg52.h>                       
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define lint long int
  6. sfr WDT_CONTR=0xe1;                       
  7. lint PWM_COUNT1;   
  8. lint PWM_COUNT2;   
  9. lint HUXI_COUNT1;   
  10. lint HUXI_COUNT2;   
  11. lint PWM_VLAUE1;   
  12. lint PWM_VLAUE2;   
  13. lint COUNTB;              
  14. bit direc_flag1;            
  15. bit direc_flag2;
  16. sbit open=P1^0;                               
  17. sbit stop=P1^1;                               
  18. sbit speed=P1^2;               
  19. sbit slow=P1^3;       
  20. sbit d1=P1^0;                               
  21. sbit d2=P1^1;                               
  22. uint flag,A;                          
  23. float sudu,pysd;            
  24. /********************************************************************/
  25. void timer0()               
  26. {
  27.     TMOD=0x02;
  28.     TH0=0x38;   
  29.     TL0=0X38;                                                                               
  30.     TR0=1;                  
  31.     ET0=1;                  
  32.         WDT_CONTR=0x35;                       
  33. }
  34. void timer1()                          
  35. {       
  36.         TMOD=0x20;         
  37.     TH1=0xfd;               
  38.     TL1=0Xfd;                       
  39.     TR1=1;                  
  40.         SM0=0;                               
  41.         SM1=1;
  42.         REN=1;            
  43. }
  44. void delay(uchar z)                                       
  45. {
  46.         uchar x,y;
  47.         for(x=z;x>0;x--)
  48.         for(y=110;y>0;y--);
  49. }
  50. void Delay2500ms()               
  51. {
  52.         unsigned char i, j, k;


  53.         i = 114;
  54.         j = 255;
  55.         k = 107;
  56.         do
  57.         {
  58.                 do
  59.                 {
  60.                         while (--k);
  61.                 } while (--j);
  62.         } while (--i);
  63. }
  64. /*********************************************************************/
  65. void init()        
  66. {
  67.         EA=0;
  68.         ES=1;                               
  69.         HUXI_COUNT1 = 0;
  70.         HUXI_COUNT2 = 0;
  71.     PWM_COUNT1 = 0;
  72.         PWM_COUNT2 = 0;
  73.        
  74.     PWM_VLAUE1 = 1000;                         
  75.         PWM_VLAUE2 = 1000;
  76.     direc_flag1 = 0;
  77.         direc_flag2 = 0;
  78.         WDT_CONTR=0x35;                       
  79. }
  80. /**********************************************************************/
  81. /*                  
  82. key2=P3^4;                               
  83. key3=P3^5;                               
  84. key4=P3^6;                               
  85. key5=P3^7;                               
  86. */
  87. void control()
  88. {
  89. if(open==0)
  90. {
  91.         delay(5);
  92.         if(open==0)
  93.         {                 
  94.         EA=1;        
  95.         }
  96.         while(!open);                       
  97.         delay(1);                          
  98.         while(!open);
  99. }

  100. if(stop==0)
  101. {
  102.         delay(5);
  103.         if(stop==0)
  104.         { WDT_CONTR=0x35;                       
  105.          EA=0;      
  106.          d1=0;
  107.          d2=0;
  108.         }
  109.         while(!stop);                         
  110.         delay(1);                          
  111.         while(!stop);
  112. }

  113. if(speed==0)                               
  114. {
  115.         delay(5);
  116.         if(speed==0)
  117.         {if(PWM_VLAUE1>0)                                       
  118.         PWM_VLAUE1=PWM_VLAUE1-50;
  119.         else
  120.         PWM_VLAUE1=0;

  121.         if(PWM_VLAUE2>0)
  122.         PWM_VLAUE2=PWM_VLAUE2-100;
  123.         else
  124.         PWM_VLAUE2=0;
  125.         }
  126.         while(!speed);               
  127.         delay(1);                          
  128.         while(!speed);
  129. }

  130. if(slow==0)                                                       
  131. {
  132.         delay(5);
  133.         if(slow==0)
  134.         {if(PWM_VLAUE1<1000)                               
  135.         PWM_VLAUE1=PWM_VLAUE1+50;
  136.         else
  137.         PWM_VLAUE1=1000;

  138.         if(PWM_VLAUE2<1000)
  139.         PWM_VLAUE2=PWM_VLAUE2+100;
  140.         else
  141.         PWM_VLAUE2=1000;
  142.         }
  143.         while(!slow);                       
  144.         delay(1);                          
  145.         while(!slow);
  146. }
  147. }
  148. /***************sudu,pysu*****************/
  149. void counter()               
  150. {        int r=2;                                                                                                       
  151.         float sudu,f1,f2,*c,*m,pysd;        
  152.         f1=1-PWM_VLAUE1/1000;
  153.         f2=1-PWM_VLAUE2/1000;
  154.         sudu=f1*60/r;
  155.         pysd=f2*60/r;
  156.         c=&sudu;   
  157.         m=&pysd;
  158. }
  159. /***************???????*******************/
  160. void gt38()
  161. {        float *c,*m;
  162. if(flag==1)
  163.         {        ES=0;
  164.                 flag=0;
  165.                 SBUF=*c;
  166.                 while(!TI);
  167.                 TI=0;
  168.                 ES=1;
  169.                 SBUF='a';
  170.                 while(!TI);
  171.                 TI=0;
  172.                 ES=1;
  173.                 SBUF='n';
  174.                 while(!TI);
  175.                 TI=0;
  176.                 ES=1;
  177.                 while(!TI);
  178.                 TI=0;
  179.                 ES=1;
  180.                 SBUF='d';
  181.                 while(!TI);
  182.                 TI=0;
  183.                 ES=1;
  184.                 SBUF=*m;
  185.                 while(!TI);
  186.                 TI=0;
  187.                 ES=1;
  188.                 WDT_CONTR=0x35;                       
  189.         }
  190. }
  191. /*********************************************/
  192. /***************************************************/
  193. void main()
  194. {       
  195.         init();
  196.         timer0();
  197.         timer1();
  198.         while(1)
  199. {
  200. control();
  201. counter();
  202. gt38();                  
  203. WDT_CONTR=0x35;                       
  204. }
  205. }
  206. /***********************************************************************/
  207. void time0()interrupt 1                         
  208. {       
  209.         PWM_COUNT1++;
  210.     HUXI_COUNT1++;
  211.     if(PWM_COUNT1 == PWM_VLAUE1)      
  212.                   d1=1;                                                       
  213.     if(PWM_COUNT1 == 1000)            
  214.     {
  215.         d1=0;                    
  216.         PWM_COUNT1 = 0;            
  217.     }
  218.                         if((HUXI_COUNT1==5000) && (direc_flag1 == 0))       
  219.                     {                              
  220.                         HUXI_COUNT1=0;
  221.                         PWM_VLAUE1=PWM_VLAUE1-100;
  222.                                 while(PWM_VLAUE1==500)                                                                                                                //**********************************************//
  223.                    {direc_flag1=1;}            
  224.                     }

  225.         PWM_COUNT2++;
  226.     HUXI_COUNT2++;
  227.     if(PWM_COUNT2 == PWM_VLAUE2)     
  228.                   d1=1;                                               
  229.     if(PWM_COUNT2 == 1000)            
  230.     {
  231.         d1=0;                    
  232.         PWM_COUNT2 = 0;         
  233.     }
  234.         if((HUXI_COUNT2==5000) && (direc_flag2 == 0))          
  235.                     {                              
  236.                         HUXI_COUNT2=0;
  237.                         PWM_VLAUE2=PWM_VLAUE2-200;
  238.                                 while(PWM_VLAUE1==400)                                                                                                                  //********************************************//
  239.                    {direc_flag2=1;}            
  240.                     }
  241. }
  242. /*********************************************/
  243. void es() interrupt 4                               
  244. {       
  245.         RI=0;
  246.         scanf("%s=SBUF","Hi Tom date");
  247.         flag=1;                                                                                                       
  248. }
复制代码

所有资料51hei提供下载:
代码.rar (503.33 KB, 下载次数: 20)

评分

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

查看全部评分

回复

使用道具 举报

ID:89217 发表于 2020-2-22 22:43 | 显示全部楼层

好东西,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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