📄 main.i
字号:
LCD_write_str( 0 , 1 ,"select mode");
LCD_write_str( 6 , 0 ,mode[0]);
delay_ms( 1000 );
do
{
if( PINC.7==0 )
{
while(PINC.7==0);
++temp;
if(temp==3)
temp=0;
LCD_write_str( 6 , 0 ,mode[temp]);
}
}
while(PINC.6==1);
while(PINC.6==0);
LCD_clear( );
return(temp);
}
/*******************************************************
基本要求部分
*******************************************************/
void nomal ( void )
{
/*****************************************************
显示时钟,初始设置
*****************************************************/
LCD_write_str( 0 , 0 ,"minc: sec: ");
LCD_write_str( 0 , 1 , step[0] );
delay_ms(1000);
beep( );
start_PCF( );
/********************************************************
小车动作初始化
********************************************************/
PORTD.0=0 ;
PORTD.1=0;
OCR1AH=0x02;
OCR1AL =0xFF; //new
OCR1BH=0x02;
OCR1BL=0xFF;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
delay_ms(2000);
OCR1AH=0x01;
OCR1AL =0xFF; //new
OCR1BH=0x01;
OCR1BL=0xFF;
TCCR2 = 0x0A; //自动寻线开
#asm("sei"); //全局中断开
/**********************************************
第一阶段
**********************************************/
while ( Timer[0] != 0X14 ) ;
LCD_write_str( 0 , 1 , step[1] );
#asm("cli");
beep( );
start_PCF( );
#asm("sei");
/************************************************
寻找平衡
************************************************/
TCCR2 = 0x00; //寻线关
Findbenlen( );
PORTC.2=0;
flage+=0x80; //开启蜂鸣,中断关闭
/************************************************
找到平衡
************************************************/
#asm("cli");
start_PCF( ); //需要改动
LCD_write_str( 0 , 1 , step[2] );
LCD_write_str( 6 , 1 , "Balan:" );
flage+=0x04; //显示平衡
#asm("sei");
do
{
if( Timer[0]==0X05 )
{
flage -=0x04;
#asm("cli");
start_PCF( );
#asm("sei");
}
}
while ( (flage==0X04 )|| ( flage==0X84 ) );
/***************************************************
改变速度
***************************************************/
#asm("cli");
OCR1AH=0x01;
OCR1AL =0xFF; //new
OCR1BH=0x01;
OCR1BL=0xFF;
#asm("sei");
PORTD.0=0;
PORTD.1=0;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
/************************************************
慢走,直到传感器感知木板落下
************************************************/
TCCR2 = 0x0A;
/**********************************************
检测传感器状态,没黑线时停下
***********************************************/
while(PIND.2||PIND.3); //关寻线
#asm("cli");
TCCR1A&=0XBF ;
TCCR1A&=0XEF;
TCCR2 = 0x00;
beep( );
start_PCF( );
delay_us(10);
#asm("sei");
/***********************************************
等待五秒,倒车返回
***********************************************/
PORTD.0=1;
PORTD.1=1;
while( Timer[0]!=0X05 ) ;
LCD_write_str( 0 , 1 , step[3] );
beep( );
OCR1AH=0x02;
OCR1AL =0xFF; //new
OCR1BH=0x02;
OCR1BL=0xFF;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
TCCR2 = 0x0A;
delay_ms(2000);
OCR1AH=0x01;
OCR1AL =0xFF; //new
OCR1BH=0x01;
OCR1BL=0xFF;
while(PIND.6||PIND.7);
beep( );
LCD_write_str( 0 , 1 , step[4] );
#asm("cli");
TCCR1A&=0XBF ;
TCCR1A&=0XEF;
}
/******************************************************
发挥部分
******************************************************/
void advance ( void )
{
unsigned char find=1;
unsigned char j=0;
LCD_write_str( 0 , 0 ,"min: sec: ");
start_PCF( );
PORTD.0=0 ;
PORTD.1=0;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
#asm("sei");
/*****************************************************
当两个传感器都在线上时开启寻线功能
*****************************************************/
while(find)
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
TCCR2 = 0x0A;
/*****************************************************
一定时间后,减速找平衡
*****************************************************/
while( Timer[0]<=0X30 );
while ( get_ad( ) < 0X7F ) ;
TCCR2 = 0x00;
/****************************************************
找到后,给出平衡指示,
*****************************************************/
do{
Findbenlen( );
PORTC.2=0;
flage+=0x80;
#asm("cli");
LCD_write_str( 0 , 1 ,display[j] );
LCD_write_str( 6 , 1 , "Balan:" );
flage+=0x04;
#asm("sei");
/******************************************************
检测平衡状态,不平衡时继续寻找
*******************************************************/
while( get_ad( ) < 0X81 && get_ad( )> 0X7B );
flage -=0x04;
BalanceTime=0; //平衡显示清零
LCD_write_str( 0, 1 , " " );
if(j<5)
j++;
else
j=0;
}
while(1);
/*******************************************************
找到后,给出平衡指示
*******************************************************/
/*******************************************************
Findbenlen( );
PORTC.2=0;
flage+=0x80;
CLI( );
LCD_write_str( 0 , 1 , display[1] );
LCD_write_str( 6 , 1 , "Balan:" );
flage+=0x04;
SEI( );
delay_ms( 5000 );
flage -=0x04; //关闭平衡显示
TCCR0 = 0x00; //关闭显示
MBgo ;
MAback ;
OCR1AH=0x02;
OCR1AL =0xFF; //new
OCR1BH=0x02;
OCR1BL=0xFF;
startCPA ;
startCPB ;
delay_ms( 4000 ); //速度减慢一倍,延时增加一倍
find=1;
LCD_write_str( 0 , 1 ,display[2] );
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ;
MAgo;
TCCR2 = 0x0A; //开寻线
delay_ms(5000);
//5秒后加速
OCR1AH=0x01;
OCR1AL =0xFF; //new
OCR1BH=0x01;
OCR1BL=0xFF;
delay_ms(5000);
//关寻线
TCCR2 = 0x00;
stopCPA ;
stopCPB;
MBgo ; //梦幻舞步
MAback;
startCPA ;
startCPB ;
find=1;
delay_ms(6000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ; //梦幻舞步
MAgo;
TCCR2 = 0x0A;
//开寻线
delay_ms(5000);
//***********************************************************************
反向转弯
//***********************************************************************
TCCR2 = 0x00;
stopCPA ;
stopCPB;
MBback ; //梦幻舞步
MAgo;
delay_ms(1000);
startCPA ;
startCPB ;
find=1;
delay_ms(6000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ; //梦幻舞步
MAgo;
TCCR2 = 0x0A;
**************************************************************************/
}
void demo( void )
{
unsigned char find=1;
LCD_write_str( 0 , 0 ,"min: sec: ");
start_PCF( );
PORTD.1=0 ;
PORTD.0=1;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
#asm("sei");
find=1;
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
PORTD.0=0 ;
PORTD.1=0;
TCCR2 = 0x0A; //开寻线
delay_ms(5000);
//5秒后加速
delay_ms(5000);
//关寻线
TCCR2 = 0x00;
TCCR1A&=0XBF ;
TCCR1A&=0XEF;
PORTD.0=0 ; //梦幻舞步
PORTD.1=1;
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
find=1;
delay_ms(10000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
PORTD.0=0 ; //梦幻舞步
PORTD.1=0;
TCCR2 = 0x0A;
//开寻线
delay_ms(8000);
//***********************************************************************
//反向转弯
//***********************************************************************
TCCR2 = 0x00;
TCCR1A&=0XBF ;
TCCR1A&=0XEF;
PORTD.0=1 ; //梦幻舞步
PORTD.1=0;
delay_ms(1000);
TCCR1A|=0X40 ;
TCCR1A|=0X10 ;
find=1;
delay_ms(9000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
PORTD.0=0 ; //梦幻舞步
PORTD.1=0;
TCCR2 = 0x0A;
}
void main ( void )
{
/*******************************************************
变量定义
*******************************************************/
unsigned char key;
/********************************************************
初始化设备
*********************************************************/
Init_IO( );
Init_T0( );
Init_T1( );
Init_T2( );
Init_TWI( );
Init_device( ) ;
LCD_init( );
delay_ms( 10 );
LCD_clear( );
delay_ms(1);
/********************************************************
模式选择
********************************************************/
key=SelectMode( );
switch (key)
{
case 0:
nomal ( );
break;
case 1:
advance ( );
break;
case 2:
demo( );
break;
default:
break;
};
while(1); //结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -