CHƯƠNG TRÌNH CHÍNH Main.c

Một phần của tài liệu 244480 (Trang 64 - 80)

Chương trình chính sẽ gọi các hàm khởi động, PCA, UART và các thiết lập ban đầu, sau đĩ là thực hiện cơng việc được gửi từ bàn phím.

#include <declare.h> uint_8 xdata memory[20]; uint_8 xdata memory_temp[20];

int speed_motor = 0, SPEED_TURN = 0, gear = 0, gear_turn = 0, uart_data_receive = 0;

void main() {

init_PCA();

//sau init_PCA() cac chan dieu khien dong co da duoc dieu xung pwm voi Fosc = //Fxtal/6;

//duty cycle = 0%; init_uart(); delay_us(100); while(1)

{ } }

4.2.2 HEADER declare.h

HEADER declare.h chứa một file header khai bào định nghĩa tên biến và các chương trình con sẽ dùng tới như điều khiển robot di chuyển, nhận tín hiệu, gửi tín hiệu, v..v.. tất cả được khai báo ở đây.

#ifndef _DELARE_H_ #define _DELARE_H_

#include <define_sfr_const.h> //func of delay_func.c/// void delay_ms(uint_8 time); void delay_us(uint_8 time); //func of int_PCA_timer.c // void init_PCA();

//int UART///////// void init_uart(void);

/////////////////////////////

//void receive_data() interrupt 4; //read data va process data

void read_data_uart(); void process_data(); ///////////////////// void choose_speed(); void inc_gear_turn(); void dec_gear_turn();

/////////xu ly hanh dong - Action.c //////////// void go_ahead(); void go_back(); void turn_left(); void turn_right(); void inc_gear(); void dec_gear();

//////////xu li di chuyen - Moving.c - 2 dong co left va right void switch_forward();

void switch_return();

void power_motor();//cap nguon cho dong co void power_motor_turn_left();

void power_motor_turn();

void power_motor_turn_right();

/////////xu ly gap va nha vat the (neu co) /* void switch_forward_up(); void switch_forward_cap(); void switch_return_up(); void switch_return_cap(); */ #endif 4.2.3 HEADER define_sfr_const.h

Module này chứa header p89v51.h của nhà sản xuất và thêm vào các định nghĩa bit để tiện bảo trì hay sửa chữa source. Header p89v5.h1 sẽ khơng được trình bày trong luận văn này.

#ifndef _DEFINEE_H_ #define _DEFINEE_H_ #include <P89V51.h>

typedef unsigned char uint_8; typedef unsigned int uint_16;

///////////////////////////////// //////////////////////////////////// sfr speed_motor_left = 0xFA; //sfr speed_motor_right = 0xFB; sfr speed_motor_right = 0xFE; sfr speed_motor_up = 0xFC; sfr speed_motor_cap = 0xFD; /////////////////////////////////////////

sbit p_switch_motor_left = P2^6; //pin controls switch for motor left -- = Ctrl_RELAY0

//sbit p_switch_motor_right = P2^7; //pin controls switch for motor right -- = Ctrl_RELAY1

sbit p_switch_motor_right = P1^2;

sbit p_switch_motor_up = P1^0; //pin controls switch for motor up - down -- = Ctrl_RELAY2

sbit p_switch_motor_cap = P1^1; //pin controls switch for motor cap - release -- = Ctrl_RELAY3

/////////////////////////////////////////// //define cho doc gamepad hoac matrix button /*

sbit p_key_1 = P3^5; sbit p_key_2 = P3^6;

sbit n_read_key_0 = P3^2; sbit n_read_key_1 = P3^3; */

