主程序
- 格式: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);