64 năng khác, vì vậy chúng ta chỉ được dùng trong giao tiếp với các thiết bị ngoài. + Port2: Port2 là một port có công dụng kép trên các chân 21÷28 được dùng như các đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ mở rộng. + Port3: Port3 là một port công dụng kép trên các chân 10 ÷17. Các chân của port này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tính đặc biệt của 8051 như ở bảng sau: Bít Tên Chức năng chuyển đổi P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.5 P3.7 RXD TDX INTO INT1 TO T1 WR RD Dữ liệu nhận cho port nối tiếp Dữ liệu phát cho port nối tiếp Ngắt 0 bên ngoài Ngắt 1 bên ngoài Ngõ vào của timer/counter 0 Ngõ vào của timer/counter 1 Xung ghi bộ nhớ dữ liệu ngoài Xung đọc bộ nhớ dữ liệu ngoài Bảng 4.1 Chức năng của các chân trên port3 + PSEN (Progam Store Enable): 8051 có 4 tín hiệu điều khiển. PSEN là tín hiệu ra trên chân 29. Nó là tín hiệu điều khiển để cho phép bộ nhớ chương trình mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các bytes mã lệnh. PSEN sẽ ở mức thấp trong thời gian lấy lệnh. Các mã nhị phân của chương trình được đọc từ EPROM qua bus và được chốt vào thanh ghi lệnh của 8051 để giải mã lệnh. Khi thi hành chương trình trong ROM nội PSEN sẽ ở mức thụ động (mức cao). + ALE (Address Latch Enable): Tín hiệu ra ALE trên chân 30 tương hợp với các thiết bị làm việc với các xử lí 8585, 8088, 8086, 8051 dùng ALE 65 một cách tương tự cho làm việc giải các kênh các bus địa chỉ và dữ liệu khi port0 được dùng trong chế độ chuyển đổi của nó: vừa là bus dữ liệu vừa là byte thấp của địa chỉ, ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nửa đầu của chu kỳ bộ nhớ. Sau đó, các đường port0 dùng để xuất hoặc nhập dữ liệu trong nửa sau chu kỳ của bộ nh ớ. Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng là nguồn xung nhịp cho hệ thống. Nếu xung trên 8051 là 12 MHz thì ALE có tần số 2 MHz. Chỉ ngoại trừ khi thi hành lệnh MOV X, một xung ALE sẽ bị mất. Xung này cũng được làm ngõ vào cho xung lập trình cho EPROM trong 8051. + EA (Extemal Access): Tín hiệu vào EA trên chân 31 thường được mắc lên mức cao (+5V) hoặc mức thấp (GND). Nếu ở mức cao, 8051 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K). Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng. Nếu EA được nối mức thấp, bộ nhớ bên trong chương trình 8051 sẽ bị cấm và chương trình thi hành từ EPROM mở rộng. Người ta còn dùng chân EA làm chân cấp đ iện áp 21 V lập trình cho EPROM trong 8051. + SRT (Reset): Ngõ vào RST trên chân 9 là ngõ reset của 8051. Khi tín hiệu này được đưa lên mức cao (trong ít nhất 2 chu kỳ máy), các thanh ghi trong 8051 được tải những giá trị thích hợp để khởi động hệ thống. + Các ngõ vào bộ dao động trên chip: Như đã thấy trong các hình trên, 8051 có một bộ dao động trên chip. Nó thường được nối với thạch anh giữa hai chân 18 và 19. Các tụ giữa cũng cần thiết như đã vẽ. Tần số thạch anh thông thường là 12 MHz. + Các chân nguồn: 8051 vận hành với nguồn đơn +5V. V cc được nối vào chân 40 và V ss (GND) được nối vào chân 20. c) Tổ chức bộ nhớ. 8051 có bộ nhớ theo cấu trúc Harvard: có những vùng cho bộ nhớ riêng biệt cho chương trình dữ liệu. Như đã nói ở trên, cả chương trình và dữ liệu có 66 thể ở bên trong 8051, dù vậy chúng có thể được mở rộng bằng các thành phần ngoài lên đến tối đa 64 Kbytes bộ nhớ chương trình và 64 Kbytes bộ nhớ dữ liệu. Bộ nhớ bên trong bao gồm ROM và RAM trên chip, Ram trên chip bao gồm nhiều phần: phần lưu trữ đa dụng, phần lưu trữ địa chỉ hoá từng bít, các bank thanh ghi và các thanh ghi chức năng đặc biệt. Hình 4.3: Tóm tắt các vùng nhớ của 8051 Hai đặc điểm cần lưu ý là: - Các thanh ghi và các port xuất nhập đã được xếp trong bộ nhớ và có thể được truy xuất trực tiếp như các địa chỉ ô nhớ khác. - Ngăn xếp bên trong RAM nội nhỏ hơn so với RAM ngoài như trong các bộ vi xử lý khác. d) Các thanh ghi chức năng đặc biệt. Các thanh ghi nội của 8051 được truy xuất ngầm định bởi bộ lệnh. Ví dụ lệnh “INT A” sẽ tăng nội dung của thanh ghi tích luỹ A lên 1. Tác động này được ngầm định trong mã lệnh. Bộ nhớ chương trình Bộ nhớ chương trình được chọn qua PSEN Bộ nhớ dữ liệu được chọn qua WR và RD FFFF FFFF 00 0000 0000 FF 67 Các thanh ghi trong 8051 được định dạng như một phần của RAM trên chip. Vì vậy mỗi thanh ghi sẽ có một địa chỉ (ngoại trừ thanh ghi trực tiếp, sẽ không có lợi khi đặt chúng vào RAM trên chip). Đó là lý do để 8051 có nhiều thanh ghi. Cũng như R0 đến R7, có 21 thanh ghi chức năng đặc biệt (SFR: Special Funtion Rgister) ở vùng trên của RAM nội, từ địa chỉ 80H đến FFH. Chú ý rằng hầu hết 128 địa chỉ từ 80h đến FFH không được định nghĩ a. Chỉ có 21 địa chỉ SFR là được định nghĩa. Ngoại trừ thanh ghi tích luỹ (A) có thể được truy xuất ngầm như đã nói, đa số các SFR được truy xuất dùng địa chỉ trực tiếp, chú ý rằng một vài SFR có thể được địa chỉ hoá bit hoặc byte. Người thiết kế phải thận trọng khi truy xuất bit và byte. 8051 có các thanh ghi sau: - Từ trạng thái chương trình. - Thanh ghi B. - Con trỏ ngăn xếp. - Con trỏ dữ liệu. - Các thanh ghi port xuất nhập. - Các thanh ghi timer. - Các thanh ghi port nối tiếp. - Các thanh ghi ngắt. - Các thanh ghi điều khiển công suất. e) Bộ nhớ ngoài. 8051 có khả năng mở rộng bộ nhớ đến 64 K bộ nhớ chương trình và 64 K bộ nhớ dữ liệu bên ngoài. Do đó có thể dùng thêm ROM và RAM nếu cần. Khi dùng bộ nhớ ngoài, port0 không còn là một port I/O thuần tuý nữa. Nó được hợp kênh giữa bus địa chỉ (A0 ÷ A7) và bus dữ liệu (D0 ÷ D7) với tín hiệu ALE để chốt byte thấp của địa chỉ khi bắt đầu mỗi chu kỳ bộ nhớ. Port2 thông thường được dùng cho byte cao của bus đị a chỉ. 68 Trong nửa đầu của mỗi chu kỳ bộ nhớ, byte thấp của địa chỉ được cấp trong port0 và được chốt bằng xung ALE. Một IC chốt 74HC373 (hoặc tương đương) sẽ giữ byte địa chỉ thấp trong phần còn lại của chu kỳ bộ nhớ. Trong nửa sau của chu kỳ bộ nhớ port0 được dùng như bus dữ liệu và được đọc hoặc ghi tuỳ theo lệnh. f) Hoạt động của bộ định thời (timer). Một định nghĩa đơn giản của timer là một chuỗi các flip-flop chia đôi tần số nối tiếp nhau, chúng nhận tín hiệu vào làm nguồn xung nhịp. Ngõ ra của tần số cuối làm nguồn xung nhịp cho flip-flop báo tràn của timer (flip- flop cờ). Giá trị nhị phân trong các flip-flop của timer có thể xem như số đếm số xung nhịp (hoặc các sự kiện) từ khi khởi động timer. Ví dụ timer 16 bit sẽ đếm lên từ 0000H đến FFFFH. Cờ báo tràn sẽ lên 1 khi số đếm tràn từ FFFFh đến 0000H. 8051 có 2 timer 16 bit, mỗi timer có bốn cách làm việc. Người ta sử dụng các timer để: Định khoảng thời gian, đếm các sự kiện và tạo tốc độ baud cho port nối tiếp trong 8051. Trong các ứng dụng định khoảng thời gian, người ta lập trình timer ở một khoảng đều đặn và đặt cờ tràn timer. Cờ được dùng để đồng bộ hoá chương trình để thực hiện một tác động như kiể m tra trạng thái của các cửa ngõ vào hoặc gửi các sự kiện ra các ngõ ra. Các ứng dụng khác có thể sử dụng việc tạo xung nhịp đều đặn của timer để đo thời gian trôi qua giữa hai sự kiện (ví dụ: đo độ rộng xung). Đếm sự kiện dùng để xác định số lần xảy ra của một sự kiện. Một “sự kiện” là bất cứ tác động nào có thể cung cấ p một chuyển trạng thái trên một chân của 8051. Các timer cũng có thể cung cấp xung nhịp tốc độ baud cho port nối tiếp trong 8051. Truy xuất timer của 8051 dùng 6 thanh ghi chức năng đặc biệt cho trong bảng sau: 69 SFR MỤC ĐÍCH ĐỊA CHỈ Địa chỉ hoá từng bit TCON TMOD TL0 TL1 TH0 TH1 Điều khiển timer Chế độ timer Byte thấp của timer 0 Byte thấp của timer 1 Byte cao của timer 0 Byte cao của timer 1 88H 89H 8AH 8BH 8CH 8DH Có Không Không Không Không Không Bảng 4.2 Thanh ghi chức năng đặc biệt dùng timer Ngoài ra, họ vi xử lý còn có tập lệnh và các cách ghép nối với bên ngoài. Trong khuôn khổ của đề tài chỉ tìm hiểu những phần chính nên phần này không được trình bầy. 4.2 Xây dựng thuật toán điều khiển Trong chương 3 ta đã tìm hiểu cách xây dựng hàm truyền của đối tượng, các phương pháp xây dựng luật điều khiển cũng như các phương pháp xác định tham số của bộ điều chỉnh. Khi đã xác định được luật điều khiển và bộ tham số của bộ điều chỉnh thì ta tiến hành lập trình. Chương trình dưới đây lập trình cho vi xử lý 8051 với luật đi ều khiển PID. Chương trình điều khiển tốc độ động cơ (Chương trình được viết bằng ngôn ngữ C và được dịch ra mã máy bằng phần mềm μVision 2.2) ************************************************************** #include <AT89x51.h> #include <intrins.h> unsigned char n=0,m=0,k=0; char error_spe_current,error_spe_past=0; int total_error_past=0,cospe,speed=-9216,total_error_current; float Uk,P,I,D; 70 #define Kp 75.56 #define Ti 19.38 #define Td 0 #define setspe 40 void ex0_ISR(void) interrupt 0 { ET0=1; n++; } void timer0_ISR(void) interrupt 1 { m++; TL0=0x00; TH0=0x4C; TR0=1; } void timer1_ISR(void) interrupt 3 { if(k==0) { P2_0=0; P2_1=0; k++; TL1=speed&0xFF; TH1=speed>>8; TR1=1; } else if(k==1) 71 { P2_0=1; P2_1=1; k++; TL1=0xF6; TH1=0xFF; TR1=1; } else if(k==2); { P2_2=0; P2_3=0; k++; TL1=speed&0xFF; TH1=speed>>8; TR1=1; } else { k=0; P2_2=1; P2_3=1; TL1=0xF6; TH1=0xFF; TR1=1; } } float R(void) { error_spe_current=setspe-n; 72 total_error_current=total_error_past + error_spe_current; P=Kp*error_spe_current; I=Kp*(total_error_current)/Ti; D=Kp*Td*(error_spe_current - error_spe_past); Uk=(P+I+D); total_error_past=total_error_current; error_spe_past = error_spe_current; return(Uk); } int Cospeed(void) { int cospe; R(); cospe=setspe*81-(int)(Uk); if(cospe<4608) cospe=4608; else if(cospe>23040) cospe=23040; else _nop_(); speed=-cospe; return(speed); } void kiemtra_1s(void) { if(m==20) { m=0; Cospeed(); } . ra ALE trên chân 30 tương hợp với các thiết bị làm việc với các xử lí 85 85, 80 88, 80 86, 80 51 dùng ALE 65 một cách tương tự cho làm việc giải các kênh các bus địa chỉ và dữ liệu khi port0 được. các thanh ghi trong 80 51 được tải những giá trị thích hợp để khởi động hệ thống. + Các ngõ vào bộ dao động trên chip: Như đã thấy trong các hình trên, 80 51 có một bộ dao động trên chip. Nó thường. của timer 1 88 H 89 H 8AH 8BH 8CH 8DH Có Không Không Không Không Không Bảng 4.2 Thanh ghi chức năng đặc biệt dùng timer Ngoài ra, họ vi xử lý còn có tập lệnh và các cách ghép nối