📄 main__.c
字号:
***************************************************/
CLI( );
OCR1AH=0x01;
OCR1AL =0xFF; //new
OCR1BH=0x01;
OCR1BL=0xFF;
SEI( );
MBgo;
MAgo;
startCPA ;
startCPB ;
/************************************************
慢走,直到传感器感知木板落下
************************************************/
TCCR2 = 0x0A;
/**********************************************
检测传感器状态,没黑线时停下
***********************************************/
while(PIND.2||PIND.3); //关寻线
CLI( );
stopCPA ;
stopCPB;
TCCR2 = 0x00;
beep( );
start_PCF( );
delay_us(10);
SEI( );
/***********************************************
等待五秒,倒车返回
***********************************************/
MBback;
MAback;
while( Timer[0]!=0X05 ) ;
LCD_write_str( 0 , 1 , step[3] );
beep( );
OCR1AH=0x02;
OCR1AL =0xFF; //new
OCR1BH=0x02;
OCR1BL=0xFF;
startCPA ;
startCPB ;
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] );
CLI( );
stopCPA ;
stopCPB;
}
/******************************************************
发挥部分
******************************************************/
void advance ( void )
{
unsigned char find=1;
unsigned char j=0;
LCD_write_str( 0 , 0 ,"min: sec: ");
start_PCF( );
MBgo ;
MAgo;
startCPA ;
startCPB ;
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;
CLI( );
LCD_write_str( 0 , 1 ,display[j] );
LCD_write_str( 6 , 1 , "Balan:" );
flage+=0x04;
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( );
MAgo ;
MBback;
startCPA ;
startCPB ;
SEI( );
find=1;
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ;
MAgo;
TCCR2 = 0x0A; //开寻线
delay_ms(5000);
//5秒后加速
delay_ms(5000);
//关寻线
TCCR2 = 0x00;
stopCPA ;
stopCPB;
MBgo ; //梦幻舞步
MAback;
startCPA ;
startCPB ;
find=1;
delay_ms(10000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ; //梦幻舞步
MAgo;
TCCR2 = 0x0A;
//开寻线
delay_ms(8000);
//***********************************************************************
//反向转弯
//***********************************************************************
TCCR2 = 0x00;
stopCPA ;
stopCPB;
MBback ; //梦幻舞步
MAgo;
delay_ms(1000);
startCPA ;
startCPB ;
find=1;
delay_ms(9000);
while(find) //当两个传感器有一个在线上时
{
if( PIND.2==1 )
find=0;
if(PIND.3==1)
find=0;
} ;
MBgo ; //梦幻舞步
MAgo;
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); //结束
}
/*********************************************************************************************/
/********************以下是对ATmega16的自带I2C定义和使用**************************************/
/*********************************************************************************************/
#include "config.h"
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
#include "TWI.h"
/*
extern void Init_TWI(void) ; //TWI初始化
extern uchar TWI_Send(uchar Slave,uchar Address,uchar Data); //向IIC地址为Slave的从机的Address地址发送(写)一字节数据Data
extern uchar TWI_SendStr(uchar Slave,uchar Address,uchar *Array,uchar CNT) ; //向IIC地址为Slave的从机的Address地址开始发送N字节数据Data
extern uchar TWI_Receive(uchar Slave,uchar Address) ; //从IIC地址为Slave的从机的Address地址读取一字节数据Data,返回值为读取的数据
*/
//************TWI初始化*************/
/****************************************************
*****************************************************
向IIC地址为Slave的从机的Address地址发送(写)一字节数据Data
返回0:写成功
返回非0:写失败
******************************************************
******************************************************/
uchar TWI_Send(uchar Slave,uchar Address,uchar Data)
{
TWCR=0x80|0x20|0x04; //或:TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);对TWINT写1清除,使能TWI,发出Start信号
while((TWCR&0x80)!=0x80) ; //或:while (!(TWCR & (1<<TWINT)));等待TWINT置位,表明Start信号已发出
if((TWSR&0xf8)!=0x08) //或:if ((TWSR & 0xF8) != START),检测状态寄存器,屏蔽预分频位,如果状态字不是START转出错处理
return(1); //返回值1,表明从机没有对Start信号作应答
//Slave即SLA+W,即是从机地址 ,可以是0x18或0x20,此处只用0x18
//所谓的应答是“从器件”在收到地址和“写”后,将SDA电压拉低,由“主器件”读取
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -