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];
7 trang |
Chia sẻ: ngtr9097 | Lượt xem: 2397 | Lượt tải: 1
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.