单片机智能循迹小车制作

发布者:Qianfeng最新更新时间:2015-07-02 来源: 51hei关键字:单片机  智能循迹小车  ATmega128 手机看文章 扫描二维码
随时随地手机看文章
电路图和制作详情请从这里下载附件: http://www.51hei.com/bbs/dpj-18970-1.html ,下面是程序源代码

/****
**********************************
*程序说明:
*此ATmega128单片机程序
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系统主程序
*注意:系统时钟8MHZ
*编译环境:Code VisionAVR
**********************************
*版本:智能循迹小车v1.0
*作者:吾ARM1
*修改时间?012年4月19日
*完成时间:2012年4月16日
**********************************/

#include 
#include "delay.h"
#define left1   PORTC.0  
#define left2   PORTC.1
#define min     PORTC.2
#define right1  PORTC.3
#define right2  PORTC.4  
#define Turn_Left       PORTC.5
#define Turn_Right      PORTC.6
#define u8      unsigned char 
#define u16     unsigned int 

void  Init_IO(void)
{
    DDRC = DDRC&0xe0; //将C端口低5位定义为输入,浮空
    PORTC = 0xe0;// 
    DDRB = 0xff; //将B端口设为输出模式
    PORTB = 0xff; 
    PORTA = 0xff;
    DDRA = 0xff; 
}  

void Adjust_Speed(u8 Left_Speed,u8 Right_Speed)
{
      OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,为右电机占空比
      OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,为左电机的占空比    
}
 
void    Init_Timer1(void)
{       u16     i,j;
        i = 300; //实际测试发现1600时电机速度还是很快的。
        j = 300;
        TCCR1A = 0xa0;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1
        TCCR1B = 0x12;//系统时钟8分频,A,B同时输出PWM   
        OCR1A = i; //右电机
        OCR1B = j;  //在电机
        ICR1 = 1000;
}

void main(void)
{    
        Init_IO();
        Init_Timer1();
        while(1)
        {
           if(PINC==0xfb)//只有中间循迹管检测到黑线11011
           {
               Adjust_Speed(90,90);//前进(35,35):一圈循迹时间16.3S  (38,38)一圈循迹时间15.5s (40,40)一圈循迹时间16.34s (50,50)15.34s(60,60)14.21s
               PORTA = 0xfe;        //(80,80)13.68s
           }
           
         if(PINC==0xf9)//中间和左边第二个循迹管检测到黑线10011
         {
               Adjust_Speed(20,60);//左转 
              //  delay_ms(5);
               PORTA = 0xfd;
          }
             
           if(PINC==0xfd)//左边第二个循迹管检测到黑线10111
           {
                Adjust_Speed(15,65);//左转 
               //delay_ms(5);
                 PORTA = 0xfb;
           }
            
           if(PINC==0xfc)//左边两个同时检测到黑线00111
           {
           
                Adjust_Speed(10,70);//左转 
                 PORTA = 0xf7;
           }
           
          if(PINC==0xfe)//左边第一个循迹管检测到黑线01111
          {
              
               Adjust_Speed(7,85);//左转 
             //   delay_ms(5);
                PORTA = 0xef;
          } 
           
            if(PINC==0xf3)//中间和右边第二个循迹管检测到黑线11001
          {
              
               Adjust_Speed(35,15);//右转 
                PORTA = 0xdf;
           } 
          if(PINC==0xf7)//右边第二个循迹管检测到黑线11101
          {
               Adjust_Speed(70,13);//右转  
                PORTA = 0xbf;
           }  
           if(PINC==0xe7)//右边两个检测到黑线11100
           {
               Adjust_Speed(80,10);//右转  
               PORTA = 0x7f; 
           }  
           if(PINC==0xef)//右边第一个检测到黑线11110
           {
               Adjust_Speed(100,10);//右转   
               PORTA = 0xfc;
           }   
           if(PINC==0xe3)//右侧三个循迹管同时检测到黑线(直角)11000
           {
               Adjust_Speed(40,0);//右转 
               PORTA = 0xf8;    
           } 
           if(PINC==0xe7)//左侧三个循迹管同时检测到黑线(直角)00011左转
          {
               Adjust_Speed(0,40);//左转 
                PORTA = 0xf0; 
           }
           if(PINC==0xe0)//5个循迹管同时检测到交叉00000直走
           {
             Adjust_Speed(25,25);//直走 
              PORTA = 0xe0; 
           } 
       //    if(PINC==0xff)
         //  {
           //    Adjust_Speed(0,100);//直走 
             // PORTA = 0xc0;   
           //}
           
        }
        
}

关键字:单片机  智能循迹小车  ATmega128 引用地址:单片机智能循迹小车制作

上一篇:FFT算法在单片机中的使用&&LCD12864驱动
下一篇:关于ATmega16与NRF24L01通信

推荐阅读最新更新时间:2024-03-16 14:23

