Professional Documents
Culture Documents
MT8888 VÀ 8051
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
8051 MT8888
ALE /CS
A9
A8 RSO
P0 D0-D3
/RD /RD
/WR /WR
INT1 IRQ/CP
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
Begin
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.
Ngắt 1
DRecieved ==1 N
Y
Ok=0;
Đọc giá trị thanh ghi nhận vào digit
End Ngắt 1
--------------------------------------------------------------------------------------------------------
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
GND
Để 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.
#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 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
}
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.