找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4847|回复: 2
收起左侧

简单89C52单片机控制小车 可寻迹测速避障 PWM控速源码

[复制链接]
ID:197874 发表于 2017-8-10 14:29 | 显示全部楼层 |阅读模式
   实现智能小车的红外避障、循迹、测速控速和1602显示的功能,
直接上程序了
图片1.png

单片机源程序:
  1. #include <reg52.h>
  2. #include <intrins.h>     
  3. #define uint unsigned int        
  4. #define uchar unsigned char      
  5. void delayXms(uint );   
  6. void delay1ms(void);   
  7. void PWM(void);     
  8. uint i,m,n,z;
  9. uint  h=5, l=5;
  10. uchar bai1,shi1,ge1,bai2,shi2,ge2,bai3,shi3,ge3;
  11. long int s,s1,s2,M1,M2,f;
  12. sbit deng=P3^7;
  13. sbit fen=P2^7;
  14. sbit zuo=P2^0;
  15. sbit jia=P3^7;
  16. sbit you=P2^1;
  17. sbit bi=P2^2;
  18. sbit Zbi=P2^3;
  19. sbit Ybi=P2^4;
  20. sbit pwm1 = P1^6;
  21. sbit pwm2 = P1^7;
  22. sbit IN1 = P1^2;
  23. sbit IN2 = P1^3;
  24. sbit IN3 = P1^4;
  25. sbit IN4 = P1^5;
  26. sbit RS=P1^0;                                
  27. sbit RW=P1^1;        
  28. sbit E =P2^5;        
  29. uchar dis1[]={"Fr:  Hz PWM:   %"};
  30. uchar dis2[]={"Speed:   mm/s"};
  31. void forward()
  32. {
  33.         IN1 = 0;
  34.         IN2 = 1;
  35.         IN3        = 0;
  36.         IN4 = 1;
  37. }
  38. void go()        
  39. {
  40.   pwm1 = 1;
  41.   pwm2 = 1;
  42. }
  43. void stop()         
  44. {
  45.   pwm1 = 0;
  46.   pwm2 = 0;
  47. }
  48. void PWM(void)   
  49. {  go();
  50.    delayXms(h);
  51.    stop();
  52.    delayXms(l);
  53. }
  54. void delayXms(uint ms)
  55. {
  56.         uint k;
  57.         for(k=0;k<ms;k++)
  58.           {delay1ms();}
  59. }
  60. void delayms(uint xms)
  61. {
  62.         uint i,j;
  63.         for(i=xms;i>0;i++)
  64.           for(j=200;j>0;j--);
  65. }
  66. void delay1ms(void)
  67. {
  68.     uint j;
  69.     for(j=0;j<=120;j++)
  70.       {_nop_();}
  71. }
  72. uchar lcd_busy()
  73. {
  74.         bit result;
  75.         RS=0;
  76.         RW=1;
  77.         E=1;
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         _nop_();
  82.         result = (bit)(P0&0x80);
  83.         E=0;
  84.         return result;
  85. }
  86. void lcd_wcmd(uchar cmd)   
  87. {
  88.         while(lcd_busy());
  89.         RS=0;
  90.         RW=0;
  91.         E=0;
  92.         _nop_();
  93.         _nop_();
  94.         P0=cmd;
  95.         _nop_();
  96.         _nop_();
  97.         _nop_();
  98.         _nop_();
  99.         E=1;
  100.         _nop_();
  101.         _nop_();
  102.         _nop_();
  103.         _nop_();
  104.         E=0;               
  105. }

  106. void lcd_pos(uchar pos)         
  107. {
  108.         lcd_wcmd(pos|0x80);
  109. }
  110. void lcd_wdat(uchar dat)               
  111. {
  112.         while(lcd_busy());
  113.         RS=1;
  114.         RW=0;
  115.         E=0;
  116.         P0=dat;
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         E=1;
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         _nop_();
  126.         E=0;        
  127. }
  128. void LcdInit()                /*LCD1602初始化函数*/
  129. {
  130.         delayXms(12);
  131.         lcd_wcmd(0x38);
  132.         delayXms(4);
  133.         lcd_wcmd(0x38);        
  134.         delayXms(4);
  135.         lcd_wcmd(0x38);
  136.         delayXms(4);
  137.         lcd_wcmd(0x0c);
  138.         delayXms(4);
  139.         lcd_wcmd(0x06);
  140.         delayXms(4);
  141.         lcd_wcmd(0x01);
  142.         delayXms(4);        
  143. }
  144. /*******************定时器1初使化函数**********************/
  145. void T1_Init()
  146. {
  147.         TMOD = 0x10;         
  148.         ET1=1;                        
  149.         EA=1;            //打开总中断
  150.         IP=0x04;          //设置中断优先级
  151.         TH1 = (65535-50000)/256;        //初使加载50毫秒
  152.         TL1 = (65535-50000)%256;
  153. }
  154. /*******************外部中断初使化函数***********************/
  155. void INT_Init()
  156. {
  157.         IT0 = 1;                                //设置外部中断0为下降沿触发
  158. //        IT1 = 1;                         //设置外部中断1为下降沿触发
  159.         EX0 = 1;                          //开外部中断0
  160. //        EX1 = 1;                        //开外部中断1
  161.         EA = 1;                                //开总中断
  162. }
  163. /********************外部中断函数**************************/
  164. void my_INT0(void) interrupt 0
  165. {
  166.         M1=M1++;                        
  167. }
  168. //void my_INT1(void) interrupt 2
  169. //{
  170. //        M2=M2++;         
  171. //}
  172. /******************定时器1中断函数*************************/
  173. void timer1() interrupt 3
  174. {   TR1=0;            
  175.         TH1 = (65535-50000)/256;  
  176.         TL1 = (65535-50000)%256;  
  177.         n=n+1;                              
  178.         if(n==20)                                          
  179.         {   
  180.         f=M1;   
  181.                 shi1=(f/10)+48;      
  182.                 ge1=(f%10)+48;      

  183.                 z=100*h/(h+l);        
  184.                 bai2=(z/100)+48;      
  185.                 shi2=(z%100/10)+48;   
  186.                 ge2=(z%100%10)+48;   

  187.                 s1=M1/100.00*3.14*65;        
  188.             //s2=M2/100.00*3.14*65;
  189.                 s=s1;           
  190.                 bai3=(s/100)+48;                    
  191.                 shi3=(s%100/10)+48;                 
  192.                 ge3=(s%100%10)+48;         
  193.                 n=0;                  
  194.                 s1=0;                 
  195.         //        s2=0;                  
  196.                 M1=0;               
  197.         //        M2=0;                  
  198.         }
  199.          TR1=1;                    //启动T1
  200. }
  201. void xunji()
  202. {
  203.                  if(zuo==0&&you==0&&bi==1&&Zbi==1&&Ybi==1)                          //zhizou
  204.         {
  205.                   go();
  206.    delayXms(h);
  207.    stop();
  208.    delayXms(l);
  209.    deng=0;
  210.    fen=0;
  211.         }
  212.         if(zuo==1&&you==1&&bi==1&&Zbi==1&&Ybi==1)                                   //tingzhi
  213.         {
  214.                   pwm1 = 0;
  215.   pwm2 = 0;
  216.   fen=0;
  217.   deng=0;
  218.         }
  219.         else if(zuo==1&&you==0&&bi==1&&Zbi==1&&Ybi==1)                                           //zuozhuan
  220.         {
  221.            pwm1=1;
  222.     pwm2 = 0;
  223.         deng=0;
  224.         fen=1;
  225.         }
  226.         else if(zuo==0&&you==1&&bi==1&&Zbi==1&&Ybi==1)                                                        //youzhuan
  227.         {
  228.           pwm2=1;
  229. delayXms(1);
  230. pwm2=0;
  231.    delayXms(0);
  232.     pwm1 = 0;
  233.         deng=0;
  234.         fen=1;
  235.         }
  236.         else if(bi==0&&Zbi==0&&Ybi==0&&zuo==0&&you==0)                                                                                          //zhongbi ting
  237.                 {                                                  
  238.                   pwm1 = 0;
  239.   pwm2 = 0;
  240.   deng=1;
  241.   fen=1;
  242.         }
  243.          else if(Zbi==0&&bi==0)
  244.                          {
  245.           pwm2=1;
  246. delayXms(h);
  247. pwm2=0;
  248.    delayXms(l);
  249.     pwm1 = 0;
  250.         deng=1;
  251.         fen=0;
  252.         }
  253.         else if(Ybi==0&&bi==0)
  254.                 {
  255.            pwm1=1;
  256. delayXms(h);
  257. pwm1=0;
  258.    delayXms(l);
  259.     pwm2 = 0;
  260.         deng=1;
  261.         fen=0;
  262.         }
  263.                 else if(Ybi==0&&bi==1&&Zbi==1)
  264.                 {
  265.              pwm1=1;
  266. delayXms(h);
  267. pwm1=0;
  268.    delayXms(l);
  269.     pwm2 = 0;
  270.         deng=1;
  271.         fen=0;
  272.         }
  273.         else if(Zbi==0&&bi==1&&Ybi==1)
  274.                          {
  275.           pwm2=1;
  276. delayXms(h);
  277. pwm2=0;
  278.    delayXms(l);
  279.     pwm1 = 0;
  280.         deng=1;
  281.         fen=0;
  282.         }
  283. }

  284. void main()
  285. {  
  286.         T1_Init();                 
  287.         INT_Init();            
  288.         LcdInit();                  
  289.         TR1=1;                                      
  290.         lcd_pos(0x00);
  291.         i=0;                                                                  
  292.         while(dis1[ i] != '\0')           //1602液晶显示器第一行初使化显示
  293.         {
  294.                 lcd_wdat(dis1[ i]);
  295.                 i++;
  296.         };
  297.         i=0;
  298.         lcd_pos(0x41);
  299.         while(dis2 != '\0')                     //1602液晶显示器第二行初使化显示
  300.         {
  301.                 lcd_wdat(dis2);
  302.                 i++;        
  303.         };
  304.         while(1)               
  305.         {   
  306.             forward();
  307.         xunji();
  308.             lcd_pos(0x03);            
  309.             lcd_wdat(shi1);           
  310.         lcd_pos(0x04);            
  311.                 lcd_wdat(ge1);               
  312.                 lcd_pos(0x0c);                     
  313.                 lcd_wdat(bai2);         
  314.     lcd_pos(0x0d);            
  315.            lcd_wdat(shi2);         
  316.                 lcd_pos(0x0e);         
  317.         lcd_wdat(ge2);                                          
  318.                 lcd_pos(0x47);                             
  319.                 lcd_wdat(bai3);         
  320.                 lcd_pos(0x48);           
  321.                 lcd_wdat(shi3);                    
  322.                 lcd_pos(0x49);                     
  323.                 lcd_wdat(ge3);                                                                        
  324.     }
  325. }  
复制代码


评分

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

查看全部评分

回复

使用道具 举报

ID:184592 发表于 2017-9-4 11:03 | 显示全部楼层
感谢楼主的分享~
回复

使用道具 举报

ID:242298 发表于 2019-11-24 15:38 | 显示全部楼层
求电路图啊@@@@@嘻嘻嘻谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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