找回密码
 立即注册

QQ登录

只需一步,快速开始

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

飞思卡尔智能车最终完整程序 具有很高的参考价值

  [复制链接]
跳转到指定楼层
楼主

这个是一个2等奖的作品,毫无保留飞思卡尔智能车全部源码下载:
飞思卡尔智能车最终完整程序 具有很高的参考价值.rar (14.08 KB, 下载次数: 224)


主程序:
  1. #include <hidef.h>      /* common defines and

  2. macros */
  3. #include <mc9s12dg128.h>     /* derivative

  4. information */
  5. //#include "PWM.h"
  6. //#include "AD.h"
  7. #include "control.h"

  8. #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


  9. word AD_wData[9];  //全局变量存放 AD0,AD1,AD2的结果
  10. word sum[9]; //初始化时为求平均值,全白中,各个灯的FF次的电压和
  11. word avrg0[9]; //全白时各个灯的平均电压
  12. word summ[9];//初始化时为求平均值,全黑中,各个灯的FF次的电压和
  13. word avrg1[9]; //全黑时各个灯的平均电压
  14. word ss[9]; //实际采集来的各个灯的电压
  15. word s[9];  // 实际采集来的各个灯的电压
  16. word sum2[8];//用于存放两两灯电压之和
  17. word k;         //用于存放比较出的最大值
  18. uint h=1500;//转角大小
  19. int flag = 0;//标志中间灯是否第一次在黑道附近
  20. int flagg=0;//标志0灯从哪边感应到黑道
  21. int flagg1=0;//标志8灯从哪边感应到黑道
  22. int flagg0=0;//标志是左边还是右边出道
  23. int j=0;
  24. dword i;
  25. dword m;
  26. dword s0;
  27. dword s1;
  28. dword p11=0;//以下四个变量用于记录黑道处于同一侧的时间
  29. dword p12=0;
  30. dword p21=0;
  31. dword p22=0;
  32. word max0[9]=0;//初始化时采集来的黑道的值
  33. int g=0;//为过滤算法使用
  34. word cha[9];//用来存放黑白电压差

  35. int ffgg0=0;//标志是否用中间板采的数据
  36. int ffgg1=0;//标志是否用中间板采的数据     
  37. word sum0=0;  //初始化时采集来9个灯的全白电压和
  38. //word sum1=0;  //实际采集来的左4个灯的电压和
  39. //word sum22=0; //实际采集来的右4个灯的电压和
  40. int fla=0;//标志是出道还是入道
  41. void AD_Init();
  42. void PWM_Init();
  43. void PWM_Init1();
  44. //void PID();
  45. void AD_Init(void)        //AD初始化
  46. {
  47.      //控制寄存器2:    上电,标志位快速清零,开中断
  48.       ATD0CTL2  = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ASCIE_MASK);
  49.      ATD1CTL2  = (ATD1CTL2_ADPU_MASK|ATD1CTL2_AFFC_MASK|ATD1CTL2_ASCIE_MASK);
  50.      //控制寄存器3:转换序列长度为3
  51.      
  52.      ATD0CTL3  =0x78;// (ATD0CTL3_S2C_MASK|ATD0CTL3_S1C_MASK);
  53.             ATD1CTL3 =0x78;// (ATD1CTL3_S2C_MASK|ATD1CTL3_S1C_MASK);
  54.          //控制寄存器4:
  55.      ATD0CTL4  = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK);
  56.            ATD1CTL4  = (ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS1_MASK|ATD1CTL4_PRS0_MASK);
  57.          //控制寄存器5:
  58.      ATD0CTL5  = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK|ATD0CTL5_MULT_MASK);
  59.             ATD1CTL5  = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK|ATD1CTL5_MULT_MASK);
  60.      ATD0DIEN=0x00;   // 禁止数字输入缓冲
  61.       ATD1DIEN=0x00;   // 禁止数字输入缓冲
  62. }

  63. #pragma CODE_SEG NON_BANKED  //中断服务程序
  64. #pragma TRAP_PROC
  65. void interrupt 22 Int_AD0(void)
  66. {
  67.     AD_wData[0] = ATD0DR0;   //将结果寄存器中的值存放到数组中
  68.     AD_wData[1] = ATD0DR1;   //将结果寄存器中的值存放到数组中
  69.     AD_wData[2] = ATD0DR2;   //将结果寄存器中的值存放到数组中
  70.     AD_wData[3] = ATD0DR3;
  71.     AD_wData[4] = ATD0DR4;
  72.     AD_wData[5] = ATD0DR5;
  73.     AD_wData[6] = ATD0DR6;
  74.     AD_wData[7] = ATD0DR7;
  75.     AD_wData[8] = ATD1DR0;
  76.    
  77.    
  78. }

  79. #pragma CODE_SEG DEFAULT               
  80. word max(word a,word b,word c,word d,word e,word

  81. f,word r,word w) {
  82.      word maxx=0;
  83.      if(a>maxx)maxx=a;
  84.      if(b>maxx)maxx=b;
  85.      if(c>maxx)maxx=c;
  86.      if(d>maxx)maxx=d;
  87.      if(e>maxx)maxx=e;
  88.      if(f>maxx)maxx=f;
  89.      if(r>maxx)maxx=r;
  90.      if(w>maxx)maxx=w;
  91.      return maxx;
  92. }
  93. void delay0(){
  94.   for(i=0;i<0xFFFF;i++)
  95.     for(m=0;m<0x05;m++);
  96. }
  97. void delay1(){
  98.   for(i=0;i<0xFFFF;i++);
  99. // for(i=0;i<0xFFFF;i++);
  100. }
  101. void main(void)
  102. {
  103.      
  104.      AD_Init();   //AD 初始化
  105.      DDRB = 0xFF;
  106.      DDRA_BIT6=0; //A_BIT6口作为第二块板左边传感器的输入口
  107.      DDRA_BIT7=0;         //A_BIT7口作为第二块板右边传感器的输入口
  108.      PORTB  = 0xFF;
  109.      p=0;
  110.      for(j=0;j<9;j++)      
  111.      {
  112.           AD_wData[j] = 0; //全局变量初始化
  113.                             sum[j]=0;
  114.                        
  115.                  avrg0[j]=0;
  116.                  avrg1[j]=0;
  117.                        summ[j]=0;
  118.      }
  119.      for(j=0;j<9;j++) {
  120.       max0[j]=0;ss[j]=0;  
  121.      }
  122.       for(j=0;j<8;j++)
  123.         sum2[j]=0;
  124.      EnableInterrupts;          //开AD中断
  125.      for(i=0;i<0xFFFF;i++);
  126.      for(i=0;i<0xFF;i++)                //只能是FF,防止下面sum溢出
  127.      {
  128.          for(j=0;j<9;j++)                                 

  129. //采集白道路信息
  130.          {
  131.              sum[j]=sum[j]+AD_wData[j];
  132.          }
  133.      }
  134.      for(i=0;i<9;i++) {
  135.      sum0=sum0+sum[i]/0xFF;
  136.      avrg0[i]=sum[i]/0xFF;
  137.      }
  138.       
  139.      PORTB=sum[0]/0xFF;                //显示0通道采集到的值
  140.      delay0();
  141.      
  142.      PORTB=0x00;//显示马上得进行黑道信息采集了
  143.      delay1();
  144.      
  145.      for(j=0;j<9;j++){
  146.       for(m=0;m<0xFF;m++){
  147.         summ[j]=summ[j]+AD_wData[j];
  148.        }
  149.         avrg1[j]=summ[j]/0xFF;
  150.         PORTB=avrg1[j]; //显示采来的黑道信息
  151.         cha[j]=avrg1[j]-avrg0[j];
  152.         delay0();
  153.         PORTB=0x00; //显示马上得进行下一次黑道信息采集了
  154.         delay1();
  155.      }
  156.      PORTB=0x00;                                       

  157.   //灯全亮,提示车马上就可以跑了
  158.      delay1();
  159.    
  160.      PWM_Init() ;
  161.      PWM_Init1(1500,1,200);
  162.       for(i=0;i<0xFFF;i++);
  163. //       delay1();
  164.      for(;;)
  165.      {               
  166.          
  167.                        int f=0;
  168.                              u3=100;
  169.                      if(flagk1==1){
  170.                                p21=0;
  171.                                flagk2=0;
  172.                                p11++;
  173.                                if(p11==0xFFF)flagkk1=1;
  174.                              }else if(flagk2==1){
  175.                                p11=0;
  176.                                flagk1=0;
  177.                                p21++;
  178.                                if(p21==0xFFF)flagkk2=1;
  179.                              }
  180.                      for(f=0;f<9;f++){
  181.                        s[f]=AD_wData[f];
  182.                  ss[f]=s[f]-(avrg0[f]-0x50); //当前值减去初始白道值,以便比较
  183.                      }                                   
  184.                          for(f=0;f<8;f++)sum2[f]=ss[f]+ss[f+1]; //两两灯电压之和
  185. //减去1.6V防止溢出*******************
  186.       if(AD_wData[0]<0xC0&& AD_wData[1]<0xC0&& AD_wData[2]<0xC0&&AD_wData[3]<0xC0&&
  187.     AD_wData[4]<0xC0&&AD_wData[5]<0xC0&&AD_wData[6]<0xC0&&AD_wData[7]<0xC0&&
  188.     AD_wData[8]<0xC0){
  189.     if(sum2[0]<0xC0&&sum2[1]<0xC0&&sum2[2]<0xC0&&sum2[3]<0xC0&&
  190.       sum2[4]<0xC0&&sum2[5]<0xC0&&sum2[6]<0xC0&&sum2[7]<0xD0){
  191.          fla=1;
  192.          if(flagg0==1)
  193.           {
  194.          for(i=0;i<0xFF;i++);
  195.           PWM_Init1(1140,u1,200);
  196.          flagk1=1;
  197.          flagkk2=0;
  198.           for(;;){
  199.             if(AD_wData[4]>0xB0||AD_wData[5]>0xB0||AD_wData[6]>0xB0||
  200.             AD_wData[7]>0xB0||AD_wData[8]>0xB0){
  201.               flagg0=0;
  202.               break;               
  203.             }
  204.           }
  205.          }
  206.          else if(flagg0==2){
  207.          for(i=0;i<0xFF;i++);
  208.           PWM_Init1(1860,u1,200);
  209.          flagk1=0;
  210.             flagkk2=1;
  211.           for(;;)if(AD_wData[0]>0xB0||AD_wData[1]>0xB0||
  212.           AD_wData[2]>0xB0||AD_wData[3]>0xB0||AD_wData[4]>0xB0){
  213.             flagg0=0;
  214.             break;  
  215.           }
  216.          }
  217.       }else{
  218.              }
  219.     }else{
  220.      
  221.      if(s[0]-(avrg0[0]-0x13)<0x40 && s[1]-(avrg0[1]-0x13)<0x40 &&
  222.      s[2]-(avrg0[2]-0x13)<0x40 && s[3]-(avrg0[3]-0x13)<0x40 &&
  223.      s[4]-(avrg0[4]-0x13)<0x40 && s[5]-(avrg0[5]-0x13)<0x40 &&
  224.      s[6]-(avrg0[6]-0x13)<0x40 && s[7]-(avrg0[7]-0x13)<0x40 &&
  225.      s[8]-(avrg0[8]-0x13)<0x40)              

  226. ///////////注意调整该值36***************      
  227.      {
  228.      
  229.       /* if(PORTA_BIT6!=0||PORTA_BIT7!=0){
  230.                            
  231.                          if(PORTA_BIT6!

  232. =0&&PORTA_BIT7==0)PWM_Init1(1900,200,1);
  233.             else if(PORTA_BIT7!=0&&PORTA_BIT6==0)

  234. PWM_Init1(1100,200,1);
  235.                        }
  236.                                 */
  237.                                                                   

  238.                                        
  239.      }else{               
  240.       
  241.             
  242.                           k=max(sum2[0],sum2[1],sum2[2],sum2[3],sum2[4],sum2[5],sum2[6],sum2[7]);
  243.                            //谁两和最大,黑道就在谁两之间
  244.                            if(k==sum2[0]){
  245.                              p=0;
  246.                              flagg0=2;
  247.                              if(fla==1)
  248.                              control_11();
  249.                              else if(fla==0) control_1();
  250.                            }
  251.                            else{
  252.                                 if(k==sum2[1]){
  253.                                 p=0;
  254.                                 p1=0;
  255.                                  fla=0;
  256.                                  control_2(s[1],s[2],ss[1],ss[2],cha[1],cha[2],avrg0[1],avrg0[2]);
  257.                                 }
  258.                     else{if(k==sum2[2]){
  259.                     p=0;
  260.                     p1=0;
  261.                       fla=0;
  262.                       control_3(s[2],s[3],ss[2],ss[3],cha[2],cha[3],avrg0[2],avrg0[3]);
  263.                     }
  264.                          else{if(k==sum2[3]){
  265.                          p=0;
  266.                          p1=0;
  267.                           fla=0;
  268.                           control_4(s[3],s[4],ss[3],ss[4],cha[3],cha[4],avrg0[3],avrg0[4]);
  269.                          }
  270.                               else{if(k==sum2[4]){
  271.                                 fla=0;
  272.                                 p1=0;
  273.                                 control_5(s[4],s[5],ss[4],ss[5],cha[4],cha[5],avrg0[4],avrg0[5]);         
  274.                               }
  275.                                    else{if(k==sum2[5]){
  276.                                     fla=0;
  277.                                     p1=0;
  278.                                     control_6(s[5],s[6],ss[5],ss[6],cha[5],cha[6],avrg0[5],avrg0[6]);
  279.                                    }
  280.                                         else{if(k==sum2[6]){
  281.                                         p=0;
  282.                                         p1=0;
  283.                                           fla=0;
  284.                                           control_7(s[6],s[7],ss[6],ss[7],cha[6],cha[7],avrg0[6],avrg0[7]);
  285.                                         }
  286.                                              else{if(k==sum2[7]){
  287.                                              p=0;
  288.                                               flagg0=1;
  289.                                               if(fla==0)
  290.                                               control_8();
  291.                                               else if(fla==1)
  292.                                               control_88();
  293.                                              } else{
  294.                                              }
  295.                                              }
  296.                                         }
  297.                                    }
  298.                               }
  299.                          }
  300.                     }
  301.                            }
  302.      }                                                
  303.     }
  304.      }
  305. }
