功能描述

1、採用51單片機作為主控芯片

2、採用H橋驅動電機;

3、按鍵控制電機的開啓、停止、轉向、速度;

仿真設計

基於單片機-H橋電機調速 (程序+仿真) 5065_引腳

單片機管腳説明:

P0端口(P0.0-P0.7):P0口為一個8位漏極開路雙向I/O口,每個引腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用於外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。

P1端口(P1.0-P1.7):P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩衝器能接收輸出4TTL門電流。P1口管腳寫入1後,被內部上拉為高電平,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由於內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。

P2端口(P2.0-P2.7):P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩衝器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。並因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由於內部上拉的緣故。P2口,用於外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。

P3端口(P3.0-P3.7):P3口管腳是一個帶有內部上拉電阻的8位的雙向I/O端口,可接收輸出4個TTL門電流。當P3口寫入“1”後,它們被內部上拉為高電平,並用作輸入。作為輸入端時,由於外部下拉為低電平,P3口將輸出電流(ILL)。P3口同時為閃爍編程和編程校驗接收一些控制信號。

VCC(40):供電電壓,其工作電壓為5V。
GND(20):接地。

RST(9):復位輸入。在振盪器運行時,有兩個機器週期(24個振盪週期)以上的高電平出現在此引腳時,將使單片機復位,只要這個引腳保持高電平,51芯片便循環復位。復位後P3.0-P3.7口均置1,引腳表現為高電平,程序計數器和特殊功能寄存器SFR全部清零。當復位腳由高電平變為低電平時,芯片為ROM的00H處開始運行程序。復位操作不會對內部RAM有所影響。

ALE/PROG (30):當訪問外部存儲器時,地址鎖存允許的輸出電平用於鎖存地址的地低位字節。在FLASH編程期間,此引腳用於輸入編程脈衝。在平時,ALE端以不變的頻率週期輸出正脈衝信號,此頻率為振盪器頻率的1/6。因此它可用作對外部輸出的脈衝或用於定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈衝。如果想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,則置位無效。

PSEN(29):外部程序存儲器的選通信號。在由外部程序存儲器取指令期間,每個機器週期兩次PSEN有效。但在訪問外部數據存儲器時,這兩次有效的PSEN信號將不出現。

XTAL1(19):來自反向振盪放大器的輸入及內部時鐘工作電路的輸入。
XTAL2(18):來自反向振盪器的輸出。

EA/VPP(31):當EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,EA將內部鎖定為RESET;當EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用於施加12V的編程電源(VPP)。

程序設計

#include   <reg51.h>   
  typedef   unsigned   char   uchar;   
  sbit   P0_0=P0^0;
  sbit   P0_1=P0^1; 
  sbit   P0_2=P0^2;
  sbit   P0_3=P0^3;
  sbit   P0_4=P0^4;
  sbit   P2_0=P2^0;
  sbit   P2_1=P2^1;
  sbit   P2_2=P2^2;
  sbit   P2_3=P2^3;
  sbit   P2_4=P2^4;
  sbit   P3_4=P3^4;   
 
  uchar   time=0;   
  uchar   period=30;   
  uchar   high=10; 
  uchar   th0=0;
  uchar   tl0=1;
  bit    dir;
  
    
  void dealy()
  {
   uchar i;
   for(i=0;i<100;i++);

  }


  void   timer0()   interrupt   1   using   1   
  {   
            TH0=0xfc;     /*定時器初值重裝載*/   
            TL0=0x18;
            
            time++; 
			P3_4=~P3_4;  
      if(dir==1)
	  {
			
			if(time==high)   /*高電平持續時間結束,變低*/   
               P2_0=th0;		 /*經過反相器反相*/
			    
			    
            else   if(time==period)     /*週期時間到,變高*/   
                      {   time=0;   
                          P2_0=tl0;		/*經過反相器反相*/
						  
						   
                      }   
    		  
		}
		 else	  if(time==high)   /*高電平持續時間結束,變低*/   
            
			   P2_1=th0;		 /*經過反相器反相*/
			    
			   
                  else   if(time==period)     /*週期時間到,變高*/   
                      {   time=0;   
                          P2_1=tl0;		/*經過反相器反相*/					  
                      }  	
} 



 void   main()   
  {   

		P0=0x00;
		P2=0x00;

        TMOD=0x01;   /*定時器0方式1*/   
        TH0=0xfc;     /*定時器裝載初值,設置脈衝信號的佔空比為1/5*/   
        TL0=0x18; 
		
         
        ET0=1;   /*開定時器0中斷*/   
        TR0=1;    /*啓動定時器0*/ 
	
	
        while(1)    
        {
			if(P0_0==1)
	        EA=1;     /*開CPU中斷*/

		 	if(P0_1==1)
			EA=0;	 /*關CPU中斷*/

			if(P0_2==1)
			{
			dir=~dir;  /*轉向控制*/
			while(P0_2!=0)
			{};

			}

			if(P0_3==1)
			{

			 high++;
			 if(high==30)
			 high=0;
			while(P0_3!=0)
			{};
			 }
		 }   
    

}