Giáo trình môn Vi điều khiển
Mô tả chân
- Cổng P0: Bình thường đây là cổng ra. Để có thể vừa làm đầu ra, vừa làm
đầu vào thì mỗi chân của P0 phải được nối tới một điện trở treo 10 kΩ bên
ngoài. Sở dĩ như vậy là vì cổng P0 có dạng cực máng hở, đây là điểm khác với
các cổng P1, P2 và P3. Khi nối 8051 tới bộ nhớ ngoài, P0 trở thành bus địa chỉ
và bus dữ liệu dồn kênh để tiết kiệm số chân [byte thấp của bus địa chỉ nếu là
địa chỉ].- 5 -
- Cổng P1: P1 chỉ có một công dụng là vào/ra.
- Cổng P2: P2 có 2 công dụng, hoặc làm nhiệm vụ vào/ra hoặc là byte địa
chỉ cao của bus địa chỉ 16-bit cho các thiết kế có bộ nhớ chương trình ngoài
hoặc các thiết kế có nhiều hơn 256 byte bộ nhớ dữ liệu ngoài.
- Cổng P3: P3 có 2 công dụng. Khi không hoạt động vào/ra, các chân của
P3 có nhiều chức năng riêng (mỗi chân có chức năng riêng liên quan đến các đặc
trưng cụ thể của 8051).
điều khiển bus. Tín hiệu cho phép bộ nhớ chương trình PSEN (Program
Store Enable) là tín hiệu xuất. Đây là tín hiệu cho phép ta truy xuất bộ nhớ
chương trình ngoài. Chân này thường nối với chân cho phép xuất OE (Output
Enable) của EPROM (hoặc ROM) để cho phép đọc các byte lệnh.
- Chân cho phép chốt địa chỉ ALE: Chân xuất tín hiệu cho phép chốt địa
chỉ ALE (Address Latch Enable) để phân kênh (demultiplexing) bus dữ liệu và
bus địa chỉ.
- Chân truy xuất ngoài EA (External Access): Chân vào này có thể được
nối với 5V (logic 1) hoặc với GND (logic 0).
+ Nếu chân này nối lên 5V, 8051 thực thi chương trình trong ROM
nội (chương trình nhỏ hơn 4K/8K).
+ Nếu chân này nối với GND (và chân PSEN cũng ở logic 0),
chương trình cần thực thi chứa ở bộ nhớ ngoài.
- Chân RESET (RST): Khởi động lại. Đây là chân vào, mức tích cực cao,
bình thường ở mức thấp. Khi có xung cao đặt tới chân này thì bộ vi điều khiển
sẽ kết thúc mọi hoạt động hiện tại và tiến hành khởi động lại. Khi reset, mọi giá
trị trên các thanh ghi sẽ bị xoá. Lưu ý, để reset có hiệu quả, chân RST cần duy
trì trạng thái tích cực mức cao tối thiểu 2 chu kỳ máy.
- Các chân XTAL1 và XTAL2: Mạch dao động bên trong chip 8051 được
ghép nối với thạch anh bên ngoài ở hai chân XTAL1 và XTAL2.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình môn Vi điều khiển
ong bµi to¸n nµy cÇn ph¶i sö dông ph¬ng ph¸p quÐt led 7 thanh. Code for test 2: .. // Chuong trinh lap trinh voi bo dem T1 cua vdk voi hien thi 7 thanh bo dem 0000-9999-0000 #include long code1, dem; - 104 - #define on 1 // muc logic 1 (+5v) #define off 0 // muc logic 0 (0v) // ----- khai bao cac bien cuc bo... long y1,y2,y3,y4,x,n; long k1,k1_tg,k2,k3,k4,code_led1; int j=1,i=1; long n_tg1, n_tg2,bien=0; /* --- dinh nghia cac bit dung------*/ sbit led1 = P0^3; sbit led2 = P0^2; sbit led3 = P0^1; sbit led4 = P0^0; //=------------Chuong trinh con chuyen so thap phan sang ma led 7 thanh-------// void decode_led7seg1(unsigned char number1) // chuyen sang ma led ko co dau cham dp. { switch (number1) { case 0: {code1=0xc0;break;} case 1: {code1=0xf9;break;} case 2: {code1=0xa4;break;} case 3: {code1=0xb0;break;} case 4: {code1=0x99;break;} case 5: {code1=0x92;break;} case 6: {code1=0x82;break;} case 7: {code1=0xf8;break;} case 8: {code1=0x80;break;} case 9: {code1=0x90;break;} } } //---------------Chuong trinh tao tre-------------------// void delay(long tg) // chuong trinh tre thoi gian. { long n1; // khai bao bien cuc bo. for (n1=0;n1<tg;n1++)// vong lap time lan. { ; // khong thuc hien gi ca !!! } } //---------------------// void nhap(void) { TH0=0xf0; - 105 - TL0=0x20; } //-----------Chuong trinh phuc vu ngat timer0-------------// void timer0(void) interrupt 1 //Ngat timer 0 { //---------vong quet 1 cho led1. switch (j) { case 1: { j++; P1=y1; // dua du lieu ra led1 led1=on; led2=off; led3=off; led4=off; nhap(); break; } //---------Vong quet 2 cho led2.-------// case 2: { j++; P1=y2; // dua du lieu ra led2 led2=on; led1=off; led3=off; led4=off; nhap(); break; } //--------Vong quet 3 cho led3--------// case 3: { j++; P1=y3; // dua du lieu ra led3 led3=on; led2=off; led1=off; led4=off; nhap(); break; } //--------Vong quet 4 cho led4---------// - 106 - case 4: { P1=y4; // dua du lieu ra led4 led4=on; led2=off; led3=off; led1=off; nhap(); j=1; break; } } // end of switch } /* --- Voi kit thi ma led la: tuong ung voi cac so tu 0-->9 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h */ //---------------------------------------------------------------------------// void main ( void) // chuong trinh chinh { // begin of main EA= 1; // cho phep ngat toan cuc. TMOD=0x51; // Timer 0 che do 16 bit not auto reload ET0=1; // Cho phep ngat timer 0 TH0=0; TL0=0; nhap(); TR0=1; // ------ TL1=0; TH1=0; TR1=1; // start counter for(;;) { if ( TF1==0) { n=TH1*255+TL1; //-------phan tach n ra thanh k1,k2,k3,k4. k1=n/1000; decode_led7seg1(k1); y1=code1; k2=(n-k1*1000)/100; decode_led7seg1(k2); y2=code1; k3=(n-k1*1000-k2*100)/10; - 107 - decode_led7seg1(k3); y3=code1; k4=(n-k1*1000-k2*100-k3*10); decode_led7seg1(k4); y4=code1; } else {TF1=0;TH1=0;TL1=0;} } // end of while } // end of main ==> Ta xÐt bµi to¸n 3: thiÕt lËp bé ®Õm sö dông T0, hiÓn thÞ 7 thanh sử dụng ngắt timer1 và hiển thị đồng thời trên LCD bé ®Õm sản phẩm trên băng tải tõ 0000 - 9999 - 0000 : Bài toán này ta xây dựng kế thừa của bài toán 2 ở trên. Các bạn phân tích bài toán đặt ra cần phải hiển thị cả sản phẩm đếm được từ bộ counter0 trên LCD, thông qua đây các bạn luyện được nhiều kĩ năng, đặc biệt là phối hợp các công cụ đã được học từ các bài trên trong một ví dụ nhỏ nhưng tổng hợp. Các bạn tự xây dựng software. Dưới đây là ví dụ về software cho bài toán. Cũng như trong tinh thần của giáo trình là các bạn hãy tự xây dựng cách giải quyết bài toán sau sử dụng các công cụ mô phỏng KIT để kiểm tra kết quả. Không nên sử dụng ngay code minh hoạ của giáo trình !!! Code for test 3: #include #include #define on 1 // muc logic 1 (+5v) #define off 0 // muc logic 0 (0v) // ----- khai bao cac bien cuc bo... long code1,code2, dem; long y1,y2,y3,y4,x,n; long k1,k1_tg,k2,k3,k4,code_led1; long lc1,lc2,lc3,lc4; int j=1; /* --- dinh nghia cac bit dung------*/ sbit led1 = P0^3; sbit led2 = P0^2; sbit led3 = P0^1; sbit led4 = P0^0; sfr LCDdata = 0xA0;// Cong 2 , 8 bit du lieu P0 co dia chi 0x80, P1 0x90 , P2 0xA0 sbit BF = 0xA7; // Co ban bit 7 cua p2 sbit RS = P3^7; sbit RW = P3^6; - 108 - sbit EN = P3^5; //=------------Chuong trinh con chuyen so thap phan sang ma led 7 thanh-------// void decode_led7seg1(unsigned char number1) // chuyen sang ma led ko co dau cham dp. { switch (number1) { case 0: {code1=0xc0;break;} case 1: {code1=0xf9;break;} case 2: {code1=0xa4;break;} case 3: {code1=0xb0;break;} case 4: {code1=0x99;break;} case 5: {code1=0x92;break;} case 6: {code1=0x82;break;} case 7: {code1=0xf8;break;} case 8: {code1=0x80;break;} case 9: {code1=0x90;break;} } } /*------chuyen sang ma ASCII cho LCD--------*/ void decode_LCD(unsigned char number2) { switch (number2) { case 0: {code2='0';break;} case 1: {code2='1';break;} case 2: {code2='2';break;} case 3: {code2='3';break;} case 4: {code2='4';break;} case 5: {code2='5';break;} case 6: {code2='6';break;} case 7: {code2='7';break;} case 8: {code2='8';break;} case 9: {code2='9';break;} } } /*---------Cac chuong trinh con cua lcd ------*/ //---------------Chuong trinh con kiem tra su san sang cua lcd----------------; void wait(void) { long n = 0; EN=1;// Dua chan cho fep len cao RS=0;// Chon thanh ghi lenh - 109 - RW=1;// Doc tu LCD LCDdata=0xff;// Gia tri 0xFF while(BF){n++; if(n>110) break;}// Kiem tra co ban // Neu ban dem n den 100 roi thoat khoi while EN=0;// Dua xung cao xuong thap de chot RW=0;// Doc tu LCD } //------------------Chuong trinh con thiet lap lenh cho LCD----------------------; void LCDcontrol(unsigned char x) { EN=1;// Dua chan cho fep len cao RS=0;// Chon thanh ghi lenh RW=0;// Ghi len LCD LCDdata=x;// Gia tri x EN=0;// Xung cao xuong thap wait();// Doi LCD san sang } //---------------chuong trinh con thiet lap mot so thong so cua lcd---------------; void LCDinit(void) { LCDcontrol(0x38);// 2 dong va ma tran 5x7 LCDcontrol(0xc0); LCDcontrol(0x0e);// Bat con tro LCDcontrol(0x01);// Xoa man hinh } //------------------Chuong trinh con thiet lap dulieu cho LCD----------------------; void LCDwrite(unsigned char c) { EN=1;// Cho fep muc cao RS=1;// Ghi du lieu RW=0;// Ghi len LCD LCDdata=c;// Gia tri C EN=0;// Xung cao xuong thap wait();// Cho } /*--------------------------------------------*/ void nhap(void) { TH1=0xf0; TL1=0x20; } //-----------Chuong trinh phuc vu ngat timer0-------------// void timer1(void) interrupt 3 //Ngat timer 0 { //---------vong quet 1 cho led1. - 110 - switch (j) { case 1: { j++; P1=y1; // dua du lieu ra led1 led1=on; led2=off; led3=off; led4=off; nhap(); break; } //---------Vong quet 2 cho led2.-------// case 2: { j++; P1=y2; // dua du lieu ra led2 led2=on; led1=off; led3=off; led4=off; nhap(); break; } //--------Vong quet 3 cho led3--------// case 3: { j++; P1=y3; // dua du lieu ra led3 led3=on; led2=off; led1=off; led4=off; nhap(); break; } //--------Vong quet 4 cho led4---------// case 4: { P1=y4; // dua du lieu ra led4 led4=on; led2=off; led3=off; - 111 - led1=off; nhap(); j=1; break; } } // end of switch } /* --- Voi kit thi ma led la: tuong ung voi cac so tu 0-->9 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h */ //---------------------------------------------------------------------------// void main ( void) // chuong trinh chinh { // begin of main EA= 1; // cho phep ngat toan cuc. TMOD=0x15; // Timer 1 che do 16 bit, t0 counter 16 bit ET1=1; // Cho phep ngat timer 0 nhap(); TR1=1; // ------ TL0=0; TH0=0; TR0=1; // start counter /*---------------Doan chuong trinh cho LCD----*/ LCDinit(); LCDwrite('S'); LCDwrite('o'); LCDwrite(' '); LCDwrite('s'); LCDwrite('a'); LCDwrite('n'); LCDwrite(' '); LCDwrite('p'); LCDwrite('h'); LCDwrite('a'); LCDwrite('m'); LCDwrite(':'); /*--------------------------------------------*/ while(1) { if ( TF0==0) { - 112 - n=TH0*256+TL0; //-------phan tach n ra thanh k1,k2,k3,k4. k1=n/1000; decode_led7seg1(k1); y1=code1; decode_LCD(k1); lc1=code2; k2=(n-k1*1000)/100; decode_led7seg1(k2); y2=code1; decode_LCD(k2); lc2=code2; k3=(n-k1*1000-k2*100)/10; decode_led7seg1(k3); y3=code1; decode_LCD(k3); lc3=code2; k4=(n-k1*1000-k2*100-k3*10); decode_led7seg1(k4); y4=code1; decode_LCD(k4); lc4=code2; LCDcontrol(0x8c); LCDwrite(lc1); // hien thi len LCD so hang nghin. LCDwrite(lc2); // hien thi len LCD so hang tram. LCDwrite(lc3); // hien thi len LCD so hang chuc. LCDwrite(lc4); // hien thi len LCD so hang dvi. } else {TF0=0;TH0=0;TL0=0;} } // end of while } // end of main - 113 - Bài 8: Điều khiển tốc độ động cơ, điều khiển quá trình với băng tải. 8.1.Điều khiển tốc độ động cơ một chiều Sö dông bé ®Þnh thêi cïng ng¾t cña nã linh ho¹t c¸c b¹n sÏ cã rÊt nhiÒu øng dông thùc tÕ cã ý nghÜa nh viÖc lËp tr×nh cho hÖ thèng m¹ch cña m¹ch ch÷ ch¹y qu¶ng c¸o sö dông led ma trËn. Hay ®iÒu khiÓn tèc ®é cña ®éng c¬ mét chiÒu. Vµ ®©y chÝnh lµ ph¬ng ph¸p x©y dùng viÖc ®iÒu chÕ ®é réng xung (PWM) b»ng phÇn mÒm. Ta cã s¬ ®å m¹ch ®iÒu khiÓn ®éng c¬ nh sau: Trong s¬ ®å trªn xung vu«ng do vi ®iÒu khiÓn t¹o ra sÏ ®i ®iÒu khiÓn ®Ó më van ( tran) vµ viÖc ®ãng më tran ( b¨m xung) sÏ t¹o ra mét ®iÖn ¸p Utb ®Æt lªn ®éng c¬. Gi¸ trÞ ®iÖn ¸p nµy sÏ ¶nh hëng tíi tèc ®é quay. Ta cã c«ng thøc gÇn ®óng nh sau: Utb = Umax( T1/T) Trong c«ng thøc nµy Umax lµ gi¸ trÞ ®iÖn ¸p ®Æt trªn van, cßn T1 lµ thêi gian tån t¹i møc 1 cña xung, T lµ chu kú cña xung víi hÇu hÕt c¸c van lµ 1000us ( f=1khz ). T vµ Umax lµ cè ®Þnh do ®ã khi thay ®æi T1 trong kho¶ng tõ 0 T th× sÏ lµm cho Utb thay ®æi gi¸ trÞ tõ 0 – Umax vµ Utb cµng lín ®éng c¬ quay cµng nhanh, ®éng c¬ quay lín nhÊt khi T1 = T vµ khi ®ã Utb = Umax. chÝnh viÖc thay ®æi T1 sÏ lµm thay ®æi tèc ®é ®éng c¬, vµ ta thay ®æi T1 vµ t¹o ra xung th«ng qua viÖc sö dông bé ®Þnh thêi vµ ng¾t cña nã. §©y lµ ph¬ng ph¸p ®iÒu chÕ ®é réng xung (PWM) - 114 - Tạo xung tần số 1Khz Chu kì = 1/103 = 0,001 giây= 1 mili giây=1000 uS= 1000 chu kì máy. Với 10 cấp tốc độ, tức là bạn phải tạo ra được xung 10%, 20%, 30%, 40%, , 90%, 100%. 1 xung như sau: 5V 0V T : Chu kì 1000 miro giây. Khoảng thời gian xung kéo dài 5V là T1. Xung 10% tức là T1/ T= 10%=1/10. Xung 20% T2/T=2/10PWM(Thay đổi độ rộng xung) 8.2. Điều khiển tốc độ động cơ theo quá trình. // Bai toan 2------------------------------------ // bai toan dieu khien dong co theo qua trinh dinh truoc. S¬ ®å m¹ch ®iÒu khiÓn tèc ®é ®éng c¬ mét chiÒu cã ®¶o chiÒu: Ta cã b¶ng ch©n lý cña m¹ch ®iÒu khiÓn ®éng c¬ Bit1(Fet) Bit2(r¬le) KÕt qu¶ 0 0 Quay ngîc - 115 - 0 1 Quay thuËn 1 0 Dõng 1 1 Dõng Trong bµi to¸n nµy ta xÐt tèc ®é V1= 50% Vmax ( tèc ®é cùc ®¹i ) cßn V2= 70% Vmax. XuÊt ph¸t tõ c«ng thøc gÇn ®óng : Utb= Umax(T1/T) Víi T= 1000us ( chän f =1 khz). Dã ®ã víi V1 = 0.5Umax = Umax(T1_1/T) T1_1= T/2 = 500us. Víi V2= 0.7Umax = Umax(T1_2/T) T1_2 = 0.7T = 700us. Tõ ®©y ta sÏ sö dông timer 1 cho viÖc ®iÒu chÕ ®é réng xung. Nªn ta cã 4 ch¬ng tr×nh con nhËp gi¸ trÞ cho timer1 nh sau: /*--------------------------------Nhap gia tri voi V1--------*/ void nhapV1-muc1 (void) { TH1 = 0xfe ; TL1 = 0x0c ; } //-----------------------// void nhapV1-muc0 (void) { TH1 = 0xfe ; TL1 = 0x0c ; } //-----------------------// /*--------------------------------Nhap gia tri voi V2--------*/ void nhapV2_muc1(void) { TH1 = 0xfd ; TL1 = 0x44 ; } //-----------------------// void nhapV2_muc0(void) { TH1 = 0xfe ; TL1 = 0xd4 ; } //-----------------------// Code for ex2: /*---------------- Bai toan dieu khien toc do dong co theo qua trinh -----------------*/ #include #define on 1; #define off 0; - 116 - sbit bit1 =P1^0; sbit bit2 =P1^1; sbit sensor1 = P3^0; sbit sensor3 = P3^1; sbit sensor_dem = P3^4; sbit start = P3^5; // ctac start int check1, y1=0,y2=0; /*-------------cac chuong trinh tao toc do ----------*/ /*----------------------Nhap gia tri voi V1--------*/ void nhap11 (void) // tao muc logic 1 cho v1 { TH1 = 0xfe ; TL1 = 0x0c ; } //-----------------------// void nhap10 (void) // tao muc logic 0 cho v1 { TH1 = 0xfe ; TL1 = 0x0c ; } //-----------------------// /*----------------------Nhap gia tri voi V2--------*/ void nhap21(void) // tao muc logic 1 cho v2 { TH1 = 0xfd ; TL1 = 0x44 ; } //-----------------------// void nhap20(void) // tao muc logic 0 cho v2 { TH1 = 0xfe ; TL1 = 0xd4 ; } void stop (void) { TR1=0; // cam t1 ET1=0; bit1= 1 ; bit2= 1 ; } /*---------------Chuong trinh stop gap--------------------*/ void EX0_int (void) interrupt 0 { while (1) - 117 - { stop(); } } /*******------ chuong trinh pvu ngat T1-----******/ void timer1 (void) interrupt 3 { TF1=0; // xoa co tran switch(check1) { case 1: // quay thuan... trai -->phai { /*-----tao muc 1----*/ if (y1==0) { y1++; bit1=0 ; // dk FET bit2=1 ; // dk Role nhap11(); // tao tre muc 1voi V1 break; } /*-----tao muc 0----*/ if (y1==1) { y1=0; bit1= 1 ; bit2= 1 ; nhap10(); // tao tre muc 0 voi V1 break; } break; } case 2: // quay nguoc... phai -->trai { /*-----tao muc 1----*/ if (y2==0) { y2++; bit1= 0 ; bit2= 0 ; nhap21(); // tao tre muc 1 voi V2 break; } /*-----tao muc 0----*/ if (y2==1) - 118 - { y2=0; bit1= 1 ; bit2= 0 ; nhap20(); // tao tre muc 0 voi V2 break; } break; } }// end of switch } // end of main /*------------Chuong trinh chinh --------------*/ void main(void) { EA=1; ET1=1; EX0=1 ; // cho phep ngat ngoai 0 dung lam Stop. TMOD =0x10; // timer 1 voi ngat 16 bit y1=y2=0; // khoi dong cac bien trang thai // bat dau quay dong co if ( start==0) { // bat dau dong co quay thuan voi V1 check1=1; // dong co quay thuan TR1= 1; while(1) { if(sensor3==0) { stop(); // dung dong co lai check1=2; // de dong co quay nguoc ET1=1; TR1=1; // dong co bat dau quay nguoc } if(sensor1==0) { stop(); // dung dong co lai check1=1; // de dong co quay nguoc ET1=1; TR1=1; // dong co bat dau quay nguoc } } } } - 119 - S¬ ®å thuËt to¸n: Trong bµi to¸n nµy ta sö dông hai sensor1(p3.0) vµ sensor3 (p3.1) Mét c«ng t¾c start (P3.5) vµ c«ng t¾c stop víi ng¾t ngoµi 0. Yªu cÇu cña bµi to¸n lµ ®k ®éng c¬ víi hai cÊp tèc ®é trªn theo qu¸ tr×nh trong h×nh vÏ. Sau ®©y lµ gi¶i thuËt cña bµi to¸n: - 120 - - 121 - Hoµn toµn c¸c b¹n cã thÓ ph¸t triÓn bµi to¸n nµy : §ã lµ thªm c¶ phÇn ®Õm s¶n phÈm ch¹y trªn b¨ng t¶i vµ thÓ hiÖn kÕt qu¶ ®Õm trªn led 7 thanh hay trªn LCD.
File đính kèm:
- giao_trinh_mon_vi_dieu_khien.pdf