Đề tài Điều khiển động cơ servo (+ code )

A. Code chương trình // chuong trinh dieu khien dong co servo #include #define data P2 // khai báo P2 xuất dữ liệu ra LCD #define key P0 // Port0 sử dụng cho bàn phím #define port P1 sbit output = port^0; //khai bao bien sbit rs = port^3; sbit rw = port^4; sbit en = port^5; sbit hang1 = key^0; sbit hang2 = key^1; sbit hang3 = key^2; sbit hang4 = key^3; sbit cot1 = key^4; sbit cot2 = key^5; sbit cot3 = key^6; int dem=0,time=0,ktra, so[3];

docx7 trang | Chia sẻ: ngtr9097 | Lượt xem: 2291 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Đề tài Điều khiển động cơ servo (+ code ), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Code chương trình // chuong trinh dieu khien dong co servo #include #define data P2 // khai báo P2 xuất dữ liệu ra LCD #define key P0 // Port0 sử dụng cho bàn phím #define port P1 sbit output = port^0; //khai bao bien sbit rs = port^3; sbit rw = port^4; sbit en = port^5; sbit hang1 = key^0; sbit hang2 = key^1; sbit hang3 = key^2; sbit hang4 = key^3; sbit cot1 = key^4; sbit cot2 = key^5; sbit cot3 = key^6; int dem=0,time=0,ktra, so[3]; void delay(unsigned int ms) // chuong trinh delay { int i,j; for(i=0;i<ms;i++) for(j=0;j<1275;j++); } void lcd_cmd(unsigned char item) // chương trình hiển thị lệnh lên LCD { data = item; rs= 0; // rs=0 thanh ghi lenh; rs=1 thanh ghi du lieu rw=0; // ghi vao LCD en=1; // delay(1); // tao xung cho LCD chay en=0; return; // ket thuc chuong trinh con } void lcd_data(unsigned char item) // nạp dữ liệu vào LCD { data = item; rs= 1; // dua du lieu vao LCD rw=0; en=1; delay(1); en=0; return; //ket thuc chuong trinh con } void lcd_data_string(unsigned char *str) // tạo chuỗi ký tự. { int i=0; while(str[i]!='\0') // lap vong tai i, khac 0 thi lap lai { lcd_data(str[i]); // hien thi ky tu thuong trong i i++; // tang i len 1 don vi delay(10); } return; } void lcd_data_int(int time_val) // tao 3 so hien thi goc quay tren LCD { int int_amt; // int_amt = time_val/100; // lay gia tri cua time/100 duoc chu so hang tram lcd_data(int_amt+48); // chuyen ma ASCII ve so thap phan va hien thi time_val = time_val%100; // lay phan du khi time/100 gan vao time_val int_amt = time_val/10; // lay phan du o tren /10 duoc chu so hang chuc lcd_data(int_amt+48); // chuyen ma ASCII thanh thap phan, hien thi int_amt = time_val%10; // lay phan du cua time_val/10 duoc so hang d/vi lcd_data(int_amt+48); // chuyen ma ASCII thanh thap phan, hien thi } void shape() // hien thi do len LCD { lcd_cmd(64); lcd_data(2); lcd_data(5); lcd_data(2); lcd_data(0); lcd_data(0); lcd_data(0); lcd_data(0); lcd_data(0); } void timer(unsigned int ms) // tao xung de dieu khien servo { unsigned int i; TR1=1; for(i=0;i<ms;i++) { while(TF1==0); TF1=0; } TR1=0; } void digit_set(int num) // kiem soat so dang nhan nhan phim { if(dem==4) // số lần nhấn bằng 4 { lcd_cmd(0x01); lcd_data_string("thuc hien:"); // hien thi len lcd ktra=num; // kiem tra so da nhan } else { ktra=0; if(dem==1) //gia tri dem bang 1 so[0]=num; // so thu nhat else { if(dem==2) // gia tri dem bang 2 { so[1]=so[0]; // so thu 2 so[0]=num; // so thu nhat } else if(dem==3) // giá tri dem bang 3 { so[2]=so[1]; //so thu 3 thay the vi tri so thu 2 so[1]=so[0]; // so thu 2 thay the vi tri so thu 1 so[0]=num; // so dau tien bang num } } lcd_data((num+48)); // chuyen ma ASCII => thap phan, hien thi } } void ktra_cot1() // kiem tra cot 1 { hang1=hang2=hang3=hang4=1; hang1=0; if(cot1==0) // Key 1 { delay(20); dem=dem+1; // gia tri dang dem +1 digit_set(1); // cai dat so dang nhan la 1 } hang1=1; hang2=0; if(cot1==0) // Key 4 { delay(20); dem=dem+1; digit_set(4); } hang2=1; hang3=0; if(cot1==0) // Key 7 { delay(20); dem=dem+1; digit_set(7); } hang3=1; hang4=0; if(cot1==0) // Key * { delay(20); dem=dem+1; if(dem==4) // gia tri dem = 4 (nhan nut lan thu 4) { digit_set(10); // dat so 10 } else { dem=4; digit_set(10); } } hang4=1; } void ktra_cot2() //kiem tra cot 2 { hang1=hang2=hang3=hang4=1; hang1=0; if(cot2==0) // Key 2 { delay(20); dem=dem+1; // gia tri dang dem tang len 1 digit_set(2); } hang1=1; hang2=0; if(cot2==0) // Key 5 { delay(20); dem=dem+1; digit_set(5); } hang2=1; hang3=0; if(cot2==0) // Key 8 { delay(20); dem=dem+1; digit_set(8); } hang3=1; hang4=0; if(cot2==0) // Key 0 { delay(20); dem=dem+1; digit_set(0); } hang4=1; } void ktra_cot3() // Col3 check { hang1=hang2=hang3=hang4=1; hang1=0; if(cot3==0) // Key 3 { delay(20); dem=dem+1; digit_set(3); } hang1=1; hang2=0; if(cot3==0) // Key 6 { delay(20); dem=dem+1; digit_set(6); } hang2=1; hang3=0; if(cot3==0) // Key 9 { delay(20); dem=dem+1; digit_set(9); } hang3=1; hang4=0; if(cot3==0) // Key # { delay(20); dem=dem+1; lcd_data_string("du lieu sai"); // hien thi noi dung "" truc tiep len LCD lcd_cmd(0x01); // cai dat lai vi tri hien thi lcd_data_string("nhap goc:"); // khoi dong lai dong lenh ban dau lcd_cmd(0xc5); // hien vi tri nhap goc tai o so 6 dem=0; } hang4=1; } void keypad() { if(cot1==0) ktra_cot1(); else if(cot2==0) ktra_cot2(); else if(cot3==0) ktra_cot3(); delay(10); } void main() { int i; output=0; cot1=cot2=cot3=1; TMOD=0x20; // MODE2 TH1= -26; // delay 26us shape(); lcd_cmd(0x38); lcd_cmd(0x0e); lcd_cmd(0x01); delay(10); while(1) { dem=0; //gia tri dem =0 lcd_cmd(0x01); // xóa màn hình lcd_data_string("nhap goc:"); // hien cac chu cai len LCD lcd_cmd(0xc5); // hien lenh tu o thu 6 cua LCD ktra=0; // gan 0 vao kiem tra so[0]=0; // gan 0 vao so dau tien cua goc so[1]=0; // gan 0 vao so thu 2 cua goc so[2]=0; // gan 0 vao so thu 3 cua goc while(ktra!=10) //lap lai ktra, neu #10 thi lap lai { hang1=hang2=hang3=hang4=0; while(cot1==1 && cot2==1 && cot3==1); keypad(); // thuc hien lenh tren ban phim } time=(so[0]+(so[1]*10)+(so[2]*100)); lcd_cmd(0xc4); // bat dau dong lenh tu o so 5 time=time%=180; // vi goc quay toi da cua servo la 135 do lcd_data_int(time); // gia tri tren LCD duoc lay tu time lcd_data(0); // reset du lieu trong LCD time= time*0.43; // 2/180 = 11.11us; 11.11/26us=0.427 ~ 0.43 for(i=0;i<200;i++) // lap 200 lan { output=1; // delay on dieu khien servo timer(22); // 22*26=0.6ms dau cua servo, goc =0 do timer(time); // thoi gian xung duong duoc cap output=0; timer(380); // delay off cua servo (10ms) } timer(30000); // tao thoi gian tre cho day lenh tiep theo } } IV.TÀI LIỆU THAM KHẢO 1. Tài liệu Vi Điều Khiển của Tống Văn Ơn Giáo Trình Vi Điều Khiển của Trường ĐH Công Nghiệp TpHCM 2. Tài liệu LCD của Lê Quang Định 3. Tài Liệu Động Cơ Servo của Lâm Quỳnh Trang,Lê Trọng Hiền 4. Tài Liệu Ngôn Ngữ C của Nguyễn Minh Giáp 5. 6. 7.