复制代码



评分

参与人数 1黑币 +4 收起 理由
yuyuyu1123 + 4 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:143842 发表于 2016-10-23 00:16 来自手机 | 只看该作者
这做出来效果是只跑黑道吗?
回复

使用道具 举报

板凳
ID:141458 发表于 2016-11-17 09:34 | 只看该作者
这个能干什么?
回复

使用道具 举报

地板
ID:154468 发表于 2016-12-13 17:18 来自手机 | 只看该作者
楼主,有联系方式吗
回复

使用道具 举报

5#
ID:166644 发表于 2017-2-25 21:20 | 只看该作者
真假?
回复

使用道具 举报

6#
ID:166644 发表于 2017-2-25 21:22 | 只看该作者
这个文件是哪个组别的作品?光电四轮?
回复

使用道具 举报

7#
ID:185968 发表于 2017-4-23 11:16 | 只看该作者
厉害
回复

使用道具 举报

8#
ID:218434 发表于 2017-7-10 10:18 | 只看该作者
好棒好棒哦,谢谢
回复

使用道具 举报

9#
ID:296775 发表于 2018-3-25 15:47 | 只看该作者
谢谢楼主分享,新人注册,黑币不足5555555555
回复

使用道具 举报

10#
ID:295684 发表于 2018-3-27 19:21 | 只看该作者
谢谢楼主分享,新人注册,黑币不足5555555555
回复

