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();
}