báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
Phần I:
Tổng quan về các thiết bị Vi Xử Lý
Chơng 1 :
Giới thiệu chung về chíp AT89C51
I. Giới thiệu AT89C51
AT89C51 là một bộ vi xử lý 8 bit, loại CMOS, có tốc độ cao và công
suất thấp với bộ nhớ Flash có thể lập trình đợc. Nó đợc sản xuất với công
nghệ bộ nhớ không bay hơi mật độ cao của hãng Atmel, và tơng thích với họ
MCS-51
TM
về chân ra và tập lệnh.
Sơ đồ khối của AT89C51
1
báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
AT89C51 có các đặc trng cơ bản nh sau: 4 K byte Flash, 128 byte
RAM, 32 đờng xuất nhập, hai bộ định thời/đếm 16-bit, một cấu trúc ngắt hai
mức u tiên và 5 nguyên nhân ngắt, một port nối tiếp song công, mạch dao
động và tạo xung clock trên chip. AT89C51 đợc thiết kế với logic tĩnh cho
hoạt động có tần số giảm xuống 0 vaứ hỗ trợ hai chế độ tiết kiệm năng lợng
đợc lựa chọn bằng phần mềm. Chế độ nghỉ dừng CPU trong khi vẫn cho phép
RAM, các bộ định thời/đếm, port nối tiếp và hệ thống ngắt tiếp tục hoạt
động. Chế độ nguồn giảm duy trì nội dung của RAM nhng không cho mạch
dao động cung cấp xung clock nhằm vô hiệu hoá các hoạt động khác của
chip cho đến khi có reset cứng tiếp theo.
I.1 Mô tả các chân
Các cấu hình chân ra của AT89C51
2
báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
Nh vậy AT89C51 có tất cả 40 chân với các chức năng nh sau:
Ngõ vào ngắt ngoài 0
P3.3
INT1
Ngõ vào ngắt ngoài 1
P3.4 T0 Ngõ vào bên ngoài của bộ định thời 1
P3.5 T1 Ngõ vào bên ngoài của bộ định thời 0
P3.6
WR
Điều khiển ghi bộ nhớ dữ liệu ngoài
P3.7
RD
Điều khiển đọc bộ nhớ dữ liệu ngoài
Port 3 cũng nhận một vài tín hiệu điều khiển cho việc lập trình Flash và
kiểm tra chơng trình.
3
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
- RST (9)
Ngâ vµo reset. Møc cao trªn ch©n nµy trong 2 chu kú m¸y trong khi
bé dao ®éng ®ang hoat ®éng sÏ reset AT89C51.
M¹ch reset t¸c ®éng b»ng tay vµ tù ®éng reset khi khëi ®éng m¸y
- ALE/
PROG
(30)
ALE là một xung ngõ ra để chốt byte thấp của đòa chỉ trong khi truy xuất
bộ nhớ ngoài. Chân này cũng làm ngõ vào xung lập trình (
PROG
) trong thời
gian lập trình cho Flash.
Khi hoạt động bình thường, xung ngõ ra ALE lu«n có tần sốä không đổi là
1/6 tần số của mạch dao động, có thể được dùng cho các mụch đích đònh thời từ
= 0 cho phép truy xuất bộ nhớ chương trình ngoài, ngỵc l¹i
EA
=1 sẽ
thực thi chương trình bên trong chip
Tuy nhiên, lưu ý rằng nếu bit khoá 1 (lock-bit 1) được lập trình,
EA
sẽ
được chốt bên trong khi reset.
Chân này cũng nhận điện áp cho phép lập trình Vpp=12V khi lập trình
Flash (khi đó ®iƯn áp lập trình 12V được chọn).
- XTAL1 và XTAL2
XTAL1 và XTAL2 là hai ngõ vào và ra của một bộ khuếch đại đảo của
mạch dao động, được cấu hình để dùng như một bộ dao động trên chip.
Không có yêu cầu nào về chu kỳ nhiệm vụ của tín hiệu xung clock bên
ngoài do tín hiệu này phải qua một flip-flop chia hai trước khi đến mạch tạo
xung clock bên trong, tuy nhiên các chi tiết kỹ thuật về thời gian mức thấp và
mức cao, điện áp cực tiểu và cực đại cần phải được xem xét.
I.2 C¸c chÕ ®é ®Ỉc biƯt
I.2.1 ChÕ ®é nghØ
Trong chế độ nghỉ, CPU tự đi vào trạng thái ngủ trong khi tất cả các
ngoại vi bên trong chip vẫn tích cực. Chế độ này được điều khiển bởi phần
mềm. Nội dung của RAM trên chip và của tất cả các thanh ghi chức năng đặc
biệt vẫn không đổi trong khi thời gian tồn tại chế độ này. Chế độ nghỉ có thể
được kết thúc bởi một ngắt bất kỳ nào được phép hoặc bằng cách reset cứng.
Ta cần lưu ý rằng khi chế độ nghỉ được kết thúc bởi một reset cứng,
chip vi điều khiển sẽ tiếp tục bình thường việc thực thi chương trình từ nơi
chương trình bò tạm dừng, trong vòng 2 chu kỳ máy trước khi giải thuật reset
mềm nẵm quyền điều khiển.
5
6
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
Khi bit khoá 1 LB1 được lập trình, mức logic ở chân
EA
được lấy mẫu
và được chốt trong khi reset. Nếu việc cấp nguồn cho chip không có công dụng
reset, mạch chốt được khởi động bằng một giá trò ngẫu nhiên và giá trò này
được duy trì cho đến khi có tác động reset. Điều cần thiết là giá trò được chốt
của
EA
phải phù hợp vơi mức logic hiện hành ở chân này.
Các bit khóa chương trình Loại bảo vệ
Chế
độ
LB1 LB2 LB3
1 U U U Không có đặc trưng khóa chương trình
2 P U U Các lệnh MOVC được thực thi từ bộ nhớ
chương trình ngoài không được phép tìm
nạp lệnh từ bộ nhớ nội,
EA
được lấy mẫu
và được chốt khi reset, hơn nữa việc lập
trình trên Flash bò cấm
3 P P U Như chế độ 2, cấm thêm việc kiểm tra
chương trình
4 P P P Như chế độ 3, cấm thêm việc thực thi
chương trình ngoài
7
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
Bộ nhớ mở rộng
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
Hình vẽ trên cho ta thấy cấu trúc của không gian nhớ của AT89C51,
trong đó không gian nhớ nội được chia thành các dãy thanh ghi (00h-1Fh), vùng
RAM đònh đòa chỉ bit(20h-2Fh), vùng RAM đa mục đích (30h-7Fh) và các thanh
ghi chức năng đặc biệt(80h-FFh).
Bộ nhớ dữ liệu trên chip AT89C51
9
7F 7E
7D 7C 7B 7A
79
78
2F
77
76 75 74 73 72 71 70
2E
6F
6E
6D 6C 6B 6A
69
68
2D
67 66 65 64 63 62 61 60
2C
5F
5E
5D 5C 5B 5A
59
58
2B
23
17
16 15 14 13 12 11 10
22
0F
0E
0D 0C 0B 0A
09
08
21
07 06 05 04 03 02 07
1
00
20
Bank 3
1F
18
Bank 217
10
Bank 10F
08
Bank thanh ghi 0
(mặc đònh cho R0-R7)
07
00
RAM đa dụng
7F
30
RAM
Đòa chỉ bit
TL1
không được đòa chỉ hóa bit
8C
TH0
97 96 95 94 93 92 91 90
90
P1
9F 9E
9D 9C 9B 9A
99 98
98
SCON
không được đòa chỉ hóa bit
99
SBUF
A7 A6 A5 A4 A3 A2 A1 A0
A0
P2
AF – – A
C
A
B
A
A
A9 A8
A8
IE
– – – BC BB BA B9 B8
B8
IP
Để tiết kiệm các chân cho phép ta đóng gói bộ vi điều khiển trong vỏ 40
chân nên port 0 vừa là bus dữ liệu (D0-D7) vừa là bus đòa chỉ (A0-A7), kiểu
sắp xếp này được gọi là sắp xếp đa hợp.
Sắp xếp đa hợp hoạt động như sau: trong nửa chu kỳ đầu của chu kỳ bộ
nhớ, byte thấp của đòa chỉ được cung cấp bởi port 0 và được chốt nhờ tín hiệu
ALE. Trong nửa sau của chu kỳ bộ nhớ, port 0 được sử dụng làm bus dữ liệu
và dữ liệu được đọc hay ghi.
Ta sử dụng IC 73HC373 làm mạch chốt dữ liệu, giữ cho byte thấp của
bus đòa chỉ ổn đònh trong cả chu kỳ bộ nhớ
II.1 Bé nhí b¸n dÉn.
Cã hai lo¹i chÝnh lµ RAM vµ ROM. Riªng víi RAM l¹i cã 2 lo¹i lµ SRAM
(RAM tÜnh) vµ DRAM (RAM ®éng).
- Bé nhí chØ cã thĨ ®äc ROM (Read-Only-Memory) lµ lo¹i cã néi dung ®ỵc
viÕt s½n mét lÇn khi chÕ t¹o vµ ®ỵc gi÷ m·i cè ®Þnh (non volatile).
10
V+
Tin hiƯu
®Þa chØ
C¸c d©y bit (j cét)
C¸c d©y tõ
(i hµng)
1
1 1
1
0
0
0
vùng cửa nổi ta chiếu tia UV vào chip nhớ. Các điện tử sẽ hấp thụ năng lợng nhảy
lên các mức cao, và rời cửa nổi nh cách mà chúng đã thâm nhập vào đó. Với
EEPROM việc nạp điện tử tơng tự nh EPROM. Để xóa EEPROM, một lớp kênh
màng mỏng oxit giữa vùng cửa nổi trải xuống dới đế và cực máng đóng vai trò
quan trọng. Các lớp cách điện là không lý tởng, các điện tử có thể thấm qua lớp
phân cách với một xác suất thấp. Xác suất này sẽ tăng lên khi bề dày của lớp giảm
đi và điện thế giữa hai điện cực ở hai mặt tăng lên. Muốn phóng các điện tích trong
vùng cửa nổi, một điện thế (-20V) đợc đặt vào cực cửa điều khiển và cực máng.
Lúc này các điện tử âm trong cửa nổi đợc chảy về cực máng qua kênh màng mỏng
oxit và số liệu lu trữ đợc xóa.
Flash memory tơng tự nh EEPROM nhng Flash memory xóa tất cả tong
một lần trong khi EEPROM phải xóa từng bit một.
- Các chip RAM (Random Access Memory) là loại bộ nhớ có thể ghi/đọc đ-
ợc. Đây là loại bộ nhớ không cố định (volatile) tức là thông tin lu trữ trong nó
sẽ bị mất đi khi cắt nguồn điện nuôi. RAM bán dẫn có hai loại là SRAM
(Static RAM-Ram tĩnh) và DRAM (Dinamic RAM-Ram động).
Một ô nhớ SRAM lu trữ thông tin bởi trạng thái của một mạch lật (Flip-
flop) với đầu ra của nó ở một trong hai mức logic thấp. Thuật ngữ tĩnh chỉ ra
rằng khi nguồn nuôi cha bị cắt thì nội dung ô nhớ vẫn đợc giữ nguyên. Trong
khi đó, bộ nhớ DRAM lu trữ thông tin bằng mức điện áp trên một tụ điện có
11
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
®iƯn dung C. Lỵng ®iƯn tÝch trªn tơ biÕn ®ỉi theo thêi gian do sù phãng hay n¹p
®iƯn qua c¸c ®iƯn trë khãa (cã gi¸ trÞ kh«ng thĨ b»ng v« cïng). V× vËy tht
ng÷ ‘®éng’ hµm ý r»ng mỈc dï cha c¾t ngn nu«i nhng vÉn ph¶i thêng xuyªn
phơc håi th«ng tin trong DRAM. Qu¸ tr×nh håi phơc ®ỵc gäi lµ ‘lµm t¬i’ « nhí.
Một vi mạch nhớ thường có cấu trúc bao gồm: nhóm tín hiệu đòa chỉ,
nhóm tín hiệu dữ liệu (data output/input), tín hiệu chọn vỏ, tín hiệu điều
khiển đọc/ghi
Mét sè hä IC nhí th«ng dơng:
.
A
n
D
m
WECSOE
Vào/ra
dữ
liệu
Chân
chọn vỏ
Đọc
Ghi
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
Mỗi một mạch nhớ được phối ghép với chip cần phải được chip quy
chiếu tới một cách chính xác khi thực hiện các thao tác ghi/đọc. Điều đó có
nghóa là mỗi mạch nhớ phải được gán một vùng riêng biệt có đòa chỉ xác đònh
nằm trong không gian đòa chỉ tổng thể của bộ nhớ. Việc gán đòa chỉ cụ thể cho
mạch nhớ được thực hiện nhờ một xung chọn vỏ lấy từ mạch giải mã đòa chỉ.
Sơ đồ tổng quát ghép nối bộ nhớ ngoài với AT89C51
II.2 GhÐp nèi t¨ng dung lỵng bé nhí.
Các vi mạch nhớ có dung lượng cố đònh ví dơ 4K, 8K . v.v. . Vì vậy ta
phải ghép nối các vi mạch nhớ này một cách thích hợp để có được một bộ nhớ
ngoài theo đúng yêu cầu thiết kế. Có hai cách ghép nối chính để tăng dung
lượng bộ nhớ là ghép nối theo hàng dọc (tăng đầu vào đòa chỉ) và ghép nối
theo hàng ngang (tăng đầu ra dữ liệu).
- Ghép nối theo hàng ngang (tăng số bit dữ liệu)
Giả sử ta có một IC nhớ có dung lượng là 2
n
n
.m
IC2
2
n
.m
Address Bus (A0-An-1)
CS
b¸o c¸o bµi tËp lín m«n Vi xư lý - nhãm I - Líp §T11.K45
- Ghép nối theo hàng dọc (tăng số bit đòa chỉ)
Giả sử ta có một IC nhớ có dung lượng 2
n
.m bit, muốn có một bộ nhớ có
dung lượng 2
n+k
.m bit ta ghép 2
k
IC nhớ 2
n
.m bit víi bé gi¶i m· ®Þa chØ cã k ®êng
®Þa chØ vµo chän 1 trong sè 2
k
®êng ra.
II.3 LËp tr×nh
Để vi xử lý có thể nhận biết và làm việc với bộ nhớ ngoài, khi lập trình
ta cần khởi tạo các giá trò các thủ tục cần thiết để giao tiếp với bộ nhớ ngoài.
Ví dụ đònh nghóa các chân điều khiển, thiết lập các chương trình con ghi đọc dữ
liệu .v.v . .
CE
IC 2
2
n
.m
CE
IC 2
k
2
n
.m
CE
Mạch
giải mã
đòa chỉ
m bit
báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
Vớ duù gheựp noỏi AT89C51 vụựi SRAM 6264 (8Kx8)
15
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
Chöông trình:
; Truy xuat bo nho du lieu ngoai su dung cong vao ra
SRAM_DATA DATA 30h ; SRAM Data
UART_BUSY BIT 00h ; UART Busy Flag
; Khoi tao
SRAM_ADDR EQU 0000h ; tu 0000 toi 1FFF voi 6264 ( 8Kx8)
;
; Dinh nghia cac chan
DATA_PORT EQU P0
LO_ADDR_PORT EQU P1
thoi 1)
MOV SCON,#01010000b ; Che do 1 port noi tiep (khoi dong port noi tiep)
SETB ES ; Cho phep ngat do port noi tiep(IE.4)
SETB EA ; Cho phep ngat(IE.7)
SETB TR1 ; Khoi dong bo dinh thoi 1(TCON)
CLR UART_BUSY
; Vi du ghi bang chu cai A,B,C . . . vao RAM
MOV DPTR,#SRAM_ADDR
MOV SRAM_DATA,#'A'
Lap1: MOV A,SRAM_DATA
CALL SRAM_WRITE
16
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
INC SRAM_DATA
MOV A,SRAM_DATA
CJNE A,#'Z'+1,INC_SRAM_ADDR
MOV SRAM_DATA,#'A'
INC_SRAM_ADDR:
INC DPTR
MOV A,DPH
CJNE A,#20h,Lap1
; Doc byte tu RAM ra roi gui toi port noi tiep
MOV DPTR,#SRAM_ADDR
Lap2: CALL SRAM_READ
MOV SRAM_DATA,A
WAIT_UART:
JB UART_BUSY,WAIT_UART
SETB UART_BUSY
MOV SBUF,SRAM_DATA
INC DPTR
SETB SRAM_CS
RET
; Thu tuc ghi RAM
SRAM_WRITE:
MOV LO_ADDR_PORT,DPL
MOV HI_ADDR_PORT,DPH
CLR SRAM_CS
MOV DATA_PORT,A ; Thanh ghi A chua du lieu can ghi vao RAM
17
báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
ngoai
CLR SRAM_WR
SETB SRAM_WR
SETB SRAM_CS
RET
END
II.4 Giới thiệu bộ nhớ EEPROM nối tiếp
Hiện nay bộ nhớ EEPROM trao đổi dữ liệu theo kiểu nối tiếp đợc ứng
dụng rất nhiều trong thực tế.
Để minh họa ta hãy xét một IC nhớ cụ thể loại này, đó là IC AT24C64 (64K
x 8) .
18
báo cáo bài tập lớn môn Vi xử lý - nhóm I - Lớp ĐT11.K45
Mô tả hoạt động:
- Xung đồng hồ và truyền dữ liệu : Chân SDA bình thờng đợc kéo lên mức
cao với vai trò là thiết bị ngoài. Dữ liệu ở chân SDA đợc thay đổi khi
SCL ơ mức thấp. Nếu tín hiệu ở chân SDA thay đổi khi SCl ở mức cao sẽ
chỉ ra bít báo hiệu bắt đầu hay kết thúc việc trao đổi dữ liệu.
- Bít bắt đầu: Tín hiệu ở chân SDA chuyển từ cao xuống thấp khi SCl ở
mức cao sẽ là điều kiện để bắt đầu quá trình truyền dữ liệu
0
,A
1
, A
2
đều đợc nối với đất.
Chơng trình:
20
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
PROG EQU 0000h
;
;Quy dinh cac chan
SEEPROM_SCL EQU P1.0 ; Xung dong ho
SEEPROM_SDA EQU P1.1 ; Du lieu noi tiep
;
; Khoi tao
SEEPROM_MADRS_LO DATA 30h ; Luu dia chi cao
SEEPROM_MADRS_HI DATA 31h ; Luu dia chi thap
SEEPROM_DATA DATA 32h ; Luu du lieu
SEEPROM_SBUF DATA 33h ; Dem port noi tiep
UART_BUSY BIT 00h ; Co bao port noi tiep ban
;
;
SEEPROM_DADRS EQU 0A0h
;
ORG PROG+0000h
SJMP START
; Bang vecto ngat
ORG PROG+0003h
LCALL INT0_ISR
CJNE A,#'Z'+1,INC_MADRS_LO_1
MOV SEEPROM_DATA,#'A'
INC_MADRS_LO_1:
21
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
INC SEEPROM_MADRS_LO
MOV A,SEEPROM_MADRS_LO
CJNE A,#00h,LOOP_1
INC_MADRS_HI_1:
INC SEEPROM_MADRS_HI
MOV A,SEEPROM_MADRS_HI
CJNE A,#20h,LOOP_1 ; Gioi han 8K voi AT24C64
; Doc byte tu bo nho roi gui ra port noi tiep
MOV SEEPROM_MADRS_HI,#00h
MOV SEEPROM_MADRS_LO,#00h
LOOP_2: CALL SEEPROM_READ
WAIT_UART:
JB UART_BUSY,WAIT_UART
SETB UART_BUSY
MOV SBUF,SEEPROM_DATA
INC_MADRS_LO_2:
INC SEEPROM_MADRS_LO
MOV A,SEEPROM_MADRS_LO
CJNE A,#00h,LOOP_2
INC_MADRS_HI_2:
INC SEEPROM_MADRS_HI
MOV A,SEEPROM_MADRS_HI
CJNE A,#20h,LOOP_2 ; 8K Limit for AT24C64
DONE: SJMP DONE
;
khong san sang
22
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
MOV A,#SEEPROM_DADRS ; Dia chi IC
CLR ACC.0 ; Xac
dinh ghi du lieu
MOV SEEPROM_SBUF,A
CALL SEEPROM_SHOUT ; Gui dia chi IC
JC SEEPROM_WRITE_ERROR ; Bo neu
khong co bit xac nhan
MOV SEEPROM_SBUF,SEEPROM_MADRS_HI ; Phan cao dia chi
CALL SEEPROM_SHOUT ; Gui dia chi phan
cao
JC SEEPROM_WRITE_ERROR ; Bo neu
khong co bit xac nhan
MOV SEEPROM_SBUF,SEEPROM_MADRS_LO; Phan thap dia chi
CALL SEEPROM_SHOUT ; Gui phan thap
JC SEEPROM_WRITE_ERROR ; Bo neu
khong co bit xac nhan
MOV SEEPROM_SBUF,SEEPROM_DATA ; Du lieu
CALL SEEPROM_SHOUT ; Gui du lieu
JC SEEPROM_WRITE_ERROR ; Bo neu
khong co bit xac nhan
CLR C
; Xoa co bao loi
SEEPROM_WRITE_ERROR:
CALL SEEPROM_STOP
SEEPROM_WRITE_RET:
POP ACC
JC SEEPROM_WRITE ; Thu lai
CALL SEEPROM_SHOUT
23
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
JC SEEPROM_READ_ERROR
CALL SEEPROM_SHIN ; Nhan du lieu
CALL SEEPROM_NAK ; khong chap
nhan byte
MOV SEEPROM_DATA,SEEPROM_SBUF
CLR C
SEEPROM_READ_ERROR:
CALL SEEPROM_STOP
SEEPROM_READ_RET:
POP ACC
JC SEEPROM_READ ; thu lai
neu loi
RET
;
SEEPROM_START:
; Gui bit bat dau, xac dinh chuyen tu cao ve thap o SDA trong khi SCL cao.
; Quay lai SCL, SDA thap.
; Tro lai set CY neu bus ban.
SETB SEEPROM_SDA
SETB SEEPROM_SCL
JNB SEEPROM_SDA,SEEPROM_START_ERROR
JNB SEEPROM_SCL,SEEPROM_START_ERROR
NOP ; tre mot chu ky may
CLR SEEPROM_SDA
NOP
NOP
; SET lai CY cho biet loi boi tin hieu xac nhan.
24
b¸o c¸o bµi tËp lín m«n Vi xö lý - nhãm I - Líp §T11.K45
PUSH ACC
PUSH B
MOV A,SEEPROM_SBUF
MOV B,#8 ; bit dem
SEEPROM_SHOUT_LOOP:
RLC A ; chuyen bit vao CY
MOV SEEPROM_SDA,C ; xuat bit
NOP ; lam cho SCL thap va thiet lap du
lieu
SETB SEEPROM_SCL ; phat xung
NOP ; lam cho SCL cao
NOP
NOP
NOP
CLR SEEPROM_SCL ; Giam xung
DJNZ B,SEEPROM_SHOUT_LOOP
SETB SEEPROM_SDA ; SDA for ACK
NOP ; lam cho SCL thap va tAA
NOP
SETB SEEPROM_SCL ; phat ACK clock
NOP ; lam cho SCL cao
NOP
NOP
NOP
MOV C,SEEPROM_SDA ; Nhan ACK bit
CLR SEEPROM_SCL ; Giam ACK clock
POP B
SETB SEEPROM_SDA ; phu dinh bit xac nhan
25