You are on page 1of 12

Giao tiếp MT888 và 8051 1/12 Trần Thiện Nhân

MT8888 VÀ 8051

1 Giới thiệu MT8888


Để tạo giao diện giao tiếp với mạng điện thoại, Mitel giới thiệu đến chúng ta một dòng
các vi điều khiển: MT8880, MT8888, MT8889... Các vi điều khiển này đều có khả năng
thu và phát tín hiệu DTMF (Dual Tone) cùng các khả năng khác như lọc tín hiệu xử lí
cuộc gọi (Call progress Filter), phát đơn tone (Single Tone). Trong đó MT8888 là IC
được thiết kế riêng để giao tiếp với dòng vi điều khiển Intel mà ở đây là 8051. Nếu đọc kĩ
datasheet của chúng bạn có thể nhận thấy có một vài khác biệt nhỏ giữa chúng. Mặc dù
MT8880, MT8889 đều có thể giao tiếp với 8051, nhưng tôi khuyên bạn nên sử dụng
MT8888.

1.1 Sơ đồ chân MT8888

Hình 1.1: Sơ đồ chân linh kiện MT8888C


Giao tiếp MT888 và 8051 2/12 Trần Thiện Nhân

Chân Tên Chức năng Ghi chú


1 IN+ Ngõ vào không đảo Đây là các chân của một
2 IN- Ngỏ vào đảo op_am làm nhiệm vụ
3 GS Gain Select khếch đại tính hiệu vào.
Reference Voltage output Luôn có giá trị là nửa điện
4 VRef áp nguồn nuôi (ở đây là
2.5V)
5 VSS GND
Chân vào của thạch anh yêu cầu Hai chân thạch anh dùng
6 OSC1
nối vơi điện trở 4M7 xuống mass loại 3.579545 MHz
7 OSC2 Chân ra của thạch anh.
Tone DTMF out put Đường phát tín hiệu
8 TONE
DTMF
9 /WR Yêu cầu đọc dữ liệu từ thanh ghi Bốn chân này dùng để
Chip Select, yêu cầu đặt ở mức điều khiển việc truy xuất
10 /CS
thấp khi truy xuất dữ liệu của IC dữ liệu của IC. Đặc biệt
11 RS0 Cho phép chọn thanh ghi truy xuất chú ý các chân này, đây là
Yêu cầu ghi dữ liệu lên thanh ghi điểm khác biệt giữa các IC
12 /RD
đã nói ở trên.
Chân tạo ngắt Tạo ngắt ngoài cho vi điều
13 IRQ/CP
khiển.
14-17 D0-D3 Đường dữ liệu
18 Est Early Steering ouput Không cần quan tâm
19 St/Gt Steering input/ Guard Time output
20 VCC Power Chân nguồn nối lên 5V
Bảng 1.1 Mô tả chân IC

1.2 Các thanh ghi


MT8888 dùng 5 thanh ghi cho việc giao tiếp với vi điều khiển, chúng được chia thành
3 nhóm: thu phát dữ liệu (Transmit Data Register: chỉ ghi, Receive Data Register: chỉ
đọc), điều khiển (Control Register A và B: chỉ ghi), trạng thái (Status Register: chỉ
đọc).Cụ thể như sau:
• Transmit Data Register: chứa mã của nhị phân của kí tự mà MT8888 sẽ phát,
rõ ràng đây là thanh ghi chỉ ghi.
• Receive Data Register: chứa mã nhị phân của kí tự vừa nhận được, bạn chỉ có
thể đọc giá trị này. Chú ý mã này chỉ có ý nghĩa khi có dấu hiệu nhận được một
kí tự (ngắt).
• Control Register A và B: là hai thanh ghi dùng để định chế độ của MT8888,
chúng là các thanh ghi chỉ ghi.
• Status Register: đúng như tên của nó, thanh ghi này cho biết trạng thái của IC,
đây là thanh ghi chỉ đọc.
Giao tiếp MT888 và 8051 3/12 Trần Thiện Nhân

RSO /WR /RD Thanh ghi


0 0 1 Ghi lên Transmit Data
Register
0 1 0 Đọc từ Receive Data
Register
1 0 1 Ghi lên Control
Register
1 1 0 Đọc từ Status Register
Bảng 1.2 Chọn thanh ghi

Bit Tên Chức năng


