找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4102|回复: 1
打印 上一主题 下一主题
收起左侧

单片机电动车跷跷板(AD原理图 PCB图 源码)资料下载

[复制链接]
跳转到指定楼层
楼主
一个基于avr单片机的电动车跷跷板最完整资料分享是山西省冠军作品

全部资料51hei下载地址:
电动车车跷跷板(论文 原理图 PCB图 程序).rar (404.48 KB, 下载次数: 46)





Altium Designer画的电动车跷跷板电路原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /*****************************************************
  2. This program was produced by the
  3. CodeWizardAVR V1.25.6c Professional
  4. Automatic Program Generator
  5. ?Copyright 1998-2006 Pavel Haiduc, HP  vula_adcfoTech s.r.l.
  6. Project : 小车
  7. Version :  0.00
  8. Author  : momo                          
  9. Company : zhong bei da xue                       
  10. Comments:

  11. Chip type           : ATmega16L
  12. Program type        : Application
  13. Clock frequency     : 1.000000 MHz
  14. Memory model        : Small
  15. External SRAM size  : 0
  16. Data Stack size     : 256
  17. *****************************************************/
  18. #include "config.h"


  19. #define   startCPA    TCCR1A|=0X40
  20. #define   startCPB    TCCR1A|=0X10

  21. #define   stopCPA     TCCR1A&=0XBF
  22. #define   stopCPB     TCCR1A&=0XEF

  23. #define   MBgo          PORTD.0=0
  24. #define   MBback       PORTD.0=1

  25. #define   MAgo          PORTD.1=0
  26. #define   MAback       PORTD.1=1
  27. /****************************************************
  28. 全局变量声明
  29. *****************************************************/
  30. volatile unsigned char  flage=0X00;
  31. volatile unsigned char Timer[3]={0,0,0};
  32. volatile unsigned char  write;
  33. volatile unsigned char BalanceTime=0;     
  34. unsigned char  vula_adc;   
  35. flash char *step[5]={ "stepA","stepB","stepC","back ","over "} ;
  36. flash char *mode[3]={"normal","advanc","demo  "};
  37. flash char *display[5]={"frist","sec   ","tree  ","four  ","five  "};
  38. /******************************************************
  39. 系统中断    (显示,蜂鸣)
  40. *******************************************************/
  41. interrupt [TIM0_COMP ] void tim0_comp_isr(void)  
  42. {
  43.     static unsigned char buzz;
  44.     switch ( flage )
  45.      {
  46.     case 0X04:
  47.                     Timer[0]=Read_sec( );
  48.                    if( Timer[0]==Timer[2] )
  49.                    ;
  50.                    else  
  51.                    {
  52.                        BalanceTime++;
  53.                        LCD_write_char( 13 , 1 ,  ( BalanceTime%10)+'0' );
  54.                        LCD_write_char( 12 , 1 ,  ( BalanceTime/10)+'0' );  
  55.                        Timer[2]=Timer[0]   ;
  56.                     }
  57.                     goto j1;  
  58.                     break;
  59.     case 0X84:
  60.                    Timer[0]=Read_sec( );
  61.                    if( Timer[0]==Timer[2] )
  62.                    ;
  63.                    else  
  64.                    {
  65.                        BalanceTime++;
  66.                        LCD_write_char( 13 , 1 ,  ( BalanceTime%10)+'0' );
  67.                        LCD_write_char( 12 , 1 ,  ( BalanceTime/10)+'0' );  
  68.                        Timer[2]=Timer[0]   ;
  69.                     }
  70.    case 0X80:
  71.                     if( (++buzz) == 10 )
  72.                       {
  73.                             buzz=0;
  74.                              PORTC.2=1;
  75.                              flage -=0x80;   
  76.                             }                       
  77.      j1:
  78.     case 0X00:  
  79.                    Timer[0]=Read_sec( );
  80.                    write=Timer[0];         
  81.                    LCD_write_char( 11 , 0 ,   (write& 0x0f)+ '0' );   
  82.                    LCD_write_char( 10 , 0 ,   ( (write>>4)&0x07) + '0' );   
  83.                   
  84.                    Timer[1]=Read_miu( );         
  85.                    write=Timer[1];
  86.                    LCD_write_char(  4 , 0  ,  (write& 0x0f)+'0');      
  87.                    break;
  88.                   
  89.     default:   break;
  90.     }  
  91.   }
  92. /*****************************************************************************
  93. 系统中断T2     (寻线校正)
  94. *****************************************************************************/
  95.   interrupt [TIM2_COMP ] void tim2_comp_isr(void)  
  96. {
  97.      if(PORTD.1==1)
  98.        {
  99.          
  100.           if(PIND.6==1)
  101.            
  102.               startCPA;  
  103.                
  104.                else
  105.                  
  106.                      stopCPA;
  107.                        
  108.             
  109.           if(PIND.7==1)
  110.                
  111.               startCPB;
  112.                
  113.                 else        
  114.                
  115.                      stopCPB;     
  116.                        
  117.        }   
  118.       else
  119.         {
  120.            if(PIND.2==1)
  121.            
  122.               startCPA;  
  123.                     
  124.                 else
  125.                   
  126.                       stopCPA;
  127.                         
  128.             
  129.           if(PIND.3==1)
  130.             
  131.               startCPB;
  132.             
  133.                 else        
  134.                
  135.                       stopCPB;     
  136.          }      
  137. }  
  138. /**********************************************************  
  139. 读取ad值
  140. ***********************************************************/
  141. unsigned char get_ad(void) {

  142.         unsigned char i;
  143.          ADMUX = 0x60;                                      /*基准AVCC、左对齐、通道0*/
  144.                   ADCSRA = 0xC2;
  145.                                                                          /*使能、开启、4分频*/
  146.         while(!(ADCSRA & (1 << ADIF)));                             /*等待*/
  147.         i = ADCH;
  148.         ADCSRA &= ~(1 << ADIF);                              /*清标志*/
  149.         ADCSRA &= ~(1 << ADEN);                              /*关闭转换*/

  150.         return i;
  151. }   
  152. /*********************************************************************
  153. 蜂鸣器函数
  154. *********************************************************************/
  155. void beep( void )
  156. {
  157.    PORTC.2=0;
  158.    delay_ms(500);
  159.    PORTC.2=1;   
  160. }
  161. /**********************************************************************
  162. 根据ad值选择平衡调整模式
  163. **********************************************************************/
  164. unsigned char  output( void )
  165. {
  166.   if( vula_adc>=0X7D &&  vula_adc<=0X80 )
  167.                 return 0;
  168.    if(  vula_adc>=0X7C && vula_adc<=0X81 )
  169.                   return 1 ;
  170.     if(  vula_adc>=0X7B &&  vula_adc<=0X82 )
  171.                    return  2 ;
  172.       if(  vula_adc>=0X7A &&  vula_adc<=0X83)
  173.                     return 3 ;   
  174.        if(  vula_adc>=0X79 &&  vula_adc<=0X84)
  175.                      return  4 ;   
  176.           if(  vula_adc>=0X78 &&  vula_adc<=0X85)
  177.                       return  5 ;   
  178.             if(  vula_adc>=0X77 &&  vula_adc<=0X86)
  179.                         return  6 ;     
  180.           if(  vula_adc>=0X76 &&  vula_adc<=0X87)
  181.                           return  7  ;  
  182.        if(  vula_adc>=0X75 && vula_adc<=0X88)
  183.                             return  8 ;  
  184.       if(vula_adc >=0X74 && vula_adc<= 0X89)                     
  185.                            return 9;  
  186.                                                                                                 
  187. }   

  188. /**************************************************************************************************
  189. 平衡驱动控制函数
  190. **************************************************************************************************/
  191. void  mortorgo( unsigned char high , unsigned char low, unsigned int  go_time, unsigned int  back_time )
  192. {
  193.       OCR1AH=high;
  194.       OCR1AL = low;                                                      //new
  195.       OCR1BH=high;
  196.       OCR1BL= low;   
  197.       
  198.        if( vula_adc<0x7F)
  199.       {
  200.         MAgo;
  201.         MBgo;
  202.       }
  203.       else
  204.       {
  205.        MAback;
  206.        MBback;
  207.       }
  208.      
  209.       startCPA ;
  210.       startCPB ;
  211.       
  212.       delay_ms( go_time ) ;
  213.      
  214.       stopCPA ;
  215.       stopCPB;
  216.       
  217.        if( vula_adc<0x7F)
  218.       {
  219.        MAback;
  220.        MBback;
  221.       }
  222.       else
  223.       {
  224.         MAgo;
  225.         MBgo;
  226.       }
  227.       
  228.       startCPA ;
  229.       startCPB ;
  230.       
  231.       delay_ms( back_time ) ;   
  232.       
  233.       stopCPA ;
  234.       stopCPB;
  235. }
  236. void Findbenlen( void )
  237. {
  238.        unsigned char Flage_balan=1;
  239.        unsigned char Flage_select;
  240.        unsigned char count=0;
  241.    do{
  242.       
  243.        vula_adc = get_ad ( );
  244.       
  245.        Flage_select = output(  ) ;
  246.          
  247.       switch ( output(  ) ) {
  248.                       case 0 :
  249.                                     
  250.                                   stopCPA ;
  251.                                   stopCPB;
  252.                                   if(count<=9)
  253.                                        count++;
  254.                                      else
  255.                                        Flage_balan=0;
  256.                                  break;
  257.                       case 1 :  
  258.                                   count=0;
  259.                                   mortorgo( 0x03,0xFF , 400, 350 ) ;
  260.                                  break;
  261.                       case 2 :   
  262.                                   count=0;
  263.                                   mortorgo( 0x02,0xFF , 800, 700 ) ;
  264.                                  break;
  265.                       case 3 :
  266.                                  count=0;
  267.                                  mortorgo( 0x02,0xFF , 900, 800 ) ;
  268.                                  break;
  269.                       case 4 :   
  270.                                  count=0;
  271.                                  mortorgo( 0x02,0xFF , 900, 700 ) ;
  272.                                  break;
  273.                       case 5 :
  274.                                   count=0;
  275.                                 mortorgo( 0x02,0xFF , 900, 650 ) ;
  276.                                  break;
  277.                       case 6 :  
  278.                                   count=0;
  279.                                  mortorgo( 0x02,0xFF , 900,600 ) ;
  280.                                  break;  
  281.                        case 7 :
  282.                                   count=0;
  283.                                   mortorgo( 0x02,0xFF , 1000, 700 ) ;
  284.                                  break;   
  285.                        case 8 :
  286.                                  count=0;
  287.                                  mortorgo( 0x02,0xFF , 1000,600 ) ;
  288.                                 break;   
  289.                        case 9 :  
  290.                                   count=0;
  291.                                   mortorgo( 0x02,0xFF , 1000,500) ;
  292.                                   break;  
  293.                                                                  
  294.                     default:  
  295.                                   count=0;
  296.                                   mortorgo( 0x02,0xFF , 1000,500) ;
  297.                                  break;
  298.     };
  299.        delay_ms(200);
  300.   }

  301. while( Flage_balan );   
  302. }

  303. unsigned char SelectMode ( void )
  304. {
  305.   unsigned char temp=0;
  306.   LCD_write_str( 0 , 0 ,"press START key");  
  307.   LCD_write_str( 0 , 1 ,"zhong bei da xue ");

  308.   while( PINC.6 ==1 );   
  309.   while(PINC.6 ==0);
  310.   
  311.   LCD_clear( );
  312.   LCD_write_str( 0 , 0 ,"mode:");
  313.   LCD_write_str( 0 , 1 ,"select mode");  
  314.   LCD_write_str( 6 , 0 ,mode[0]);
  315.     delay_ms( 1000 );
  316.   do
  317.     {
  318.       if( PINC.7==0 )
  319.           {
  320.              while(PINC.7==0);
  321.                                 ++temp;
  322.          
  323.              if(temp==3)
  324.                 temp=0;
  325.                
  326.                LCD_write_str( 6 , 0 ,mode[temp]);  
  327.           }
  328.     }  
  329.      while(PINC.6==1);
  330.      while(PINC.6==0);  
  331.       LCD_clear( );
  332.    return(temp);
  333. }   

  334. /*******************************************************
  335. 基本要求部分
  336. *******************************************************/
  337. void nomal ( void )
  338. {
  339. /*****************************************************
  340. 显示时钟,初始设置
  341. *****************************************************/   
  342.     LCD_write_str( 0 , 0 ,"minc:  sec: ");
  343.     LCD_write_str( 0 ,  1 , step[0] );
  344.     delay_ms(1000);
  345.     beep(  );
  346.     start_PCF( );
  347. /********************************************************
  348.   小车动作初始化
  349. ********************************************************/  
  350.     MBgo ;  
  351.     MAgo;   
  352.     OCR1AH=0x02;
  353.     OCR1AL =0xFF;                                                       //new
  354.     OCR1BH=0x02;
  355.     OCR1BL=0xFF;
  356.     startCPA ;
  357.      startCPB ;  
  358.     delay_ms(2000);  
  359.     OCR1AH=0x01;
  360.     OCR1AL =0xFF;                                                       //new
  361.     OCR1BH=0x01;
  362.     OCR1BL=0xFF;
  363.     TCCR2  = 0x0A;                                   //自动寻线开
  364.    
  365.     SEI( );                                                  //全局中断开   
  366.     /**********************************************
  367.     第一阶段
  368.     **********************************************/
  369.    while ( Timer[0] != 0X14 ) ;
  370.    LCD_write_str( 0 ,  1 , step[1] );
  371.   
  372.    CLI( );
  373.    beep(  );
  374.    start_PCF( );
  375.    SEI( );
  376.    /************************************************
  377.    寻找平衡
  378.    ************************************************/   
  379.    TCCR2  = 0x00;                                      //寻线关
  380.     Findbenlen(  );
  381.     PORTC.2=0;
  382.     flage+=0x80;                                        //开启蜂鸣,中断关闭   
  383.    
  384.    /************************************************
  385.    找到平衡
  386.    ************************************************/
  387.    CLI( );
  388.    start_PCF( );                                                     //需要改动
  389.    LCD_write_str( 0 ,  1 , step[2] );
  390.    LCD_write_str( 6 ,  1 , "Balan:"  );
  391.    flage+=0x04;                                                      //显示平衡
  392.     SEI( );  
  393.    
  394.     do  
  395.        {   
  396.         if( Timer[0]==0X05 )
  397.             {
  398.                          flage -=0x04;
  399.                          CLI( );
  400.                          start_PCF( );
  401.                          SEI( );
  402.             }
  403.        }
  404.    while ( (flage==0X04 )|| ( flage==0X84  ) );  
  405.    
  406.    
  407.    /***************************************************
  408.    改变速度
  409.    ***************************************************/
  410.    CLI( );
  411.    OCR1AH=0x01;
  412.    OCR1AL =0xFF;                                                       //new
  413.    OCR1BH=0x01;
  414.    OCR1BL=0xFF;
  415.    SEI( );
  416.    
  417.     MBgo;
  418.     MAgo;     
  419.     startCPA ;
  420.     startCPB ;
  421.   /************************************************
  422.    慢走,直到传感器感知木板落下
  423.   ************************************************/
  424.   TCCR2  = 0x0A;
  425.    /**********************************************
  426.    检测传感器状态,没黑线时停下
  427.    ***********************************************/
  428.   while(PIND.2||PIND.3);                                           //关寻线   
  429.          
  430.    
  431.   CLI( );  
  432.   stopCPA ;
  433.   stopCPB;
  434.   TCCR2  = 0x00;  
  435.   beep(  );
  436.   start_PCF( );
  437.   delay_us(10);
  438.   SEI( );
  439.   /***********************************************
  440.    等待五秒,倒车返回
  441.   ***********************************************/  
  442.   MBback;
  443.   MAback;
  444.   while( Timer[0]!=0X05 )  ;
  445.   LCD_write_str( 0 ,  1 , step[3] );
  446.   beep(  );  

  447.   OCR1AH=0x02;
  448.   OCR1AL =0xFF;                                                       //new
  449.   OCR1BH=0x02;
  450.   OCR1BL=0xFF;
  451.   
  452.   startCPA ;
  453.   startCPB ;

  454.    TCCR2  = 0x0A;  

  455.   delay_ms(2000);  
  456.   
  457.    OCR1AH=0x01;
  458.   OCR1AL =0xFF;                                                       //new
  459.   OCR1BH=0x01;
  460.   OCR1BL=0xFF;


  461.    while(PIND.6||PIND.7);  
  462.    beep( );  
  463.    LCD_write_str( 0 ,  1 , step[4] );   
  464.    
  465.    CLI( );

  466.    stopCPA ;
  467.   stopCPB;  
  468. }        

  469.   /******************************************************
  470.   发挥部分
  471.   ******************************************************/   
  472. void advance ( void )
  473. {
  474.    unsigned char find=1;
  475.    unsigned char j=0;
  476.       
  477.    LCD_write_str( 0 , 0 ,"min:  sec: ");
  478.    
  479.    start_PCF( );
  480.      
  481.    MBgo ;  
  482.    MAgo;
  483.    startCPA  ;
  484.    startCPB  ;
  485.    
  486.     SEI( );  
  487. /*****************************************************
  488.  当两个传感器都在线上时开启寻线功能
  489. *****************************************************/
  490.    while(find)  
  491.    {
  492.      if( PIND.2==1 )  
  493.         find=0;  
  494.         
  495.       if(PIND.3==1)  
  496.          find=0;  
  497.    } ;
  498.    
  499. TCCR2  = 0x0A;

  500. /*****************************************************
  501. 一定时间后,减速找平衡
  502. *****************************************************/   
  503.     while( Timer[0]<=0X30  );
  504.     while ( get_ad( ) < 0X7F ) ;
  505.        TCCR2  = 0x00;
  506. /****************************************************
  507. 找到后,给出平衡指示,
  508. *****************************************************/   
  509.   do{
  510.         Findbenlen(  );
  511.         PORTC.2=0;
  512.         flage+=0x80;
  513.         
  514.          CLI( );
  515.          LCD_write_str( 0 ,  1 ,display[j] );
  516.          LCD_write_str( 6 ,  1 , "Balan:"  );
  517.          flage+=0x04;
  518.          SEI( );
  519. /******************************************************
  520. 检测平衡状态,不平衡时继续寻找
  521. *******************************************************/   
  522.           while( get_ad( ) < 0X81 &&  get_ad( )>  0X7B );
  523.           flage -=0x04;
  524.           BalanceTime=0;                                                  //平衡显示清零                                             
  525.           LCD_write_str( 0,  1 , "                                   "  );  
  526.          if(j<5)
  527.           j++;
  528.           else
  529.           j=0;
  530.      }
  531.     while(1);      
  532.    
  533. /*******************************************************
  534. 找到后,给出平衡指示
  535. *******************************************************/  
  536. /*******************************************************   
  537.    Findbenlen(  );
  538.    PORTC.2=0;
  539.    flage+=0x80;  
  540.         
  541.    CLI( );
  542.    LCD_write_str( 0 ,  1 , display[1] );
  543.    LCD_write_str( 6 ,  1 , "Balan:"  );
  544.    flage+=0x04;
  545.    SEI( );  
  546.    
  547.     delay_ms( 5000 );
  548.     flage -=0x04;                                                         //关闭平衡显示                                       
  549.     TCCR0  = 0x00;                                                     //关闭显示     
  550.   
  551.     MBgo ;
  552.     MAback ;
  553.     OCR1AH=0x02;
  554.     OCR1AL =0xFF;                                                       //new
  555.     OCR1BH=0x02;
  556.     OCR1BL=0xFF;
  557.     startCPA  ;
  558.     startCPB  ;
  559.     delay_ms( 4000 );                                                  //速度减慢一倍,延时增加一倍        
  560.      find=1;
  561.       LCD_write_str( 0 ,  1 ,display[2] );
  562.    
  563.      while(find)                                                //当两个传感器有一个在线上时
  564.    {
  565.      if( PIND.2==1 )  
  566.         find=0;  
  567.         
  568.       if(PIND.3==1)  
  569.          find=0;  
  570.    } ;   
  571.    
  572.     MBgo ;
  573.     MAgo;  
  574.    
  575.     TCCR2  = 0x0A;                                               //开寻线
  576.                            
  577.     delay_ms(5000);
  578.                                                                           //5秒后加速
  579.     OCR1AH=0x01;
  580.     OCR1AL =0xFF;                                                       //new
  581.     OCR1BH=0x01;
  582.     OCR1BL=0xFF;  
  583.      
  584.     delay_ms(5000);  
  585.      
  586.                                                                            //关寻线
  587.     TCCR2  = 0x00;
  588.    
  589.     stopCPA ;
  590.      stopCPB;
  591.     MBgo ;                                                              //梦幻舞步
  592.     MAback;   
  593.     startCPA  ;
  594.     startCPB  ;
  595.    
  596.     find=1;
  597.     delay_ms(6000);   
  598.      
  599.        while(find)                                                //当两个传感器有一个在线上时
  600.    {
  601.      if( PIND.2==1 )  
  602.         find=0;  
  603.         
  604.       if(PIND.3==1)  
  605.          find=0;  
  606.   } ;   
  607.   
  608.     MBgo ;                                                              //梦幻舞步
  609.     MAgo;  
  610.      TCCR2  = 0x0A;
  611.                                                     //开寻线  
  612.      delay_ms(5000);   
  613.       
  614. //***********************************************************************
  615. 反向转弯
  616. //***********************************************************************   
  617.       TCCR2  = 0x00;
  618.    
  619.      stopCPA ;
  620.      stopCPB;
  621.     MBback ;                                                              //梦幻舞步
  622.     MAgo;   
  623.     delay_ms(1000);
  624.     startCPA  ;
  625.     startCPB  ;
  626.    
  627.     find=1;
  628.     delay_ms(6000);   
  629.      
  630.        while(find)                                                //当两个传感器有一个在线上时
  631.    {
  632.      if( PIND.2==1 )  
  633.         find=0;  
  634.         
  635.       if(PIND.3==1)  
  636.          find=0;  
  637.   } ;   
  638.   
  639.     MBgo ;                                                              //梦幻舞步
  640.     MAgo;  
  641.      TCCR2  = 0x0A;
  642.      
  643.   **************************************************************************/                                                   
  644. }   

  645. void demo( void )
  646. {
  647.    
  648.     unsigned char find=1;
  649.    
  650.     LCD_write_str( 0 , 0 ,"min:  sec: ");
  651.    
  652.     start_PCF( );
  653.      
  654.     MAgo ;  
  655.     MBback;
  656.     startCPA  ;
  657.     startCPB  ;
  658.    
  659.     SEI( );  

  660.      find=1;
  661.    
  662.      while(find)                                                //当两个传感器有一个在线上时
  663.    {
  664.      if( PIND.2==1 )  
  665.         find=0;  
  666.         
  667.       if(PIND.3==1)  
  668.          find=0;  
  669.    } ;   
  670.    
  671.     MBgo ;
  672.     MAgo;  
  673.    
  674.     TCCR2  = 0x0A;                                               //开寻线
  675.                            
  676.     delay_ms(5000);
  677.                                                                           //5秒后加速
  678.    
  679.      
  680.     delay_ms(5000);  
  681.      
  682.                                                                            //关寻线
  683.     TCCR2  = 0x00;
  684.    
  685.     stopCPA ;
  686.      stopCPB;
  687.     MBgo ;                                                              //梦幻舞步
  688.     MAback;   
  689.     startCPA  ;
  690.     startCPB  ;
  691.    
  692.     find=1;
  693.     delay_ms(10000);   
  694.      
  695.        while(find)                                                //当两个传感器有一个在线上时
  696.    {
  697.      if( PIND.2==1 )  
  698.         find=0;  
  699.         
  700.       if(PIND.3==1)  
  701.          find=0;  
  702.   } ;   
  703.   
  704.     MBgo ;                                                              //梦幻舞步
  705. ……………………

  706. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:552794 发表于 2019-6-14 08:54 | 只看该作者
下载学习。
我的C编程出现非常低级的问题:如OCR1AL =0xFF;  其中“x”是用键盘中的x键吗?编译提示出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表