|
一個(gè)基于avr單片機(jī)的電動(dòng)車蹺蹺板最完整資料分享是山西省冠軍作品
全部資料51hei下載地址:
電動(dòng)車車蹺蹺板(論文 原理圖 PCB圖 程序).rar
(404.48 KB, 下載次數(shù): 46)
2018-4-12 23:36 上傳
點(diǎn)擊文件名下載附件
電動(dòng)蹺蹺板 下載積分: 黑幣 -5
0.jpg (34.03 KB, 下載次數(shù): 86)
下載附件
2018-4-13 02:33 上傳
0.png (45.7 KB, 下載次數(shù): 91)
下載附件
2018-4-13 02:33 上傳
Altium Designer畫的電動(dòng)車蹺蹺板電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.jpg (61.43 KB, 下載次數(shù): 85)
下載附件
2018-4-13 02:35 上傳
0.jpg (17.77 KB, 下載次數(shù): 90)
下載附件
2018-4-13 02:35 上傳
0.jpg (40.63 KB, 下載次數(shù): 93)
下載附件
2018-4-13 02:35 上傳
單片機(jī)源程序如下:
- /*****************************************************
- This program was produced by the
- CodeWizardAVR V1.25.6c Professional
- Automatic Program Generator
- ?Copyright 1998-2006 Pavel Haiduc, HP vula_adcfoTech s.r.l.
- Project : 小車
- Version : 0.00
- Author : momo
- Company : zhong bei da xue
- Comments:
- Chip type : ATmega16L
- Program type : Application
- Clock frequency : 1.000000 MHz
- Memory model : Small
- External SRAM size : 0
- Data Stack size : 256
- *****************************************************/
- #include "config.h"
- #define startCPA TCCR1A|=0X40
- #define startCPB TCCR1A|=0X10
- #define stopCPA TCCR1A&=0XBF
- #define stopCPB TCCR1A&=0XEF
- #define MBgo PORTD.0=0
- #define MBback PORTD.0=1
- #define MAgo PORTD.1=0
- #define MAback PORTD.1=1
- /****************************************************
- 全局變量聲明
- *****************************************************/
- volatile unsigned char flage=0X00;
- volatile unsigned char Timer[3]={0,0,0};
- volatile unsigned char write;
- volatile unsigned char BalanceTime=0;
- unsigned char vula_adc;
- flash char *step[5]={ "stepA","stepB","stepC","back ","over "} ;
- flash char *mode[3]={"normal","advanc","demo "};
- flash char *display[5]={"frist","sec ","tree ","four ","five "};
- /******************************************************
- 系統(tǒng)中斷 (顯示,蜂鳴)
- *******************************************************/
- interrupt [TIM0_COMP ] void tim0_comp_isr(void)
- {
- static unsigned char buzz;
- switch ( flage )
- {
- case 0X04:
- Timer[0]=Read_sec( );
- if( Timer[0]==Timer[2] )
- ;
- else
- {
- BalanceTime++;
- LCD_write_char( 13 , 1 , ( BalanceTime%10)+'0' );
- LCD_write_char( 12 , 1 , ( BalanceTime/10)+'0' );
- Timer[2]=Timer[0] ;
- }
- goto j1;
- break;
- case 0X84:
- Timer[0]=Read_sec( );
- if( Timer[0]==Timer[2] )
- ;
- else
- {
- BalanceTime++;
- LCD_write_char( 13 , 1 , ( BalanceTime%10)+'0' );
- LCD_write_char( 12 , 1 , ( BalanceTime/10)+'0' );
- Timer[2]=Timer[0] ;
- }
- case 0X80:
- if( (++buzz) == 10 )
- {
- buzz=0;
- PORTC.2=1;
- flage -=0x80;
- }
- j1:
- case 0X00:
- Timer[0]=Read_sec( );
- write=Timer[0];
- LCD_write_char( 11 , 0 , (write& 0x0f)+ '0' );
- LCD_write_char( 10 , 0 , ( (write>>4)&0x07) + '0' );
-
- Timer[1]=Read_miu( );
- write=Timer[1];
- LCD_write_char( 4 , 0 , (write& 0x0f)+'0');
- break;
-
- default: break;
- }
- }
- /*****************************************************************************
- 系統(tǒng)中斷T2 (尋線校正)
- *****************************************************************************/
- interrupt [TIM2_COMP ] void tim2_comp_isr(void)
- {
- if(PORTD.1==1)
- {
-
- if(PIND.6==1)
-
- startCPA;
-
- else
-
- stopCPA;
-
-
- if(PIND.7==1)
-
- startCPB;
-
- else
-
- stopCPB;
-
- }
- else
- {
- if(PIND.2==1)
-
- startCPA;
-
- else
-
- stopCPA;
-
-
- if(PIND.3==1)
-
- startCPB;
-
- else
-
- stopCPB;
- }
- }
- /**********************************************************
- 讀取ad值
- ***********************************************************/
- unsigned char get_ad(void) {
- unsigned char i;
- ADMUX = 0x60; /*基準(zhǔn)AVCC、左對(duì)齊、通道0*/
- ADCSRA = 0xC2;
- /*使能、開啟、4分頻*/
- while(!(ADCSRA & (1 << ADIF))); /*等待*/
- i = ADCH;
- ADCSRA &= ~(1 << ADIF); /*清標(biāo)志*/
- ADCSRA &= ~(1 << ADEN); /*關(guān)閉轉(zhuǎn)換*/
- return i;
- }
- /*********************************************************************
- 蜂鳴器函數(shù)
- *********************************************************************/
- void beep( void )
- {
- PORTC.2=0;
- delay_ms(500);
- PORTC.2=1;
- }
- /**********************************************************************
- 根據(jù)ad值選擇平衡調(diào)整模式
- **********************************************************************/
- unsigned char output( void )
- {
- if( vula_adc>=0X7D && vula_adc<=0X80 )
- return 0;
- if( vula_adc>=0X7C && vula_adc<=0X81 )
- return 1 ;
- if( vula_adc>=0X7B && vula_adc<=0X82 )
- return 2 ;
- if( vula_adc>=0X7A && vula_adc<=0X83)
- return 3 ;
- if( vula_adc>=0X79 && vula_adc<=0X84)
- return 4 ;
- if( vula_adc>=0X78 && vula_adc<=0X85)
- return 5 ;
- if( vula_adc>=0X77 && vula_adc<=0X86)
- return 6 ;
- if( vula_adc>=0X76 && vula_adc<=0X87)
- return 7 ;
- if( vula_adc>=0X75 && vula_adc<=0X88)
- return 8 ;
- if(vula_adc >=0X74 && vula_adc<= 0X89)
- return 9;
-
- }
- /**************************************************************************************************
- 平衡驅(qū)動(dòng)控制函數(shù)
- **************************************************************************************************/
- void mortorgo( unsigned char high , unsigned char low, unsigned int go_time, unsigned int back_time )
- {
- OCR1AH=high;
- OCR1AL = low; //new
- OCR1BH=high;
- OCR1BL= low;
-
- if( vula_adc<0x7F)
- {
- MAgo;
- MBgo;
- }
- else
- {
- MAback;
- MBback;
- }
-
- startCPA ;
- startCPB ;
-
- delay_ms( go_time ) ;
-
- stopCPA ;
- stopCPB;
-
- if( vula_adc<0x7F)
- {
- MAback;
- MBback;
- }
- else
- {
- MAgo;
- MBgo;
- }
-
- startCPA ;
- startCPB ;
-
- delay_ms( back_time ) ;
-
- stopCPA ;
- stopCPB;
- }
- void Findbenlen( void )
- {
- unsigned char Flage_balan=1;
- unsigned char Flage_select;
- unsigned char count=0;
- do{
-
- vula_adc = get_ad ( );
-
- Flage_select = output( ) ;
-
- switch ( output( ) ) {
- case 0 :
-
- stopCPA ;
- stopCPB;
- if(count<=9)
- count++;
- else
- Flage_balan=0;
- break;
- case 1 :
- count=0;
- mortorgo( 0x03,0xFF , 400, 350 ) ;
- break;
- case 2 :
- count=0;
- mortorgo( 0x02,0xFF , 800, 700 ) ;
- break;
- case 3 :
- count=0;
- mortorgo( 0x02,0xFF , 900, 800 ) ;
- break;
- case 4 :
- count=0;
- mortorgo( 0x02,0xFF , 900, 700 ) ;
- break;
- case 5 :
- count=0;
- mortorgo( 0x02,0xFF , 900, 650 ) ;
- break;
- case 6 :
- count=0;
- mortorgo( 0x02,0xFF , 900,600 ) ;
- break;
- case 7 :
- count=0;
- mortorgo( 0x02,0xFF , 1000, 700 ) ;
- break;
- case 8 :
- count=0;
- mortorgo( 0x02,0xFF , 1000,600 ) ;
- break;
- case 9 :
- count=0;
- mortorgo( 0x02,0xFF , 1000,500) ;
- break;
-
- default:
- count=0;
- mortorgo( 0x02,0xFF , 1000,500) ;
- break;
- };
- delay_ms(200);
- }
-
- while( Flage_balan );
- }
- unsigned char SelectMode ( void )
- {
- unsigned char temp=0;
- LCD_write_str( 0 , 0 ,"press START key");
- LCD_write_str( 0 , 1 ,"zhong bei da xue ");
-
- while( PINC.6 ==1 );
- while(PINC.6 ==0);
-
- LCD_clear( );
- LCD_write_str( 0 , 0 ,"mode:");
- 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 )
- {
- /*****************************************************
- 顯示時(shí)鐘,初始設(shè)置
- *****************************************************/
- LCD_write_str( 0 , 0 ,"minc: sec: ");
- LCD_write_str( 0 , 1 , step[0] );
- delay_ms(1000);
- beep( );
- start_PCF( );
- /********************************************************
- 小車動(dòng)作初始化
- ********************************************************/
- MBgo ;
- MAgo;
- OCR1AH=0x02;
- OCR1AL =0xFF; //new
- OCR1BH=0x02;
- OCR1BL=0xFF;
- startCPA ;
- startCPB ;
- delay_ms(2000);
- OCR1AH=0x01;
- OCR1AL =0xFF; //new
- OCR1BH=0x01;
- OCR1BL=0xFF;
- TCCR2 = 0x0A; //自動(dòng)尋線開
-
- SEI( ); //全局中斷開
- /**********************************************
- 第一階段
- **********************************************/
- while ( Timer[0] != 0X14 ) ;
- LCD_write_str( 0 , 1 , step[1] );
-
- CLI( );
- beep( );
- start_PCF( );
- SEI( );
- /************************************************
- 尋找平衡
- ************************************************/
- TCCR2 = 0x00; //尋線關(guān)
- Findbenlen( );
- PORTC.2=0;
- flage+=0x80; //開啟蜂鳴,中斷關(guān)閉
-
- /************************************************
- 找到平衡
- ************************************************/
- CLI( );
- start_PCF( ); //需要改動(dòng)
- LCD_write_str( 0 , 1 , step[2] );
- LCD_write_str( 6 , 1 , "Balan:" );
- flage+=0x04; //顯示平衡
- SEI( );
-
- do
- {
- if( Timer[0]==0X05 )
- {
- flage -=0x04;
- CLI( );
- start_PCF( );
- SEI( );
- }
- }
- while ( (flage==0X04 )|| ( flage==0X84 ) );
-
-
- /***************************************************
- 改變速度
- ***************************************************/
- CLI( );
- OCR1AH=0x01;
- OCR1AL =0xFF; //new
- OCR1BH=0x01;
- OCR1BL=0xFF;
- SEI( );
-
- MBgo;
- MAgo;
- startCPA ;
- startCPB ;
- /************************************************
- 慢走,直到傳感器感知木板落下
- ************************************************/
- TCCR2 = 0x0A;
- /**********************************************
- 檢測(cè)傳感器狀態(tài),沒黑線時(shí)停下
- ***********************************************/
- while(PIND.2||PIND.3); //關(guān)尋線
-
-
- 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;
- }
-
- /******************************************************
- 發(fā)揮部分
- ******************************************************/
- 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( );
- /*****************************************************
- 當(dāng)兩個(gè)傳感器都在線上時(shí)開啟尋線功能
- *****************************************************/
- while(find)
- {
- if( PIND.2==1 )
- find=0;
-
- if(PIND.3==1)
- find=0;
- } ;
-
- TCCR2 = 0x0A;
-
- /*****************************************************
- 一定時(shí)間后,減速找平衡
- *****************************************************/
- 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( );
- /******************************************************
- 檢測(cè)平衡狀態(tài),不平衡時(shí)繼續(xù)尋找
- *******************************************************/
- 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; //關(guān)閉平衡顯示
- TCCR0 = 0x00; //關(guān)閉顯示
-
- MBgo ;
- MAback ;
- OCR1AH=0x02;
- OCR1AL =0xFF; //new
- OCR1BH=0x02;
- OCR1BL=0xFF;
- startCPA ;
- startCPB ;
- delay_ms( 4000 ); //速度減慢一倍,延時(shí)增加一倍
- find=1;
- LCD_write_str( 0 , 1 ,display[2] );
-
- while(find) //當(dāng)兩個(gè)傳感器有一個(gè)在線上時(shí)
- {
- 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);
-
- //關(guān)尋線
- TCCR2 = 0x00;
-
- stopCPA ;
- stopCPB;
- MBgo ; //夢(mèng)幻舞步
- MAback;
- startCPA ;
- startCPB ;
-
- find=1;
- delay_ms(6000);
-
- while(find) //當(dāng)兩個(gè)傳感器有一個(gè)在線上時(shí)
- {
- if( PIND.2==1 )
- find=0;
-
- if(PIND.3==1)
- find=0;
- } ;
-
- MBgo ; //夢(mèng)幻舞步
- MAgo;
- TCCR2 = 0x0A;
- //開尋線
- delay_ms(5000);
-
- //***********************************************************************
- 反向轉(zhuǎn)彎
- //***********************************************************************
- TCCR2 = 0x00;
-
- stopCPA ;
- stopCPB;
- MBback ; //夢(mèng)幻舞步
- MAgo;
- delay_ms(1000);
- startCPA ;
- startCPB ;
-
- find=1;
- delay_ms(6000);
-
- while(find) //當(dāng)兩個(gè)傳感器有一個(gè)在線上時(shí)
- {
- if( PIND.2==1 )
- find=0;
-
- if(PIND.3==1)
- find=0;
- } ;
-
- MBgo ; //夢(mèng)幻舞步
- 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) //當(dāng)兩個(gè)傳感器有一個(gè)在線上時(shí)
- {
- if( PIND.2==1 )
- find=0;
-
- if(PIND.3==1)
- find=0;
- } ;
-
- MBgo ;
- MAgo;
-
- TCCR2 = 0x0A; //開尋線
-
- delay_ms(5000);
- //5秒后加速
-
-
- delay_ms(5000);
-
- //關(guān)尋線
- TCCR2 = 0x00;
-
- stopCPA ;
- stopCPB;
- MBgo ; //夢(mèng)幻舞步
- MAback;
- startCPA ;
- startCPB ;
-
- find=1;
- delay_ms(10000);
-
- while(find) //當(dāng)兩個(gè)傳感器有一個(gè)在線上時(shí)
- {
- if( PIND.2==1 )
- find=0;
-
- if(PIND.3==1)
- find=0;
- } ;
-
- MBgo ; //夢(mèng)幻舞步
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
|
|