#include <89c51rd2.h> //************* Definicao dos sinais de hardware ***************** // Direccao do motor 1 P3.4 Out (1-frente 0-tras) // Direccao do motor 2 P3.5 Out (1-frente 0-tras) // PWM motor 1 (direito) P1.4 Out // PWM motor 2 (esquerdo) P1.5 Out //**************************************************************** sbit dir0 = P3^4; //Motores sbit dir1 = P3^5; bit fim_temp; unsigned int cont_ms; #define DIR(a,b) dir0=a; dir1=b // DIR(esquerdo,direito) #define SET_PWM(l,r) CCAP1H=(255-r); CCAP2H=(255-l) // SET_PWM(esquerdo,direito) //************* Rotina de interrupção do T/C0 ******************** void int_tc0(void) interrupt 1 using 1 { TL0 = 0x7E; TH0 = 0xf9; cont_ms--; if(cont_ms == 0) fim_temp = 1; } //************* Inicializacao do uC ****************************** void inic(void) { CKCON = 0x2f; // Clock dobrado, perifericos com 12 ciclos RCAP2H = 0xff; // T/C2 para gerar baud rate de 9600 bps RCAP2L = 0xbf; T2CON = 0x34; SCON = 0x52; // UART em modo 1 CMOD = 0; // PCA configuration CCON = 0x40; CCAPM1 = 0x42; // Configuração dos módulos para PWM CCAPM2 = 0x42; TMOD = 0x11; // T/Cs em modo de 16 bits TH0 = 0xf9; // T/C0 para gerar overflow em 1mS TL0 = 0x7E; IPL = 0x02; // Int do T/C0 com maior prioridade IE = 0x82; // Enable da int do T/C0 TR0 = 1; // T/C0 on } //************* Temporização ************************************* // Variável de entrada em mS void temporiza(unsigned int tempo) { cont_ms = tempo; fim_temp = 0; while(fim_temp == 0); } //************* PROGRAMA PRINCIPAL******************************** void main(void) { inic(); DIR(1,1); SET_PWM(0,0); while(1) { //************* ALTERAR O PROGRAMA SÓ A PARTIR DAQUI ************* temporiza(5000); //Temporiza 5S SET_PWM(100,100); //Anda para frente em linha recta ... temporiza(2000); //... durante 2S SET_PWM(0,70); //Roda para a esquerda ... temporiza(600); //... durante 0.6S SET_PWM(70,0); //Roda para a direita ... temporiza(600); //... durante 0.6S SET_PWM(0,0); //STOP ... temporiza(1000); //... durante 1S DIR(0,0); //Sentido rectaguarda SET_PWM(100,100); //Anda para trás em linha recta ... temporiza(2000); //... durante 2S SET_PWM(0,0); //STOP DIR(1,1); //Sentido frente } //Regressa ao início }