#define p_en_switch_motor ET1; ////////////////////////////////////// #define SPEED_0 0 #define SPEED_1 70 #define SPEED_2 110 #define SPEED_3 160 #define SPEED_4 210 /////////////////////////////////////// #define SPEED_TURN_0 15 #define SPEED_TURN_1 25 /* #define SPEED_TURN_2 20 #define SPEED_TURN_3 25 */ ///////////////////////////////////// #define SPEED_MOTOR_CAP_OUT 170 #define SPEED_MOTOR_CAP_IN 170 #define SPEED_MOTOR_DOWN 170 #define SPEED_MOTOR_UP 140 //////////////////////////////////////// #define SPEED_DIFFER 10 ////////////////////////////////////// #define key_press 1 #define key_not_press 0 #define SWITCH_RETURN 0 ////////////////////////////////////////

#define SWITCH_FORWARD 1 //quy uoc de linh hoat trong viec #define SWITCH_RETURN 0 // cap nguon va xoay chieu

// 2 motor di dung cho di chuyen ve co ban la xoay nguoc chieu nhau khi lap vao than robo

// nhung se duoc thay doi de dang ve phan cung bang cach dau lai chieu cap nguon

// do do ta quy uoc 1-cap cho role de motor quay chay toi // 0-cap cho role de motor quay chay lui /*

ta quy dinh la:

- trong mang memory chua gia tri khoi dong cua cac phim nhan cu the la:

0/ len 1/ xuong 2/ trai 3/ phai

5/ so 2: dua xuong 6/ so 3: gap 7/ so 4: nha */ #endif 4.2.4 MODULE init_PCA_timer.c

Module init_PCA_timer.c chứa chương trình con thiết lập giá trị ban đầu và khởi động PCA để điều khiển 5 động cơ.

#include <declare.h> void init_PCA()

{

CCAPM0 = 0x42; //set P1.3 pwm mode CCAPM1 = 0x42; //set P1.4 pwm mode CCAPM2 = 0x42; //set P1.5 pwm mode CCAPM3 = 0x42; //set P1.6 pwm mode CCAPM4 = 0x42; //set P1.7 pwm mode

CMOD = 0x00; // thiet lap chia Fosc internal cho 6 lam pulse cho PCA

//thong wa 2 bit CPS1 va CPS0 trong CMOD // Internal clock tu Xtal

CCAP0H = 0;//thanh ghi gia tri dieu khien duty cycle cua 1 chu ki pwm

//CCAP0H Module 0 Capture HIGH add: FAH

CCAP0L = 0;//CCAP0L Module 0 Capture LOW add: EAH CCAP1H = 0; CCAP1L = 0; CCAP2H = 0; CCAP2L = 0; CCAP3H = 0; CCAP3L = 0; CCAP4H = 0; CCAP4L = 0;

//voi cac gia tri deu la 0 de bao dam motor dung yen sau khi reset

CR = 1;

/*The CCON SFR contains the run control bit for the PCA (CR) and the flags for the

PCA timer (CF) and each module (CCF4:0). To run the PCA the CR bit (CCON.6)

must be set by software. The PCA is shut off by clearing this bit. The CF bit (CCON.7)

is set when the PCA counter overflows and an interrupt will be generated if the ECF

bit in the CMOD register is set. The CF bit can only be cleared by software.*/ delay_ms(1); } /* void init_timer() {

T2MOD = 0; //T2MOD Bit 7 6 5 4 3 2 1 0 // Symbol - - - T2OE DCEN //T2OE:Timer 2 Output Enable bit. //DCEN:Down Count Enable bit.

T2CON = 0; //T2CON - Timer/counter 2 control register (address C8H) bit allocation

// Bit addressable; Reset value: 00H // Bit 7 6 5 4 3 2 1 0

// Symbol TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 // DATA SHEET PAGE 31/80 TO KNOW FUNCTION OF EACH BIT

RCAP2H = 0xFF;

RCAP2L = 0x01;//RCAP2H Timer2 Capture HIGH ADD CBH // RCAP2L Timer2 Capture LOW ADD CAH

ET2 = 1; //ET2 Timer 2 Interrupt Enable.

EA = 1; //EA Interrupt Enable Bit: EA = 1 interrupt(s) can be serviced, EA = 0

//interrupt servicing disabled.

TR2 = 1; //TR2 Start/stop control for Timer 2. A logic ‘1’ enables the timer to run.

/////////////////////// }

*/