b3 RSEL 0: Lần ghi kế tiếp được thực hiện lên thanh ghi CRA
1: Lần ghi kế tiếp được thực hiện lên thanh ghi CRB
b2 IRQ 0: Không tạo ngắt.
1: Cho phép tạo ngắt trên chân 13.
Nếu chọn chế độ DTMF thí ngắt được tạo khi nhận
được tín hiệu DTMF hợp lệ hoặc đã phát xong tín
hiệu DTMF.
Lưu ý: bit này dùng kết hợp với b1 của CRA
b1 CP- Dùng kết hợp với b3 của CRA.
/DTMF 0: chọn chế độ lọc tín hiệu xử lí cuộc gọi.
1: chọn chế độ DTMF.
Lưu ý: ở chế độ CP không thu được DTMF và ngược
lại.
b0 TOUT 0: ngừng phát tone
1: phát tone
Lưu ý: bit này có giá trị trong tất cả các chế độ.

Bảng 1.3 Thanh ghi điều khiển CRA


Giao tiếp MT888 và 8051 4/12 Trần Thiện Nhân
Bit Tên Chức năng
b3 C-/R 1: Chọn cột
2: Chọn dòng
Lưu ý: bit này dùng kết hợp với b2 của CRB
b2 S-/D Dùng kết hợp với b3 của CRB
0: Phát đa tone
1: Phát đơn tone
b1 TEST 0: Không chọn
1: Chọn
Nếu được chọn tín hiệu trên chân 13 sẽ tương tự như
tín hiệu DELAYED STERRING của Status Register.
b0 /BURST 0: Chế độ burst
1: phát liên tục
Tần số phát là 51+51, nếu ở chế độ DTMF.
Tần số 102+102 nếu ở chế độ CP.

Bảng 1.4 Thanh ghi điều khiển CRB

Bit Tên Bật Tắt


b3 DELAYED STEERING Khi không nhận được tín Nhận được tín hiệu hợp lệ
hiệu hợp lệ
b2 RECEIVE DATA Khi có dữ liệu hợp lệ trong Khi thanh ghi trạng thái
REGISTER FULL thanh ghi nhận được đọc
b1 TRANSMIT DATA Khi đã sẵn sàng cho việc Khi thanh ghi được đọc
REGISTER EMPTY nhận kí tự mới.
(BURST MODE
ONLY)
b0 IRQ Đã có ngắt xảy ra b1 hoặc Khi thanh trạng thái được
b2 được bật đọc

Bảng 1.5 Thanh ghi trạng thái

2 Giao tiếp MT8888-8051


Giao tiếp MT888 và 8051 5/12 Trần Thiện Nhân

2.1 Giới thiệu


Qui trình đọc và ghi các thanh ghi của MT8888 được mô tả trong các hình 1.2 và 1.3.
Đối với qui trình đọc (hình 1.3) các tín hiệu /CS và RSO phải được đặt trước, dữ liệu sẽ
được đọc từ thanh ghi MT8888 khi tín hiệu /RD được set xuống 0.
Sau khi quan sát hình 1.4, giản đồ thời gian lệnh MOVX của 8051, tôi đã nhận thấy sự
tương đồng giữa hai giản đồ hình 1.3 và hình 1.4. Nếu ta nối ALE với /CS, một chân của
P2 với RSO, /RD của 8051 với /RD của MT8888, bus dữ liệu với P0 khi đó ta có thể
dùng MOVX để đọc với các thanh ghi của MT8888 mà không phải dùng thêm bất kì lệnh
nào khác. Hình 1.5 là sơ đồ khối giao tiếp mà tôi đã thực hiện, trong đó A8 (P2.0) là chân
được chọn để nối với RSO; A9 (P2.1), ALE và hai cổng logic tạo thành một tín hiệu tự
động điều khiển chân /CS của MT8888, chân A9 được xem như là CS của MT8888, nó
phải được set ở mức cao khi muốn chọn MT8888, bạn có thể bỏ đi hai cổng logic, nối
trực tiếp chân ALE với MT8888 điều này đồng nghĩa với MT8888 luôn được chọn.

Hình 1.2 Giản đồ thời gian ghi các thanh ghi MT8888

Hình 1.3 Giản đồ thời gian đọc các thanh ghi MT8888
Giao tiếp MT888 và 8051 6/12 Trần Thiện Nhân

ALE

/PSEN

/RD

Port 2
PCH DPH

Port 0 PCL Opcode DPL External


data in

Hình 1.4 Giản đồ thời gian lệnh MOVX của 8051

8051 MT8888
ALE /CS
A9
A8 RSO

