主程序

  • 格式:doc
  • 大小:145.00 KB
  • 文档页数:15

主程序

#include

#include

#include "display.h"

#include "ceju.h"

#include "ds1302.h"

#include "bujin.h"

#include "delay.h"

#include "xunji.h"

#define uchar unsigned char //宏定义替换

#define uint unsigned int //宏定义替换

#define speed_stop PORTE&=0xF0

#define speed_forward PORTE|=0x05

void port_init(void)

{

DDRA =0XFF;

PORTA=0XFF;

DDRB =0XFF;

PORTB=0XFF;

DDRC =0XFF;

PORTC=0XBF;

DDRD =0XEF;

PORTD=0XFF;

DDRE =0XBF; //将E端口低六位设为输出模式,第七位设置为输入模式

PORTE=0XF0; //将E端口低四位输出为左右电机都不转

DDRF = 0x00; //将F端口定义为输入,上拉电阻有效

PORTF = 0xFF;

DDRG =0XFF;

PORTG=0X00;

} void timer0_init(void)

{

TCCR0 &= 0xF8;//停止定时器0

TIMSK |= 0x01;//定时器0溢出中断使能

}

void timer1_init(void)

{

TCCR1B = 0x41; // T/C1正常计数方式,上升沿触发输入捕捉,4M/1计数钟

TIMSK |= 0x24; // 允许T/C1输入捕捉、溢出中断

}

void timer2_init(void)

{

TCNT2=0X01;

OCR2=0x00;

TCCR2|=0x74;//相位可调PWM,8分频

TIMSK|=0X00; //关闭定时器2溢出中断使能,关闭比较匹配中断使能

}

//定时器3初始化

//定时器3设置为16位相位修正PWM模式,ICR3提供TOP值(0xFFFF)

//升序计数时比较匹配置位,降序计数时比较匹配清零

//CLK 不分频 PWM频率为500Hz

void Timer3_Init(void)

{

ETIMSK = 0X00;//关闭所有中断

TCCR3A = 0x3E;

TCCR3B = 0x11;

ICR3 = 0x1200;

}

void int6_init(void)

{ CLRBIT(EIMSK,6);

EICRB |= 0x10;

//SETBIT(GICR,6);

}

void init_devices(void)

{

CLI(); //禁止所有中断

int6_init();

timer0_init();

timer1_init();

timer2_init();

Timer3_Init();

port_init();

LCMInit(); //初始化液晶

ds1302_init(); //DS1302初始化

delay_ms(10);

ds1302_write_time(); //写入初始

SEI();//开全局中断

}

void main(void)

{

uint i;

uchar lujing[4]={0,0,0,0};

init_devices();

speed_stop;

action=0;

//LCMTextOut(1,5,"lay");

julichengxu();

delay_ms(100);

julichengxu(); delay_ms(100);

julichengxu();

delay_ms(100);

while(1)

{

while(action)

{speed_forward;

SearchLine();}

Adjust_Speed(0x1200,0x1200);

julichengxu();

if(juli>45)

{speed_forward;

for(i=0;i<2000;i++)

SearchLine();}

else

{

speedcontrol_bit=1;

speed_forward;

for(i=0;i<2000;i++)

SearchLine();//减速前进

speedcontrol_bit=0;

Adjust_Speed(0x1200,0x1200);

julichengxu();

if(juli<40)

{

speed_stop;

for(i=0;i<43;i++)

MotorCW(); //顺时针转动30度

MotorStop(); //停止转动

delay_ms(100); julichengxu();

if(juli<20)

lujing[0]=1;

else

lujing[0]=0;

for(i=0;i<43;i++)

MotorCW(); //继续顺时针转动30度

MotorStop(); //停止转动

delay_ms(100);

julichengxu();

if(juli<20)

lujing[1]=1;

else

lujing[1]=0;

for(i=0;i<129;i++)

MotorCCW(); //逆时针转动120度,即向右偏转30度

MotorStop(); //停止转动

delay_ms(100);

julichengxu();

if(juli<20)

lujing[2]=1;

else

lujing[2]=0;

for(i=0;i<43;i++)

MotorCCW(); //继续逆时针转动30度

MotorStop(); //停止转动

delay_ms(100);

julichengxu();

if(juli<20) lujing[3]=1;

else

lujing[3]=0;

for(i=0;i<86;i++)

MotorCW(); //顺时针转动30度

MotorStop(); //停止转动

if((lujing[0]==0)&&(lujing[1]==0))

action=1;

if((lujing[2]==0)&&(lujing[3]==0))

action=2;

speed_forward;

for(i=0;i<10;i++)

Adjust_Speed(0x800,0x550);

}

speed_forward;

for(i=0;i<2000;i++)

SearchLine();

}

}

//ds1302_read_time(); //读取时间

//ds1302_display_time();

//speed();

//LCMDigitalOut(1,1,p[0]);

//LCMDigitalOut(1,2,p[1]);

//LCMDigitalOut(1,3,p[2]);

//LCMDigitalOut(1,4,p[3]);

//LCMTextOut(1,5,"lay"); //第二行第一列初始化显示

}

循迹程序

#include

#include

#include "delay.h"

#define SETBIT(x,y) (x |=(1<

#define CLRBIT(x,y) (x &=(~(1<

unsigned char action=0;

unsigned char forflag=0; //记录上一次机器人行进状态

unsigned char forlight; //记录上一次A口光电传感器的状态

unsigned char fob=0; //=1后退,=0前进

unsigned char speedcontrol_bit=0;

Unsigned int

speed[2][10]={{0x900,0x700,0x990,0x350,0x700,0x870,0x1200,0x840,0x970,0x1200},

{0x1200,0x1200,0x1200,0x870,0x990,0x1200,0x1200,0x870,0x990,0x1200}};

void Adjust_Speed(unsigned int Left_Speed,unsigned int Right_Speed)

{

OCR3B = Left_Speed;

OCR3C = Right_Speed;

}

char Talone(void)

{if ((forlight&0x09)==0) //3单独亮

return(0);

else

return(1); //返回为校偏状态值

}

char FUalone(void) //4单独亮

{if ((forlight&0x05)==0)

return(0);