4.2.5 MODULE delay_func.c

Module delay_func.c chứa các hàm xử lý delay, được tính tốn và căn chỉnh thời gian trên mơ phỏng proteus.

#include <declare.h>

void delay_ms(uint_8 time) { while(time--) { uint_8 a = 165; while(a--); } }

void delay_us(uint_8 time) {

while(time--); }

4.2.6 MODULE init_UART.c

Module init_UART.c chứa các hàm xử lý giá trị ban đầu cho giao tiếp UART, sử dụng timer tạo tốc độ baud, các hàm gửi và nhận dữ liệu.

#include <declare.h>

extern uint_8 xdata memory[20]; extern uint_8 xdata memory_temp[20];

extern int speed_motor, SPEED_TURN, gear, gear_turn, uart_data_receive;

/************************************************************* **********

Chuc nang: Khoi tao UART o mode 1, -Su dung dao dong Osc 11.0592Mhz -BAUDRATE: 9600

Gia tri tra ve: Khong co

De dung ket hop voi ngat uart, phai dat EA=1

************************************************************** **********/

/*void init_uart() {

//Cau hinh cho UART //Chon mode 1

SM0=0; SM1=1;

SM2=0; //Chu y neu load file header tu trang ban dan cua Philips

//phai sua lai SM3 thanh SM2!

//Chon Timer 2 la nguon sinh toc do Baud

//Cau hinh cho Timer 2, xem them o phan Timer 2 trong Datasheet

TCLK=1;

//T2OE=0; luu y thanh ghi T2MOD khong can thiep tung bit duoc //T2OE Timer 2 Output Enable bit. Used in programmable clock- out mode

//only.

T2MOD|=0x02;

//Cho Timer 2 chay TR2=1;

//Toc do Baud la 9600, luu y cong thuc 3 hoac bang 24 trong Datasheet

RCAP2H=0xFF; RCAP2L=0xB9;

// Khong co uu tien ngat //IP0&=0xEF;

//IP0H&=0xEF;

// Cho phep ngat noi tiep ES = 1;

} //Ket thuc ham khoi tao UART */

void init_uart()//dung trong truyen thong noi tiep {

SCON=0x50;//che do 8 bit du lieu,1 bit sart,1 bit stop TMOD&=0x0F;//

TMOD|=0x20;//timer1 in mode2

TH1=0xFD;//set baut rate at 9600(11.0592Mhz) TL1=0xFD;

ES=1;//cho phep ngat noi tiep

EA=1;//cho fep tat ca cac ngat TR1=1;//chay timer1

}

void send_data(char uart_data)//gui du lieu qua cong COM {

TI=0; //Transmit interrupt flag. Set by hardware at the end of the 8th bit time in

//mode 0, or at the stop bit in the other modes, in any serial //transmission. Must be cleared by software.

//SBUF=0x00; SBUF=uart_data;

while(TI==0){}//cho trong khi dang gui du lieu TI=0;

}

void receive_data() interrupt 4//nhan du lieu { RI=0; uart_data_receive=SBUF; read_data_uart(); //test_key(); process_data(); //process_key(); } 4.2.7 MODULE process_motor.c

Module process_motor.c chứa các hàm nhận dữ liệu điều khiển, sau đĩ thi hành lệnh. #include <declare.h>

///////////////////////////// extern uint_8 xdata memory[20]; extern uint_8 xdata memory_temp[20];

extern int speed_motor, SPEED_TURN, gear, gear_turn, uart_data_receive;

/////////////////////////// void read_data_uart()