P0 D0-D3

/RD /RD
/WR /WR
INT1 IRQ/CP

Hình 1.5 Sơ đồ khối giao tiếp 8051-MT8888


Với sơ đồ khối như trên MT8888 được xem như là bộ nhớ dữ liệu ngoài, với các ô nhớ
được đọc bởi lệnh MOVX A,@DPTR và ghi bởi lệnh MOVX @DPTR,A có hai địa chỉ ô
nhớ sau, (chỉ quan tâm byte địa chỉ cao).

Tên A9 A8 Đọc Ghi


SCReg 1 1 Status Register CRA, CRB
DataReg 1 0 Received Data Register Transmit Data Register

Khai báo trong KeilC


char xdata SCReg _at_ 0xffff ;
char xdata DataReg _at_ 0xfeff ;

Truy xuất các thanh ghi trong KeilC


char temp;
temp = SCReg ; // đọc giá thanh ghi trạng thái vào temp
SCReg = 0 ; // ghi lên thanh ghi điều khiển (CRA hoặc CRB) giá trị 0
temp = DataReg ; // đọc giá trị từ thanh ghi Received Data Register vào temp
DataReg = 0 ; // ghi lên thanh ghi Transmit Data Register giá trị 0
Giao tiếp MT888 và 8051 7/12 Trần Thiện Nhân

2.2 Chương trình mẫu viết trong KeilC


Các biến dùng trong bài viết này được khai báo như sau
char bdata MT_Read;
sbit TFinished = MT_Read^1;
sbit DRecieved = MT_Read^2;
bit ok;
char idata Digit;
Quá trình lập trình cho MT8888 yêu cầu các bước sau

Bước 1: MT8888 yêu cầu phải được khởi động trước khi thu phát DTMF.

Hàm khởi động MT8888 trong KeilC, nó phải được gọi trong vòng 100ms sau khi
reset.

void initMT8888(void)
{
MT_Read = SCReg; // Read status Register, xóa tất cả các cờ
SCReg = 0; //Write to control Register ghi không cần biết thanh ghi nào
SCReg = 0; //Write to control Register ghi không cần biết thanh ghi nào,
//lần ghi tiếp theo chắc chắn là thanh ghi CRA
SCReg = 8; //Write to CRA
SCReg = 0; //Write to CRB
MT_Read = SCReg; // Read status Register, xóa tất cả các cờ
}

Bước 2: Cài đặt chế độ cho MT8888, trong bài viết này tôi trình bày chế độ Burst
mode 50 + 50 và thu tín hiệu DTMF.

void setupMT8888(void)
{
SCReg = 13; //write to control A, 1101
//chọn thanh ghi CRB cho lần ghi tiếp theo
//cho phép ngắt trên chân 13 (ngắt 1)
//chọn chế độ DTMF
//không phát tone
Giao tiếp MT888 và 8051 8/12 Trần Thiện Nhân

SCReg = 0; //write to control B, 0000


//không quan tâm
//chọn chế độ phát đa tone
//không chọn chế độ TEST
//chọn chế độ phát Burst
}

Bước 3: thu hoặc phát tone DTMF.

Qui trình phát tone DTMF.

Begin

Ghi dữ liệu digit lên thanh ghi phát

Đọc thanh ghi trạng thái vào MT_Read

TFinished==0 Y
N
End

Vì chúng ta đang ở chế độ Burst nên sau khi phát bạn phải đợi cho đến khi MT8888
báo là đã phát xong và đã sẵn sàng nhận kí tự khác thì việc phát mới xem là đã kết thúc.

void TransmitDTMF(char digit)


{
EX1=0; // cấm ngắt 1
EA=0;
DataReg = digit; // write digit to transmit data
do
{
MT_Read = SCReg;
}
while (TFinished==0);
}

Quá trình thu tone DTMF:


Trước tiên dùng ngắt 1 để đẩy kí tự nhận được vào biến digit và báo là có kí tự vừa
nhận
Giao tiếp MT888 và 8051 9/12 Trần Thiện Nhân

Ngắt 1

Cấm tất cả các ngắt

Đọc thanh ghi trạng thái vào MT_Read

DRecieved ==1 N
Y
Ok=0;
Đọc giá trị thanh ghi nhận vào digit

Cho phép ngắt

End Ngắt 1

Hàm xử lí ngắt như sau