使用道具 举报

11#
ID:272155 发表于 2018-4-4 21:11 来自手机 | 只看该作者
谢谢共享
回复

使用道具 举报

12#
ID:302739 发表于 2018-4-6 22:51 | 只看该作者
楼主你这样真的好吧 祖传代码并不能真正给新手带来技术
回复

使用道具 举报

13#
ID:421283 发表于 2018-11-20 19:42 | 只看该作者
这是寻迹小车》/?
回复

使用道具 举报

14#
ID:324611 发表于 2018-11-23 12:14 | 只看该作者
好东西,学习下。
回复

使用道具 举报

15#
ID:483088 发表于 2019-3-2 09:43 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

16#
ID:538379 发表于 2019-6-20 22:47 | 只看该作者
谢谢楼主
回复

使用道具 举报

17#
ID:538014 发表于 2019-7-4 18:49 | 只看该作者
垃圾啥都没有
回复

使用道具 举报

18#
ID:649429 发表于 2019-11-25 21:22 | 只看该作者
刚注册,新人报道,不过楼主好厉害
回复

使用道具 举报

19#
ID:649429 发表于 2019-11-25 21:24 | 只看该作者
刚注册,新人报道,不过楼主好厉害
回复

使用道具 举报

20#
ID:636435 发表于 2019-12-6 09:57 | 只看该作者
谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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