红外遥控器单片机编码程序加详解
void IR_IN() interrupt 0 using 0 //采用12MHz晶振 { unsigned char j,k,N=0; EX0 = 0; //初始化,关闭外中断 delay(15); if (IRIN==1) //没有脉冲到来高电平 { EX0 =1; //默认状态下开中断,寻找9ms引导脉冲 return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);} //单片机接收电平与遥控器电平完全相反,delay(1)延时0.14ms f
[单片机]
51单片机学习4大误区
51指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的A系列,它广泛应用于工业之中。目前国内的51单片机市场主要为国产的产品STC系列其号称,稳定与廉价的。 误区1:51单片机是学习的基础 “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片机可以供使用,国内更没有更高级的教材供参考,老师的水平也是参差不齐,而51单片机正符合这样的需求,不
[单片机]
关于单片机AT89S52和CF卡的接口设计
  通过8051单片机对CF卡进行读写。   2.CF卡的操作方式   CF卡的操作方式与计算机的硬盘操作方式类似,其扇区的寻址也有两种方式:物理寻址(CHS)和逻辑寻址(LBA),物理寻址使用柱面、磁头和扇区号表示一个特定的扇区,起始扇区是0道、0头、1区,接下来是2区等等,逻辑寻址将整个CF卡统一寻址。逻辑块寻址和物理寻址的关系为:   LBA地址=(柱面号×磁头数+磁头号)×扇区数+扇区数一1   在实际使用过程中,用LBA地址进行寻址,可以大大简化编程的工作量,避免柱面、磁头和扇区之间的换算和切换,并且可以突破CHS对大容量的无法寻址的限制。   3.CF卡的文件管理   CF卡的文件管理系统和硬盘的文
[嵌入式]
51单片机的ds18b20驱动程序
//////////////////////////////////////////////////////头文件/////////////////////////////////////////////////////// /******************************************************************************* * 标题: 18b20温度芯片驱动程序 * * 文件: 18b20.h 18b20.c * * 日期: 2010-3
[单片机]
爱特梅尔推出低成本网表目标转移流程
爱特梅尔公司 (Atmel® Corporation) 宣布推出低成本的网表 (netlist) 目标转移 (re-targeting) 流程,适合基于ARM® 的低入门成本AT91CAP可定制微控制器向ASIC的迁移,能够实现大批量应用的最低单位成本。这一流程采用了能够保持系统功能的自动化网表目标转移技术,让客户获益于CAP™ 的低开发成本和快速原型构建,当产品在其应用中获得验证,便能够以最少的额外成本和风险,转向具有最低单位成本的大批量ASIC器件。 爱特梅尔免费除了提供所有公司内部开发的IP模块,可在CAP固定架构或金属可编程模块中实施之外,还提供具有价格竞争力的第三方IP (因为这些IP提供予众多客户,所以价格得以降低)
[单片机]
单片机怎么实现模块化编程?思维+实例+系统教程
在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。 总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。 如果程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简单的功能。 对于程序提升这块,如果没有人一个厉害的人带你,真的很难提升。 主要难在两个方面: 1.你的认知 有时候不是你做了越久,写的代码就越好,因为你一直在自己的认知水平内写代码。 如果不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。 2.找不到好的教程或实例 终有一天你要做中大型项目的时候就会
[单片机]
单片机接口分析与存储器扩展
  TMS320F2812是德州仪器(TI)公司专门为工业应用而设计的新一代DSP处理器,它的性能大大优于当前广泛使用的TMS320LF240x系列。该芯片为32位定点DSP,最高主频150 MHz,最小指令周期6.67 ns,外部采用低频时钟,通过片内锁相环倍频;相对于TMS320LF2407只能寻址192 KB地址空间,该芯片的外部接口最多可寻址4 MB的空间;有3个独立的片选信号,并且读/写时序可编程,兼容不同速率的外设扩展;通过配置外部接口寄存器,在访问外部设备时不必额外增加延时等待,既提高了程序的实时性又减少了代码量。因此,灵活掌握和使用外部接口,对于DSP系统开发有很大帮助。本文结合实际系统,分析TMS320F2812外
[单片机]
<font color='red'>单片机</font>接口分析与存储器扩展
增强型单片机STC12C5A60S2输出各种频率方波信号
【例7-3】 设时钟频率Fosc=18.432MHz,设计程序,从P1.0/CLKOUT2引脚输出频率为124.540KHz的时钟;从T0(P3.4)引脚输出频率为125KHz的时钟;从T1(P3.5)引脚输出频率为38.4KHz的时钟。 解:使用STC12C5A60S2的可编程时钟输出功能完成所需要求。在下面的程序设计中(在此只给出C语言程序),T0、T1和独立波特率发生器BRT均工作在1T模式。 程序编制如下: #include stc12c5a.h //包含STC12C5A60S2的寄存器定义头文件 void main(void) { TMOD = 0x22; //T0和T1工作在方式2,8位自动重
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved