循迹小车代码一份

本文分享了基于C8051F020微控制器的循迹小车代码实现,详细介绍了时钟、IO口、定时器及PCA0模块的初始化过程,以及通过AD转换值进行路径判断和转向控制的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我来分享循迹小车代码一份
 
  1. #include<c8051f020.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define SYSCLK 22118400
  5. sbit IN1=P3^0;
  6. sbit IN2=P3^1;             
  7. sbit IN3=P3^2;
  8. sbit IN4=P3^3;
  9. sbit S0=P2^0;
  10. sbit S1=P2^1;
  11. sbit S2=P2^2;
  12. sbit S3=P2^3;
  13. sbit S4=P2^4;                  
  14.        
  15. uchar code table[]={0xff,0xd0,0xb0,0x80,0x00};        //PWM输出控制数组
  16. uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //数码管输出数组
  17.  
  18. uchar i,r,l,temp,lukou=1,num;
  19.  
  20. void SYSCLK_init()        //时钟初始化
  21. {
  22.           int i;                              
  23.            OSCXCN=0x67;                                                         
  24.            for(i=0;i<256;i++);           
  25.            while(!(OSCXCN&0x80)) ;         
  26.    
  27.                 OSCICN=0x88;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  28.          
  29. }
  30.  
  31. void IO_init()                //IO口初始化
  32. {
  33.         XBR0=0x50;                  //交叉开关配置寄存器XBR0、XBR1、XBR2
  34.         XBR1=0x00;
  35.         XBR2=0x40;
  36.         P0MDOUT=0xff;
  37.         P3MDOUT=0xff;
  38.        
  39. }
  40.  
  41. void timer_init()
  42. {
  43.         CKCON=0x78;//时钟控制寄存器
  44.         TMOD=0x11;//计数器定时器方式寄存器
  45.         TH0=(65536-18432)/256;                                                        //  tf0/tf1中断请求标志位  可用于关中断
  46.         TL0=(65536-18432)%256;
  47.         EA=1;
  48.         ET0=1;
  49.         ET1=1;
  50. }
  51.  
  52. void PCA_int_init()                //PCA0初始化
  53. {
  54.         IE=0x85;
  55.         IP=0x00;
  56.         EIP1=0x08;
  57.         EIE1=0x08;
  58.         PCA0MD=0x09;
  59.         PCA0CPM0=0x42;
  60.         PCA0CPM1=0x42;
  61.         //PCA0CPL0=0x00;                   //设置PCA0CP0脉冲宽度
  62.         PCA0CPH0=table[4];
  63. //        PCA0CPL1=0x00;                   //设置PCA0CP1脉冲宽度
  64.         PCA0CPH1=table[4];
  65.         CR=0;
  66.         IT0=1;
  67.         IT1=1;
  68. }
  69.  
  70. void delay(uint z)                //延时
  71. {
  72.         uint x,y;
  73.         for(y=z;y>0;y--)
  74.                 for(x=0;x<220;x++);
  75. }  
  76. void zhuanx(uchar zx)   //高速左转向(1)右转向(2)低速左转(3)
  77. {                       //右转(4)低速前行(5)高速前行(6)急停(7)倒退(8)
  78.       switch (zx)        //外加转弯灯,左转PB.0控制左边2个黄灯亮,右转PD.0控制的黄灯亮
  79.         {                  //急停灯(红色)有PD.1控制
  80.           case 1: l=4;
  81.                                     r=0;   //高速向左
  82.                   break;
  83.           case 2: r=4;
  84.                                     l=0;   //高速右转
  85.                             break;
  86.           case 3: l=2;
  87.                           r=0;             //低速左转
  88.              break;
  89.           case 4: r=2;
  90.                           l=0;             //低速右转
  91.              break;
  92.           case 5: l=r=2;              //低速前行
  93.              break;
  94.           case 6: l=r=0;           //高速前行
  95.              break;
  96.                   case 7: l=r=4;                //刹车
  97.                      break;
  98.                          }
  99.         }
  100.  
  101. void panduan() //将得到的AD转换值导入
  102.    {   
  103.  
  104.  
  105.         //unsigned char lukou=0;  //lukou变量用于路口判断
  106.        //单个传感器检测到信号的情况
  107.         //2号传感器检测到信号,其余没有检测到信号
  108.        if((S0==0)&&(S1==0)&&(S2==1)&&(S3==0)&&(S4==0))
  109.        {
  110.              zhuanx(6); //调用高速前行函数
  111.        }
  112.        // 1号传感器检测到信号,其余没有检测到信号
  113.        if((S0==0)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
  114.        {
  115.              zhuanx(3);//调用低速左转函数
  116.        }
  117.        // 0号传感器检测到信号,其余没有检测到
  118.        if((S0==1)&&(S1==0)&&(S2==0)&&(S3==0)&&(S4==0))
  119.        {
  120.              zhuanx(1); //调用高速左转函数
  121.        }
  122.        //3号传感器检测到信号,其余没有检测到信号
  123.        if((S0==0)&&(S1==0)&&(S2==0)&&(S3==1)&&(S4==0))
  124.        {
  125.             zhuanx(4);  //调用低速右转
  126.        }
  127.        //4 号传感器检测到信号,其余没有检测到信号
  128.        if((S0==0)&&(S1==0)&&(S2==0)&&(S3==0)&&(S4==1))
  129.        {
  130.            zhuanx(2);  //调用高速右转
  131.        }
  132.        // 1,2号检测到信号 其余没有         白线在两个传感器中间
  133.        if((S0==0)&&(S1==1)&&(S2==1)&&(S3==0)&&(S4==0))
  134.          {
  135.              zhuanx(3); // 调用低速左转函数
  136.          }
  137.        //0,1号检测到信号
  138.        if((S0==1)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
  139.          {
  140.              zhuanx(1);  //调用高速左转函数
  141.          }
  142.          //2,3号检测到信号
  143.        if((S0==0)&&(S1==0)&&(S2==1)&&(S3==1)&&(S4==0))
  144.        {
  145.              zhuanx(4); //调用低速右转函数
  146.        }
  147.        //3,4检测到信号
  148.        if((S0==0)&&(S1==0)&&(S2==0)&&(S3==1)&&(S4==1))
  149.          {
  150.              zhuanx(2);//调用高速右转函数
  151.          }
  152.        //0,1,2有信号              ( 折线检测 )
  153.        if((S0==1)&&(S1==1)&&(S2==1)&&(S3==0)&&(S4==0))
  154.          {
  155.             zhuanx(1);//左转折线  调用高速左转函数
  156.          }
  157.        //2,3,4有信号
  158.        if((S0==0)&&(S1==0)&&(S2==1)&&(S3==1)&&(S4==1))
  159.          {
  160.              zhuanx(2); //右转折线  调用高速右转函数
  161.          }
  162.        //1,2,3 有信号
  163.        if((S0==0)&&(S1==1)&&(S2==1)&&(S3==1)&&(S4==0))
  164.         {
  165.              zhuanx(6); //  调用高速直行函数
  166.         }
  167.            //0,4 有信号
  168.            if((S0==1)&&(S4==1))
  169.         {           
  170.              lukou++;
  171.                          if(lukou==1)
  172.                          {       
  173.                                  TR1=1;
  174.                                  
  175.                           }       
  176.                          if(lukou==2)
  177.                          {       
  178.  
  179.                                 TR0=0;
  180.                                 zhuanx(7);
  181.  
  182.                                
  183.                                
  184.                        
  185.                                                                   //  调用刹车函数
  186.                           }
  187.                  if(lukou==3)
  188.                             lukou=0;       
  189.  
  190.         }           
  191.                
  192.  
  193. }
  194.  
  195. void display()
  196. {        uchar qian,bai,shi,ge;
  197.         qian=temp/1000;
  198.         bai=temp%1000/100;
  199.         shi=temp%1000%100/10;
  200.         ge=temp%10;
  201.         P4=0x7f;
  202.         P7=table1[ge];
  203.         delay(2);
  204.         P4=0xbf;
  205.         P7=table1[shi];
  206.         delay(2);
  207.         P4=0xdf;
  208.         P7=table1[bai];
  209.         delay(2);       
  210.         P4=0xef;
  211.         P7=table1[qian];
  212.         delay(2);               
  213.        
  214. }
  215.  
  216. void run_init()
  217. {
  218.         IN1=1;                   //向前行驶
  219.         IN2=0;
  220.         IN3=1;
  221.         IN4=0;
  222.  
  223.  
  224. }
  225. void main()
  226. {
  227.              WDTCN=0xde;       //关闭看门狗                                  
  228.         WDTCN=0xad;
  229.         SYSCLK_init();
  230.         IO_init();
  231.         PCA_int_init();       
  232.         run_init();
  233.         timer_init();
  234.         CR=1;
  235.        
  236.         while(1)
  237. {
  238.    
  239.    panduan();
  240.    display();
  241. }   
  242. }
  243.  
  244. void PCA_ISR (void) interrupt 9                //PCA中断服务程序
  245. {
  246.         CF=0;
  247. //        PCA0CPL0=0x00;
  248.         PCA0CPH0=table[r];
  249. //        PCA0CPL1=0x00;
  250.         PCA0CPH1=table[l];
  251.         CCF0=1;
  252.         CCF1=1;
  253. }
  254.  
  255. void timer0() interrupt 1           //定时器0中断
  256. {        uchar tt;
  257.         TH0=(65536-18432)/256;
  258.         TL0=(65536-18432)%256;
  259.         tt++;
  260.         if(tt==115)
  261.         {
  262.                 temp++;
  263.                 tt=0;
  264.         }
  265. }
  266.  
  267. void timer1()  interrupt 3         //定时器1中断
  268. {       
  269.        
  270.         TH1=(65536-18432)/256;
  271.         TL1=(65536-18432)%256;
  272.         TR0=1;
  273.        
  274. }         
  275.  
  276.  
复制代码

 
 
 

文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-208695-1-1.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值