⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main__.c

📁 小车源程序工程,由pcf8565单片机控制
💻 C
📖 第 1 页 / 共 2 页
字号:
   ***************************************************/
   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 + -