功能描述
1、採用51單片機作為主控芯片
2、採用H橋驅動電機;
3、按鍵控制電機的開啓、停止、轉向、速度;
仿真設計
單片機管腳説明:
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)
{};
}
}
}