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).
Tóm tắt nội dung tài liệu: Giáo trình môn Vi điều khiển
BỘ CÔNG THƯƠNG TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP VÀ XÂY DỰNG BÀI GIẢNG MÔN HỌC VI ĐIỀU KHIỂN (Lưu hành nội bộ) Người biên soạn: Lưu Thế Mạnh Uông Bí, năm 2010 - 1 - Bài 1 : Giới thiệu về vi điều khiển 8051...................................................- 3 - 1.1. Mô tả chung...................................................................................- 3 - 1.2. Sơ đồ khối họ vi điều khiển 8051 .................................................- 3 - 1.3. Sơ đồ chân và chức năng...............................................................- 4 - 1.4. Tổ chức bộ nhớ..............................................................................- 6 - 1.5. Tập lệnh.........................................................................................- 7 - 1.6. Bộ đếm/bộ định thời......................................................................- 8 - 1.7. Ngắt ...............................................................................................- 9 - Bài 2 : Ngôn ngữ lập trình và phần mềm biên dịch, mô phỏng Keil C.- 11 - Phần 1 – Ngôn ngữ C với lập trình vđk.................................................- 11 - 2.1.1. Cấu trúc một chương trình .......................................................- 11 - 2.1.2.Các loại biến trong C:................................................................- 12 - 2.1.3. Hàm trong C: ............................................................................- 13 - 2.1.4. Các toán tử cơ bản :..................................................................- 14 - 2.1.5. Các cấu trúc lệnh rẽ nhánh, kiểm tra thường dùng: .................- 15 - 2.1.6. Bộ tiền xử lí ..............................................................................- 15 - Phần 2: Trình biên dịch cách sử dụng Keil C uVision 3.0 ....................- 17 - 2.2.1.Khởi tạo cho Project:.................................................................- 17 - 2.2.2 Soạn thảo chương trình: ............................................................- 37 - 2.2.3 Dịch chương trình: ....................................................................- 42 - 2.2.4. Chạy mô phỏng và sửa lỗi........................................................- 47 - Bài toán 1: Bài toán ghép nối vi điều khiển với các led đơn .............- 55 - Bài toán 2 : Phối hợp led-công tắc(1).................................................- 58 - Bài Toán 3:Phối hợp led-công tắc(2) .................................................- 60 - Bài toán 4:...........................................................................................- 63 - Bài 4: Ghép nối và thao tác với màn hình LCD ...................................- 67 - 4.1. Lắp mạch theo sơ đồ sau: ............................................................- 67 - 4.2. Nguyên lí hoạt động của LCD: ...................................................- 68 - 4.3. Lập trình : ....................................................................................- 70 - Bài 5: Ngắt của vi điều khiển, thao tác với ngắt ngoài của vi điều khiển- 75 - 5.1. Khái niệm:.......................................................................................- 75 - 5.2. Trình tự thực hiện ngắt của vi điều khiển.......................................- 75 - 5.2.1.Các ngắt của vi điều khiển 8051 ...............................................- 75 - 5.2.2. Ngắt ngoài và cách lập trình.....................................................- 76 - 5.3. Các bài toán ứng dụng ngắt ngoài của vđk .................................- 76 - Bài 6 : Bộ định thời của VĐK và ngắt định thời ..................................- 81 - 6.1. Cơ sở lý thuyết ................................................................................- 81 - 6.1.1. Bộ định thời của vi điều khiển là gì. ........................................- 81 - 6.1.2. Thanh ghi chứa, thanh ghi thiết lập chế độ cho bộ định thời...- 81 - 6.1.3. Cơ chế tạo trễ của bộ định thời và cách tính toán giá trị nạp cho bộ định thời..............................................................................................- 82 - 6.1.4. Ngắt của bộ định thời ...............................................................- 83 - 6.2.Các bài toán minh họa. ....................................................................- 84 - 6.3. Bàn phím ma trận 4x4.....................................................................- 91 - - 2 - 6.3.1. Lắp mạch theo sơ đồ sau ..........................................................- 91 - 6.3.2: Nguyên lí quét phím:...............................................................- 91 - 6.3.3. Chúng ta có thể sử dụng theo sơ đồ thuật toán thứ 2 sau:........- 92 - Bài7: BỘ ĐẾM CỦA VĐK 8051 (Counter) ..........................................- 97 - 7.1. Ý nghĩa thực tiễn của các bộ đếm (Counter). .................................- 97 - 7.2. Cơ sở lý thuyết và lập trình vi điều khiển 8051 thành một bộ đếm.- 98 - 7.3. Bài toán lập trình minh họa ..........................................................- 100 - Bài8: ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ ĐIỀU KHIỂN QUÁ TRÌNH VỚI BĂNG TẢI.....................................................................................- 113 - 8.1.Điều khiển tốc độ động cơ một chiều............................................- 113 - 8.2. Điều khiển tốc độ động cơ theo quá trình.....................................- 114 - - 3 - Bài 1 : Giới thiệu về vi điều khiển 8051. 1.1. Mô tả chung - Họ vi điều khiển 8051 có các đặc trưng được tóm tắt như sau: + Bộ nhớ có thể lập trình lại. + 4 KB ROM. + 128 byte RAM. + 4 cổng vào/ra (I/O port) 8-bit. + 2 bộ định thời 16-bit. + Cổng giao tiếp nối tiếp. + Không gian nhớ chương trình (mã) ngoài 64 Kb. + Không gian dữ liệu ngoài 64 Kb. + Bộ xử lý bit (thao tác trên các bit riêng rẽ). + 210 vị trí nhớ được định địa chỉ, mỗi vị trí 1 bit. + Nhân/chia trong 4 µs. 1.2. Sơ đồ khối họ vi điều khiển 8051 Hình sau đây cho thấy sơ đồ khối của vi điều khiển 8051 - 4 - Hình 1. Sơ đồ khối họ vi điều khiển 8051 1.3. Sơ đồ chân và chức năng 1.3.1. Sơ đồ chân Hình 2: Bố trí chân của họ 8051. 1.3.2. 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). Bit Tên Địa chỉ bit Chức năng P3.0 RxD B0H Nhận dữ liệu của cổng nối tiếp P3.1 TxD B1H Phát dữ liệu của cổng nối tiếp P3.2 INT0 B2H Ngắt ngoài 0 P3.3 INT1 B3H Ngắt ngoài 1 P3.4 T0 B4H Chân vào của bộ định thời/đếm 0 P3.5 T1 B5H Chân vào của bộ định thời/đếm 1 P3.6 WR B6H Điều khiển ghi bộ nhớ dữ liệu ngoài P3.7 RD B7H Điều khiển đọc bộ nhớ dữ liệu ngoài Bảng 1: Chức năng các chân của cổng P3. - Chân cho phép bộ nhớ chương trình PSEN : 8051 cung cấp cho ta 4 tín hiệu đ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. - 6 - 1.4. Tổ chức bộ nhớ Lệnh Tên Địa chỉ ACC* Thanh ghi tích luỹ (thanh ghi tổng ) A 0E0H B* Thanh ghi B 0F0H PSW* Từ trạng thái chương trình 0D0H SP Con trỏ ngăn xếp 81H DPTR Con trỏ dữ liệu hai byte DPL Byte thấp của DPTR 82H DPH Byte cao của DPTR 83H P0* Cổng P0 80H P1* Cổng P1 90H P2* Cổng P2 0A0H P3* Cổng P3 0B0H IP* Điều khiển ưu tiên ngắt 0B8H IE* Điều khiển cho phép ngắt A08H TMOD Điều khiển chế độ bộ đếm/định thời 89H TCON* Điều khiển bộ đếm/định thời 88H T2CON* Điều khiển bộ đếm/định thời 2 0C8H T2MOD Điều khiển chế độ bộ đếm/định thời 2 0C9H TH0 Byte cao của bộ đếm/định thời 0 8CH TL0 Byte thấp của bộ đếm/định thời 0 8AH TH1 Byte cao của bộ đếm/định thời 1 8DH TL1 Byte thấp của bộ đếm/định thời 1 8BH TH2 Byte cao của bộ đếm/định thời 2 0CDH TL2 Byte thấp của bộ đếm/định thời 2 0CCH RCAP2H Byte cao của thanh ghi bộ đếm/định thời 2 0CBH RCAP2L Byte thấp của thanh ghi bộ đếm/định thời 2 0CAH SCON* Điều khiển nối tiếp 98H SBUF Bộ đệm dữ liệu nối tiếp 99H PCON Điều khiển công suất 87H Bảng 2: Các thanh ghi chức năng đặc biệt của họ vi điều khiển 8051 (*các thanh ghi có thể định địa chỉ theo bit). Họ vi điều khiển 8051 có không gian bộ nhớ riêng cho chương trình và dữ liệu. Cả 2 bộ nhớ chương trình và dữ liệu đều đặt bên trong chip, tuy nhiên ta có thể mở rộng bộ nhớ chương trình và bộ nhớ dữ liệu bằng cách sử dụng các chip - 7 - nhớ bên ngoài. - Bộ nhớ nội trong chip bao gồm ROM và RAM. RAM trên chip bao gồm vùng RAM đa chức năng (nhiều công dụng), vùng RAM với từng bit được định địa chỉ (gọi tắt là vùng RAM định địa chỉ bit), các dãy (bank) thanh ghi và các thanh ghi chức năng đặc biệt SFR (Special Function Register). Hai đặc tính đáng lưu ý: + Các thanh ghi và các cổng vào/ra được định địa chỉ theo kiểu ánh xạ bộ nhớ (memory mapped) và được truy xuất như một vị trí trong bộ nhớ. + Vùng stack thường trú trong RAM trên chip (RAM nội) thay vì ở trong RAM ngoài như đối với các bộ vi xử lý. - Vùng RAM đa mục đích: Bất kỳ một vị trí nhớ nào trong vùng RAM đa mục đích đều có thể được truy xuất tự do bằng cách sử dụng các kiểu định địa chỉ trực tiếp hoặc gián tiếp. - Vùng RAM định địa chỉ bit: Ý tưởng truy xuất các bit riêng rẽ thông qua phần mềm là một đặc trưng mạnh của hầu hết các bộ vi điều khiển. Các bit có thể được set, xoá, AND, OR bằng một lệnh. Hầu hết các bộ vi xử lý yêu cầu một chuỗi lệnh đọc-sửa-ghi để nhận được cùng một kết quả. Ngoài ra 8051 còn có các cổng vào/ra có thể định địa chỉ từng bit, làm đơn giản việc giao tiếp bằng phần mềm với các thiết bị vào/ra đơn bit. - Các dãy thanh ghi: Dãy các thanh ghi đang được sử dụng được gọi là dãy thanh ghi tích cực. Dãy thanh ghi tích cực có thể được thay đổi bằng cách thay đổi các bit chọn trong từ trạng thái PSW. - Các thanh ghi chức năng đặc biệt được trình bày trong bảng 2. 1.5. Tập lệnh - Đặc điểm nổi bật của 8051 là có các lệnh tác động và thực hiện trên từng bit được đánh địa chỉ. 8051 có thể xoá, lập, lấy phần bù, kiểm tra, di chuyển, và thực hiện các phép toán logic trên từng bit. - Tập lệnh của 8051 được thiết kế nhằm tối ưu cả độ dài của mã lệnh và tốc độ thực hiện. Hầu hết các lệnh có độ dài 1 byte, một số 2 byte và 3 byte là rất ít. Các lệnh thực hiện trong 1 hoặc 2 chu kỳ máy, chỉ có nhân và chia là thực hiện trong 4 chu kỳ máy. - Có 8 kiểu định địa chỉ: + Thanh ghi (register). + Trực tiếp (direct). + Gián tiếp (indirect). + Tức thời (immediate). + Tương đối (relative). + Tuyệt đối (absolute). + Dài (long). + Chỉ số (indexed). - Tổng số lệnh là 111. 111 lệnh chia thành 5 nhóm : + Tính toán số học. + Tính toán logic (cho biến kiểu byte). + Chuyển dữ liệu. - 8 - + Thực hiện trên bit. + Lệnh rẽ nhánh chương trình và điều khiển. 1.6. Bộ đếm/bộ định thời 8051 có hai bộ định thời là Timer 0 và Timer 1. Cả hai bộ định thời đều có độ dài 16 bit. Do 8051 có cấu trúc 8 bit, nên mỗi bộ định thời được truy cập dưới dạng hai thanh ghi độc lập là byte thấp và byte cao. - Thanh ghi của bộ Timer 0: Thanh ghi 16 bit của bộ Timer 0 được truy cập theo 2 byte là byte thấp và byte cao. Thanh ghi byte thấp được gọi là TL0 (Timer 0 Low byte) và thanh ghi byte cao là TH0 (Timer 0 High byte). Các thanh ghi này có thể đọc và truy cập trực tiếp như mọi thanh ghi khác. Hình 3: Thanh ghi của bộ định thời Timer 0. - Thanh ghi của bộ Timer 1: Bộ định thời Timer 1 cũng dài 16 bit và thanh ghi 16 bit cũng được chia ra thành hai byte là TL1 và TH1. Các thanh ghi này được truy cập và được đọc giống như các thanh ghi của bộ Timer 0. Hình 4: Thanh ghi của bộ định thời Timer 1. - Thanh ghi chế độ của bộ định thời TMOD: Cả hai bộ định thời đều dùng chung một thanh ghi được gọi là TMOD để thiết lập các chế độ làm việc khác nhau của bộ định thời. Thanh ghi TMOD là thanh ghi 8 bit gồm có 4 bit thấp dành cho bộ Timer 0 và 4 bit cao dành cho Timer 1. Trong đó hai bit thấp của chúng dùng để thiết lập chế độ của bộ định thời, còn hai bit cao dùng để xác định phép toán. Hình 5: Thanh ghi TMOD. + Các bit M0, M1: Là các bit chế độ dùng để chọn chế độ 0, 1 và 2 của các bộ Timer 0 và Timer 1. M1 M0 Chế độ Chế độ hoạt động 0 0 0 Chế độ bộ định thời 13 bit. Bộ định thời/bộ đếm 8 bit, định tỷ lệ trước 5 bit. 0 1 1 Chế độ bộ định thời 16 bit, không định tỷ lệ trước. 1 0 2 Chế độ 8 bit tự nạp lại. THx lưu giá trị sẽ tự nạp vào TLx mỗi khi tràn. D15 D14 D13 D12 D11 D10 D9 D8 TH0 D7 D6 D5 D4 D3 D2 D1 D0 TL0 D15 D14 D13 D12 D11 D10 D9 D8 TH1 D7 D6 D5 D4 D3 D2 D1 D0 TL1 (MSB) GATE C/T M1 M0 Timer1 GATE C/T M1 M0 Timer0 (MSB) - 9 - 1 1 3 Chế độ bộ định thời chia tách Bảng 3: Các chế độ hoạt động của bộ định thời. 1.7. Ngắt - 8051 có 5 ngắt dành cho người dùng: + Hai ngắt dành cho bộ định thời Timer 0 và Timer 1. + Hai ngắt phần cứng dành cho các thiết bị bên ngoài nối tới chân INT0 và INT1 của cổng P3. + Truyền thông nối tiếp có một ngắt dành cho cả thu lẫn phát. Ngắt Địa chỉ ROM Chân Bật lại nguồn (RESET) 0000 9 Ngắt phần cứng ngoài (INT0) 0003 12 (P3.2) Ngắt bộ Timer0 (TF0) 000B Ngắt phần cứng ngoài 1 (INT1) 0013 13 (P3.3) Ngắt bộ Timer1 (TF1) 001B Ngắt COM nối tiếp (RI và TI) 0023 Bảng 4: Bảng vector ngắt của 8051. - Cho phép và cấm ngắt: Các ngắt phải được cho phép bằng phần mềm để bộ vi điều khiển có thể đáp ứng được. Thanh ghi cho phép ngắt IE (Interrupt Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt. Hình 6: Thanh ghi cho phép ngắt IE. + EA: Nếu EA = 0 thì không ngắt nào được báo nhận. Nếu EA = 1 thì từng nguồn ngắt sẽ được mở hoặc cấm bằng cách ... b¹n biªn dÞch ra file hex vµ n¹p xuèng kit thùc hµnh ®Ó quan s¸t ho¹t ®éng thùc tÕ cña bµi to¸n. §¸nh gi¸ kÕt qu¶ vµ hiÖu chØnh thªm. ==> Ta xÐt bµi to¸n 2: thiÕt lËp bé ®Õm sö dông T0 vµ hiÓn thÞ 7 thanh lµ bé ®Õm tõ 0000 - 9999 - 0000 : Bµi to¸n nµy sÏ n©ng ®é phøc t¹p lªn so víi bµi1. Trong 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