void my_int1(void) interrupt 2
{
EA=0;
MT_Read = SCReg;
if(DRecieved==1)
{
ok=1;
Digit = DataReg;
}
EA=1;
}

Hàm nhận một kí tự sẽ như sau


char ReceiveDTMF(void)
{
EA=1;
while(ok==0){;}
Digit &=0x0f; // bỏ nible cao vì chỉ có nible thấp của digit là có ý nghĩa
return Digit;
}

--------------------------------------------------------------------------------------------------------
Xin hãy xem thêm datasheet để biết chi tiết.
Giao tiếp MT888 và 8051 10/12 Trần Thiện Nhân

C 2 0.47 u
R 9 500k
T IP

2
D 1 R 3 1k 1k R 4
T1 Z 4.3V 3 U 1A C 3 1u R 8 100k U 1B
+
1 3 1 6 - C 4
2 - 7
D T M F _ IN

1
DUONG DAY DIEN THOAI TL084 5
1n
+
R 5 22k
2 4 R 7

1
D 2 10k TL084
1 :1 Z 4.3V R 6 22k
C 5
R IN G

2
10u
GND GND GND
R 11 100k

U 1D R 13 C 6
13
- D TM F _O U T
14
10k
+ 12 1u

May dien thoai ban TL084

GND

Đây là sơ đồ test, mạch này tôi tìm được trên mạng.


Để thu tone , bạn chỉ cần nhấc máy điện thoại lên, và bấm số, chú ý tránh bấm số
đúng, vì khi đó tổng đài sẽ thực hiện kết nối điện thoại của bạn với một hộ nào đó. Việc
ấn số liên tiếp 1,2,3,4,5… thì không có vấn đề gì .

Để phát tone, bạn cũng nhấc máy điện thoại lên, thử dùng chương trình mình vừa viết
xong, quay số tự động đến nhà người quen, bạn mình chẳng hạn, sau đó, bạn dùng ống
nghe điện thoại là có thể nói chuyện bình thuờng.

Chương trình tôi đã viết như sau

#include <AT89X52.h>
//MT8888 Data Reg
char xdata DataReg _at_ 0xfeff;
//Control Reg Read Status Reg
//Read on the Control Reg and write to the Status reg
char xdata SCReg _at_ 0xffff;
//Data read from MT8888
char bdata MT_Read;
sbit TFinished = MT_Read^1;
sbit DRecieved = MT_Read^2;
bit ok;
char idata Digit;
/////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////
void delayms(unsigned int time){
while(time--)
{
unsigned char temp=125;
while(temp--);
}
}

//////////////////////////////////////////////////////////////////
// interrupts
//////////////////////////////////////////////////////////////////
Giao tiếp MT888 và 8051 11/12 Trần Thiện Nhân

void my_int1(void) interrupt 2


{
EA=0;
MT_Read = SCReg;
if(DRecieved==1)
{
ok=1;
Digit = DataReg;
}
EA=1;
}
void init(void){
//initalize interrupts
IT1=1;
EX1=0; //enable interrupt 1
EA=0; //enable interrupts
}

void initMT8888(void)
{
MT_Read = SCReg;
SCReg = 0;
SCReg = 0;
SCReg = 8;
SCReg = 0;
MT_Read = SCReg;
}
void setupMT8888(void)
{
SCReg = 13; //write to control A
SCReg = 0; //write to control B
}

void TransmitDTMF(char digit)


{
EX1=0;
EA=0;
DataReg = digit;// write digit to transmit data
do
{
MT_Read = SCReg;
}
while (TFinished==0);
}

char ReceiveDTMF(void)
{
EA=1;
Giao tiếp MT888 và 8051 12/12 Trần Thiện Nhân

while(ok==0){;}
Digit &=0x0f; // b? nible cao vì ch? có nible th?p c?a digit là có ý ngh?a
return Digit;
}

void main(void)
{
char digit;
init();
initMT8888();
setupMT8888();
// Goi cho ban be
// o day minh dung tong dai noi bo
TransmitDTMF(12);
delayms(1500);
TransmitDTMF(3);
delayms(1500);
///////////////////
// nhan phim nhan
while(1)
{
digit = ReceiveDTMF();
switch (digit)
{
case 1:
// lam gi ban muon
// sang mot vai led chang han
break;
}
}
}

Tôi đã giải thích kĩ các hàm dùng trong chương trình ở các phần trên. Mọi thắc mắc
xin gởi theo địa chỉ thiennhan8404@yahoo.com.
Chúc các bạn thành công.

You might also like