找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于8051单片机的循迹小车 带测速程序

[复制链接]
跳转到指定楼层
楼主
基于8051单片机的循迹小车


单片机源程序如下:
  1. /*
  2.   !!!!!!!!!
  3.   1.
  4.   使用PWM波写驱动程序时,切记PWM波的周期不要太短
  5. (20ms左右应该是可以的!!此程序就是因为pwm波周期太短,烧坏4个驱动,8个电机,多么痛的领悟~~)
  6.   2.
  7.   因为当时考虑用到超声速壁障,蜂鸣器,红外测速,液晶等多个外设,需要使用多个中断,单个单片机资源不足,
  8.   所以此写了两个程序分别写入两个单片机,如果只是使用测速,液晶的话应该可以用中断嵌套的方法写入一个单片机即可。
  9.   !!!!!!!!!

  10. */
  11. #include <reg52.h>
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. uchar b=0xf;
  15. static uint delay=0;//定义接收红外数据变量
  16. static uchar m=0;
  17. //static uint time=1;
  18. uchar signal;
  19. uchar i=0;
  20. uchar persent_l=100;                       
  21. uchar persent_hl=100;
  22. uchar persent_r=100;
  23. uchar persent_hr=100;
  24. sbit left=P1^3;                                          //定义前方左侧1红外探头
  25. sbit Left_zhong=P1^2;                                    //定义前主左侧2红外探头
  26. sbit right=P1^0;                                         //定义右方1红外探头
  27. sbit right_zhong=P1^1;                                   //定义右方2红外探头
  28. sbit pwm_l=P1^1;                                         //定义电机l正向端口
  29. sbit pwm_hl=P1^2;                                        //定义电机l反向端口
  30. sbit pwm_r=P1^4;                                         //定义电机r正向端口
  31. sbit pwm_hr=P1^5;                                        //定义电机r反向端口
  32. sbit ENA=P1^3;
  33. sbit ENB=P1^0;

  34. void delay1(uchar z)
  35. {
  36.         uchar i,j;
  37.         for(i=0;i<=100;i++)
  38.                 for(j=0;j<=z;j++);

  39. }

  40. /*uchar signal()
  41. {
  42.         uchar temp=0x0f;
  43.         temp&=P0;
  44.         return temp;
  45. }*/


  46. void time0_init()
  47. {
  48.         EA=1;
  49.         TH0=(65536-200)/256;
  50.         TL0=(65536-200)%256;
  51.   TMOD=1;
  52.         ET0=1;
  53.         TR0=1;
  54. }

  55. void time0() interrupt 1    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
  56. {
  57. static uchar time=1;
  58.         EA=0;                                                         
  59.         TH0=(65536-200)/256;                                             
  60.         TL0=(65536-200)%256;        //0.2ms
  61.     if(time<10)
  62.         {
  63.             if(time<persent_l)
  64.                 {pwm_l=1;pwm_hl=0;}
  65.             else pwm_l=0;      
  66.                 if(time<persent_r)
  67.                 {pwm_r=1;pwm_hr=1;}
  68.                 else pwm_r=0;
  69.                 if(time<persent_hl)
  70.             {pwm_hl=1;pwm_l=0;}
  71.                 else pwm_hl=0;
  72.                 if(time<persent_hr)
  73.                 {pwm_hr=1;pwm_r=0;}
  74.                 else pwm_hr=0;
  75.                 time++;
  76.         }
  77.         else
  78.         {m++;time=1;if(m==5){delay++;m=0;}}                  //每2ms m加1 每0.01s delay++;
  79.         EA=1;
  80. }

  81. void forward(uchar a)
  82. {
  83.         /*pwm_l=0;
  84.         pwm_r=0;
  85.         pwm_hl=0;
  86.         pwm_hr=0;*/
  87.         persent_l=11;
  88.         persent_r=11;
  89.         persent_hl=0;
  90.         persent_hr=0;       
  91.         while(delay<=a);       
  92.         delay=0;
  93. }

  94. void dun_l(uchar a)
  95. {
  96.         /*pwm_l=1;
  97.         pwm_r=1;
  98.         pwm_hl=0;
  99.         pwm_hr=0;*/
  100.         persent_l=0;
  101.         persent_r=9;       
  102.         persent_hl=0;
  103.         persent_hr=0;
  104.         while(delay<=a);
  105.         delay=0;
  106. }


  107. void dun_r(uchar a)
  108. {
  109. /*        pwm_l=1;
  110.         pwm_r=1;
  111.         pwm_hl=0;
  112.         pwm_hr=0;
  113. */        persent_l=9;
  114.         persent_r=0;       
  115.         persent_hl=0;
  116.         persent_hr=0;
  117.         while(delay<=a);
  118.         delay=0;
  119. }

  120. void zhi_l(uchar a)
  121. {
  122. /*        pwm_l=1;
  123.         pwm_r=1;
  124.         pwm_hl=0;
  125.         pwm_hr=0;
  126. */        persent_l=0;
  127.         persent_hl=4;
  128.         persent_r=8;
  129.         persent_hl=0;
  130.         while(delay<=a);
  131.         delay=0;
  132. }


  133. void zhi_r(uchar a)
  134. {
  135. /*        pwm_l=1;
  136.         pwm_r=1;
  137.         pwm_hl=0;
  138.         pwm_hr=0;
  139. */        persent_l=8;
  140.         persent_hl=0;
  141.     persent_r=0;
  142.         persent_hr=4;
  143.         while(delay<=a);
  144.         delay=0;
  145. }

  146. void rui_l(uchar a)
  147. {
  148.         /*pwm_l=0;
  149.         pwm_r=1;
  150.         pwm_hl=1;
  151.         pwm_hr=0;*/
  152.         persent_l=0;
  153.         persent_hl=0;
  154.         persent_r=8;
  155.         persent_hr=0;
  156.         while(delay<=a);
  157.         delay=0;
  158. }

  159. void rui_r(uchar a)
  160. {
  161. /*        pwm_l=1;
  162.         pwm_r=0;
  163.         pwm_hl=0;
  164.         pwm_hr=1;
  165. */        persent_l=8;
  166.         persent_hl=0;
  167.     persent_r=0;
  168.         persent_hr=3;
  169.         while(delay<=a);
  170.         delay=0;
  171. }

  172. void back(uchar a)
  173. {
  174. /*        pwm_l=0;
  175.         pwm_r=0;
  176.         pwm_hl=1;
  177.         pwm_hr=1;
  178. */        persent_l=0;
  179.         persent_r=0;
  180.         persent_hl=7;
  181.         persent_hr=7;       
  182.         while(delay<=a);
  183.         delay=0;
  184. }

  185.                                     
  186. //全白0000 0x0 全黑1111 0xf                  
  187. //左钝角 0100 0x4 左直角 1100 0xc 左锐角1000 0x8
  188. //右钝角 0010 0x2 右直角 0011 0x3 右锐角0001 0x1
  189. //100是1s
  190. void track()
  191. {  
  192. //        delay1(10);
  193. //        if(i==0)
  194.         signal=0xf;
  195.         signal&=(P2>>4);
  196. //        else signal=b;
  197.         switch(signal)
  198.     {
  199.         case 0x0: {forward(10);break;}
  200.         case 0xf: {forward(10);break;}
  201. ……………………

  202. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
循迹小车.zip (100.77 KB, 下载次数: 38)


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

使用道具 举报

沙发
ID:1 发表于 2017-7-3 02:57 | 只看该作者
测速程序:

  1. #include<reg52.h>

  2. //液晶及测速
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define zhouchang 20       //20cm               
  6. unsigned int i=0;                                                               
  7. sbit P36=P3^6;  
  8. sbit beep=P2^0;                                                                  
  9. unsigned char j;                                                                  
  10. unsigned int kop;                                                                 
  11. uchar code table[]="2013 (^_^) 4-17 ";
  12. uchar table1[]="   -I-          ";
  13. uchar table2[3];

  14. uchar code haode[16]=" WE  ^_^  THE   ";
  15. uchar code haode1[16]=" CHAM  ARE  PION";


  16. uchar code hao[16]= "  p_q    ^_^    ";
  17. uchar code hao1[16]="  -I- -- -I-    ";
  18. uchar flag=1;
  19. uchar time1=0;
  20. //液晶端口
  21. sbit rs = P3^1;//Pin4
  22. //sbit rw= P3^5; //Pin5
  23. sbit lcden  = P3^0;//Pin6
  24. uchar time=1;
  25. sbit dula=P2^6; //锁存器控制端定义
  26. sbit wela=P2^7;
  27. uchar num;

  28. void delay(uint z)
  29. {
  30.         uint x,y;
  31.         for(x=z;x>0;x--)
  32.                 for(y=110;y>0;y--);
  33. }

  34. void write_com(uchar com)
  35. {
  36. //        rw=0;
  37.         rs=0;
  38.         P1=com;
  39.         delay(5);
  40.         lcden=1;
  41.         delay(5);
  42.         lcden=0;
  43. }

  44. void write_data(uchar date)
  45. {
  46. //        rw=0;
  47.         rs=1;
  48.         P1=date;
  49.         delay(5);
  50.         lcden=1;
  51.         delay(5);
  52.         lcden=0;
  53. }


  54. void write_sfm(uchar add,uchar date)
  55. {
  56.         write_com(0x80+0x40+add);
  57.         write_data(0x30+date);
  58. }

  59. void init()
  60. {
  61.         dula=0;
  62.         wela=0;
  63.         lcden=0;
  64.         /*write_com(0x38);
  65.         write_com(0x0e);
  66.         write_com(0x06);
  67.         write_com(0x01);
  68.         write_com(0x80+0x10);
  69.         */
  70.         write_com(0x38);
  71.         write_com(0x0c);
  72.         write_com(0x06);
  73.         write_com(0x01);
  74.         write_com(0x80);
  75. }


  76. void zhongduan_init()                                             
  77. {
  78.         EA = 1;                                 
  79.     TH0=0x00;                                                                                                               
  80.         TL0=0x00;                                                                                                               
  81.         ET0=1;
  82.         ET1=1;               
  83.           TMOD = 0x15;// 打开定时器和计数器T0,因此矩形脉冲输入端接P3.4
  84.         TH1=0x3C; //50ms
  85.         TL1=0xB0;               
  86.     TR0 = 1;
  87.         TR1 = 1;
  88. }


  89. void main()
  90. {
  91.         P2=0xff;
  92.         init();
  93. //        flag=0;
  94.         zhongduan_init();                                      
  95.         while(1)
  96.         {
  97.         if(flag==0)
  98.         {
  99.                 EA=0;               //关闭中断
  100.                 write_com(0x80);
  101.                 for(num=0;num<15;num++)
  102.                 {
  103.                 write_data(table[num]);
  104.                 delay(20);
  105.                 }                       
  106. //速度       
  107.                 write_sfm(1,table1[0]);
  108.             write_sfm(2,table1[1]);
  109.             write_sfm(3,table1[2]);
  110. //时间               
  111.             write_sfm(10,table2[0]);
  112.                 write_sfm(11,table2[1]);
  113.                 write_sfm(12,table2[2]);
  114.                
  115. //            write_sfm(8,0x73);
  116.                 flag=1;
  117.                 EA=1;     
  118. //                while(1);          //开启中断
  119.         }
  120.         }
  121. }
  122.                                                                                                                                                                                
  123.                                                                      
  124. timer3() interrupt 3  //定时器中断时间到,就读取计数器值                        //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断                                           
  125. {
  126. TH1=0X3C;                                                                                                                                       
  127. TL1=0XB0;                                                                                                                                                            
  128. i++;                                                                                                                                                                                                                    
  129. if(i==20) //1s才进行技术脉冲值显示,即每秒更新一次速度    这里一会儿要给!!!!!!!!!1                       
  130. {
  131.    time++;                     //记时间
  132.    time1++;
  133.    kop=TH0;//计数器计入脉冲,每来一个矩形脉冲计数值加1
  134.    kop=kop<<8;
  135.    kop=kop+TL0;                                                //kp单位是cm,周长20cm,20个空隙,一个空隙1cm                                       
  136.    beep=1;
  137.    if(kop>45)
  138.    {
  139.         beep=0;
  140.    }
  141.    table1[0]=kop/100;       //显示计数器的值即实际测得速度
  142.    table1[1]=kop%100/10;
  143.    table1[2]=kop%100%10;
  144.    table2[0]=time/100;       //显示计数器的值即实际测得速度
  145.    table2[1]=time%100/10;
  146.    table2[2]=time%100%10;
  147.    i=0;
  148.    TH0=0;//计数器速度获取后清零,进行下次获取
  149.    TL0=0;
  150.    flag=0;
  151.    if(time1==20)
  152.    {
  153.           
  154.         write_com(01);
  155.                    write_com(0x80);
  156.                    for(num=0;num<15;num++)
  157.                 {
  158.                 write_data(haode[num]);
  159.                 delay(20);
  160.                 }        
  161.                
  162.                 write_com(0x80+0x53);
  163.                 for(num=0;num<15;num++)
  164.                 {
  165.                 write_data(haode1[num]);
  166.                 delay(20);
  167.                 }
  168.     delay(300);
  169.    }
  170.    if(time1==10)
  171.            {
  172.           
  173.         write_com(01);
  174.                    write_com(0x80);
  175.                    for(num=0;num<15;num++)
  176.                 {
  177.                 write_data(hao[num]);
  178.                 delay(20);
  179.                 }        
  180.                
  181.                 write_com(0x80+0x53);
  182.                 for(num=0;num<15;num++)
  183.                 {
  184.                 write_data(hao1[num]);
  185.                 delay(20);
  186.                 }
  187.     delay(400);
  188.    }
  189. }
  190. }
  191.           
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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