#include <reg52.h> sbit LeftA1 = P1^0; sbit LeftA2 = P1^1; sbit LeftB1 = P1^2; sbit LeftB2 = P1^3; sbit EnLeft = P2^3; sbit RightA1 = P1^4; sbit RightA2 = P1^5; sbit RightB1 = P1^6; sbit RightB2 = P1^7; sbit EnRight = P2^4; unsigned char T0RH; unsigned char T0RL; signed long LeftBeats = 0; signed long RightBeats = 0; void ConfigTimer0(unsigned int ms); void StartLeftMotor(signed long angle); void StartRightMotor(signed long angle); unsigned char code BeatCode[8] = {//不同的引腳驅動代碼不一樣 0xE,0xA,0xB,0x9,0xD,0x5,0x7,0x6 }; void main() { EA = 1; EnLeft = 0; EnRight = 0; ConfigTimer0(3);//此值越大,轉的越慢 StartLeftMotor(360*25);//調整轉的角度 StartRightMotor(360*25); while (1); } void StartRightMotor(signed long angle) { EnRight = 1; EA = 0; RightBeats = (angle*400)/360; EA = 1; } void StartLeftMotor(signed long angle) { EnLeft = 1; EA = 0; LeftBeats = (angle*400)/360; EA = 1; } void LeftMotor() { unsigned char tmp; static unsigned char index = 0; if(LeftBeats != 0) { if(LeftBeats > 0) { index++; index = index & 0x07; LeftBeats--; } else { index--; index = index & 0x07; LeftBeats++; } tmp = P1; tmp = tmp & 0xF0; tmp = tmp | BeatCode[index]; P1 = tmp; } else { P1 = P1 | 0x0F; } } void RightMotor() { unsigned char tmp; static unsigned char index = 0; if(RightBeats != 0) { if(RightBeats > 0) { index--; index = index & 0x07; RightBeats--; } else { index++; index = index &0x07; RightBeats++; } tmp = P1; tmp &= 0x0F; tmp |= (BeatCode[index]<<4); P1 = tmp; } else { P1 = P1 | 0xF0; } } void ConfigTimer0(unsigned int ms) { unsigned long tmp; tmp = 12000000/12; tmp = (tmp * ms)/1000; tmp = 65536 - tmp; tmp = tmp + 2; T0RH = (unsigned char)(tmp >> 8); T0RL = (unsigned char)tmp; TH0 = T0RH; TL0 = T0RL; TMOD &= 0xF0; TMOD |= 0x01; ET0 = 1; TR0 = 1; } void InterruptTimer0() interrupt 1 { TH0 = T0RH; TL0 = T0RL; LeftMotor(); RightMotor(); } |