{ if (uart_data_receive == 'w') memory[0] = key_press; else memory[0] = key_not_press; if (uart_data_receive == 's') memory[1]= key_press; else memory[1] = key_not_press; if (uart_data_receive == 'a') memory[2] = key_press; else memory[2] = key_not_press; if (uart_data_receive == 'd') memory[3] = key_press; else memory[3] = key_not_press; } /////////////////////////// void process_data()

{ /*ham process_key() la de tac dong chu yeu len 4 dong co mac dinh khi chua dung tang toc va ha toc thi dong co chay voi 1/2 cong suat

do RCAP2H = 0xFF; RCAP2L = 0x01; trong init.c*/

// thang, lui, trai, phai, ha toc, tang toc tac dong den 2 dong co

//////VIET LAI//////////

//neu nhan chong nhieu phim thi se khong co lenh nao duoc thuc hien

//////////// toi

if ((memory[0] == key_press) && (memory[1] != key_press) && (memory[2] != key_press) && (memory[3] != key_press)) ////////////nhan nut cho chay thang

go_ahead(); /////////// lui

if ((memory[1] == key_press) && (memory[0] != key_press) && (memory[2] != key_press) && (memory[3] != key_press))

go_back();

/////////// trai

if ((memory[2] == key_press) && (memory[0] != key_press) && (memory[1] != key_press) && (memory[3] != key_press))

turn_left(); //////////phai

if ((memory[3] == key_press) && (memory[1] != key_press) && (memory[2] != key_press) && (memory[0] != key_press))

turn_right(); ////////////////////////////////////////////////////////////// /////////////////////////////////////////// memory[0] = key_not_press; memory[1] = key_not_press; memory[2] = key_not_press; memory[3] = key_not_press; uart_data_receive = 0; } }

4.2.8 MODULE moving.c

Module moving.c chứa các hành động tác động lên cơng suất điều khiển động cơ cũng như chiều quay của động cơ.

#include <declare.h>

///////////////////////////// extern uint_8 xdata memory[20]; extern uint_8 xdata memory_temp[20];

extern int speed_motor, SPEED_TURN, gear, gear_turn, uart_data_receive;

//////////////////////////////////

void power_motor() //cho phep dong co chay chu chua co chieu quay cua dong co

{

speed_motor_left = speed_motor;

speed_motor_right = speed_motor;// + SPEED_DIFFER; }

void power_motor_turn() //cho phep dong co chay chu chua co chieu quay cua dong co

{

speed_motor_left = SPEED_TURN;

speed_motor_right = SPEED_TURN;// + SPEED_DIFFER; } void power_motor_turn_left() { speed_motor_left -= SPEED_TURN; speed_motor_right += SPEED_TURN; } void power_motor_turn_right() { speed_motor_left += SPEED_TURN; speed_motor_right -= SPEED_TURN; }

/*void no_power_motor() //dung cap nguon {

speed_motor_left = 0; speed_motor_right = 0; }

*/

void switch_forward() //chinh switch {

p_switch_motor_right = SWITCH_FORWARD; p_switch_motor_left = SWITCH_FORWARD; }

void switch_return() { p_switch_motor_right = SWITCH_RETURN; p_switch_motor_left = SWITCH_RETURN; } ///////////////////////////////////////////////////////////// 4.2.9 MODULE action.c

Module action.c chưac các hàm thực thi các lệnh di chuyển của động cơ như quẹo trái, phải, đi tới, lui, gắp, nhả vật, đưa vật lên, xuống.

#include <declare.h>

///////////////////////////// extern uint_8 xdata memory[20];

extern uint_8 xdata memory_temp[20]; extern int speed_motor, SPEED_TURN; extern int gear, gear_turn;

////////////////////////////////// void go_ahead() //bam phim w {

inc_gear();//tang so: thay doi chieu dong co (neu co); thay speed theo so dong co

power_motor();//cap nguon motor theo thong so speed

Một phần của tài liệu 244480 (Trang 64 - 80)

Tải bản đầy đủ (PDF)

(80 trang)