Tập lệnh 8051 có 255 lệnh gồm 139 lệnh 1 byte, 92 lệnh 2 byte và 24 lệnh 3 byte.
Các nhóm lệnh của 8051:
Tập lệnh của 8051 được chia thành 5 nhóm: - Số học.
- Luận lý.
- Chuyển dữ liệu. - Chuyển điều khiển. Các chi tiết thiết lập lệnh:
Rn : Thanh ghi R0 đến R7 của bank thanh ghi được chọn.
Data : 8 bit địa chỉ vùng dữ liệu bên trong. Nó có thể là vùng RAM dữ liệu trong (0-127) hoặc các thanh ghi chức năng đặc biệt.
@Ri : 8 bit vùng RAM dữ liệu trong (0-125) được đánh giá địa chỉ gián tiếp qua thanh ghi R0 hoặc R1.
#data : Hằng 8 bit chứa trong câu lệnh. #data 16 : Hằng 16 bit chứa trong câu lệnh.
Addr16 : 16 bit địa chỉ đích được dùng trong lệnh LCALL và LJMP. Addr11 : 11 bit địa chỉ đích được dùng trong lệnh LCALL và AJMP.
Rel : Byte offset 8 bit có dấu được dùng trong lệnh SJMP và những lệnh nhảy có điều kiện.
Bit : Bit được định địa chỉ trực tiếp trong RAM dữ liệu nội hoặc các thanh ghi chức năng đặc biệt.
a. Nhóm lệnh xử lý số học
ADD A,Rn (1 byte, 1 chu kỳ máy) : cộng nội dung thanh ghi Rn vào thanh ghi A. ADD A,data (2,1): Cộng trực tiếp 1 byte vào thanh ghi A.
ADD A,@Ri (1,1): Cộng gián tiếp nội dung RAM chứa tại địa chỉ được khai báo trong Ri vào thanh ghi A.
ADD A,#data (2,1): Cộng dữ liệu tức thời vào A. ADD A,Rn (1,1): Cộng thanh ghi và cờ nhớ vào A.
ADD A,data (2,1): Cộng trực tiếp byte dữ liệu và cờ nhớ vào A. ADDC A,@Ri (1,1): Cộng gián tiếp nội dung RAM và cờ nhớ vào A.
ADDC A,#data (2,1): Cộng dữ liệu tức thời và cờ nhớ vào A.
SUBB A,Rn (1,1): Trừ nội dung thanh ghi A cho nội dung thanh ghi Rn và cờ nhớ.
SUBB A,data (2,1): Trừ trực tiếp A cho một số và cờ nhớ. SUBB A,@Ri (1,1): Trừ gián tiếp A cho một số và cờ nhớ.
SUBB A,#data (2,1): Trừ nội dung A cho một số tức thời và cờ nhớ. INC A (1,1): Tăng nội dung thanh ghi A lên 1.
INC Rn (1,1): Tăng nội dung thanh ghi Rn lên 1. INC data (2,1): Tăng dữ liệu trực tiếp lên 1.
INC @Ri (1,1): Tăng gián tiếp nội dung vùng RAM lên 1. DEC A (1,1): Giảm nội dung thanh ghi A xuống 1. DEC Rn (1,1): Giảm nội dung thanh ghi Rn xuống 1. DEC data (2,1): Giảm dữ liệu trực tiếp xuống 1
DEC @Ri (1,1): Giảm gián tiếp nội dung vùng RAM xuống 1. INC DPTR (1,2): Tăng nội dng con trỏ dữ liệu lên 1.
MUL AB (1,4): Nhân nội dung thanh ghi A với nội dung thanh ghi B. DIV AB (1,4): Chia nội dung thanh ghi A cho nội dung thanh ghi B. DA A (1,1): hiệu chỉnh thập phân thanh ghi A.
b. Nhóm lệnh luận lý
ANL A,Rn (1,1): AND nội dung thanh ghi A với nội dung thanh ghi Rn. ANL A,data (2,1): AND nội dung thanh ghi A với dữ liệu trực tiếp.
ANL A,@Ri (1,1): AND nội dung thanh ghi A với dữ liệu gián tiếp trong RAM.
ANL A,#data (2,1): AND nội dung thanh ghi với dữ liệu tức thời. ANL data,A (2,1): AND một dữ liệu trực tiếp với A.
ANL data,#data (3,2): AND một dữ liệu trực tiếp với A một dữ liệu tức thời. ANL C,bit (2,2): AND cờ nhớ với 1 bit trực tiếp.
ANL C,/bit (2,2): AND cờ nhớ với bù 1 bit trực tiếp. ORL A,Rn (1,1): OR thanh ghi A với thanh ghi Rn.
ORL A,data (2,1): OR thanh ghi A với một dữ liệu trực tiếp. ORL A,@Ri (1,1): OR thanh ghi A với một dữ liệu gián tiếp. ORL A,#data (2,1): OR thanh ghi A với một dữ liệu tức thời. ORL data,A (2,1): OR một dữ liệu trực tiếp với thanh ghi A.
ORL data,#data (3,1): OR một dữ liệu trực tiếp với một dữ liệu tức thời. ORL C,bit (2,2): OR cờ nhớ với một bit trực tiếp.
ORL C,/bit (2,2): OR cờ nhớ với bù của một bit trực tiếp. XRL A,Rn (1,1): XOR thanh ghi A với thanh ghi Rn.
XRL A,data (2,1): XOR thanh ghi A với mộ dữ liệu trực tiếp. XRL A,@Ri (1,1): XOR thanh ghi A với một dữ liệu gián tiếp. XRL A,#data (2,1): XOR thanh ghi A với mộ dữ liệu tức thời. XRL data,A (2,1): XOR một dữ liệu trực tiếp với thanh ghi A.
XRL dara,#data (3,1): XOR một dữ liệu trực tiếp với một dữ liệu tức thời. SETB C (1,1): Đặt cờ nhớ.
SETB bit (2,1): Đặt một bit trực tiếp. CLR A (1,1): Xóa thanh ghi A. CLR C (1,1): Xóa cờ nhớ.
CPL A (1,1): Bù nội dung thanh ghi A. CPL C (1,1): Bù cờ nhớ.
CPL bit (2,1): Bù một bit trực tiếp.
RL A (1,1): Quay trái nội dung thanh ghi A.
RLC A (1,1): Quay trái nội dung thanh ghi A qua cờ nhớ. RR A (1,1): Quay phải nội dung thanh ghi A.
RRC A (1,1): Quay phải nội dung thanh ghi A qua cờ nhớ. SWAP (1,1): Quay trái nội dung thanh ghi A 1 nibble (1/2byte).
c. Nhóm lệnh chuyển dữ liệu
MOV A,Rn (1,1): Chuyển nội dung thanh ghi Rn vào thanh ghi A. MOV A,data (2,1): Chuyển dữ liệu trực tiếp vào thanh ghi A. MOV A,@Ri (1,1): Chuyển dữ liệu gián tiếp vào thanh ghi A. MOV A,#data (2,1): Chuyển dữ liệu tức thời vào thanh ghi A. MOV Rn,data (2,2): Chuyển dữ liệu trực tiếp vào thanh ghi Rn. MOV Rn,#data (2,1): Chuyển dữ liệu tức thời vào thanh ghi Rn.
MOV data,A (2,1): Chuyển nội dung thanh ghi A vào một dữ liệu trực tiếp. MOV data,Rn (2,2): Chuyển nội dung thanh ghi Rn vào một dữ liệu trực tiếp.
MOV data,data (3,2): Chuyển một dữ liệu trực tiếp vào một dữ liệu trực tiếp. MOV data,@Ri (2,2): Chuyển một dữ liệu gián tiếp vào một dữ liệu trực tiếp.
MOV data,#data (3,2): Chuyển một dữ liệu tức thời vào một dữ liệu trực tiếp. MOV @Ri,A (1,1): Chuyển nội dung thanh ghi A vào một dữ liệu gián tiếp. MOV @Ri,data (2,2): Chuyển một dữ liệu trực tiếp vào một dữ liệu gián tiếp. MOV @Ri,#data (2,1): Chuyển dữ liệu tức thời vào dữ liệu gián tiếp.
MOV DPTR,#data (3,2): Chuyển một hằng 16 bit vào thanh ghi con trỏ dữ liệu. MOV C,bit (2,1): Chuyển một bit trực tiếp vào cờ nhớ.
MOV bit,C (2,2): Chuyển cờ nhớ vào một bit trực tiếp.
MOV A,@A+DPTR (1,2): Chuyển byte bộ nhớ chương trình có địa chỉ là @A+DPRT vào thanh ghi A.
MOVC A,@A+PC (1,2): Chuyển byte bộ nhớ chương trình có địa chỉ là @A+PC vào thanh ghi A.
MOV A,@Ri (1,2): Chuyển dữ liệu ngoài (8 bit địa chỉ) vào thanh ghi A. MOVX A,@DPTR (1,2): Chuyển dữ liệu ngoài (16 bit địa chỉ) vào thanh ghi A. MOVX @Ri,A (1,2): Chuyển nội dung A ra dữ liệu ngoài (8 bit địa chỉ). MOVX @DPTR,A (1,2): Chuyển nội dung A ra dữ liệu bên ngoài (16 bit địa chỉ). PUSH data (2,2): Chuyển dữ liệu trực tiếp vào ngăn xếp và tăng SP. POP data (2,2): Chuyển dữ liệu trực tiếp vào ngăn xếp và giảm SP. XCH A,Rn (1,1): Trao đổi dữ liệu giữa thanh ghi Rn v2 thanh ghi A. XCH A,data (2,1): Trao đổi giữa thanh ghi A và một dữ liệu trực tiếp. XCH A,@Ri (1,1): Trao đổi giữa thanh ghi A và một dữ liệu gián tiếp.
XCHD A,@R (1,1): Trao đổi giữa nibble thấp (LSN) của thanh ghi A và LSN của dữ liệu gián tiếp.
d. Nhóm lệnh chuyền điều khiển
ACALL addr11 (2,2): Gọi chương trình con dùng địa chì tuyệt đối. LCALL addr16 (3,2): Gọi chương trình con dùng địa chỉ dài. RET (1,2): Trở về từ lệnh gọi chương trình con. RET1 (1,2): Trở về từ lệnh gọi ngắt.
AJMP addr11 (2,2): Nhảy tuyệt đối. LJMP addr16 (3,2): Nhảy dài. SJMP rel (2,2): Nhảy ngắn.
JMP @A+DPTR (1,2): Nhảy gián tiếp từ con trỏ dữ liệu. JZ rel (2,2): Nhảy nếu A=0.
JC rel (2,2): Nhảy nếu cờ nhớ được đặt.
JNC rel (2,2): Nhảy nếu cờ nhớ không được đặt.
JB bit,rel (3,2): Nhảy tương đối nếu bit trực tiếp được đặt.
JNB bit,rel (3,2): Nhảy tương đối nếu bit trực tiếp không được đặt. JBC bit,rel (3,2): Nhảy tương đối nếu bit trực tiếp được đặt , rồi xóa bit. CJNE A,data,rel (3,2): So sánh dữ liệu trực tiếp với A và nhảy nếu không bằng. CJNE A,#data,rel (3,2): So sánh dữ liệu tức thời với A và nhảy nếu không bằng.
CJNE Rn,#data,rel (3,2): So sánh dữ liệu tức thời với nội dung thanh ghi Rn và nhảy nếu không bằng.
CJNE @Ri,#data,rel (3,2): So sánh dữ liệu tức thời với dữ liệu gián tiếp và nhảy nếu không bằng.
DJNZ Rn,rel (2,2): Giản thanh ghi Rn và nhảy nếu không bằng. DJNZ data,rel (3,2): Giảm dữ liệu trực tiếp và nhảy nếu không bằng.
CHƯƠNG 2
CÁC LINH KIỆN TRONG MẠCH ĐỒNG HỒ CÓ HẸN GIỜ 2.1. IC thời gian thực DS1307
2.1.1. Chức năng các chân
X1, X2: nối với thạch anh 32,768 kHz.
Vcc, GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào
5V. Khi 5V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có thể đọc và viết. Khi pin 3V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat thì quá trình đọc và viết không được thực thi, tuy nhiên chức năng timekeeping không bị ảnh hưởng bởi điện áp vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và timekeeper sẽ được ngắt tới nguồn cung cấp trong (thường là nguồn 1 chiều 3V).
Vbat: đầu vào pin cho bất kỳ một chuẩn pin 3V. Điện áp pin phải được giữ
trong khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị.
SDA (serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân
SDA thiết kế theo kiểu cực máng hở, đòi hỏi phải có một điện trở kéo trong khi hoạt động.
SCL (serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên
đường dây nối tiếp.
SQW/OUT (square wave/output driver): khi được kích hoạt thì bit SQWE
được thiết lập, chân SQW/OUT phát đi 1 trong 4 tần số (1Hz,4kHz,8kHz,32kHz). Chân này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở kéo trong. Chân này sẽ hoạt động khi cả Vcc và Vbat được cấp.
Hình 2.1: Sơ đồ chân của DS1307
2.1.2. Một vài thông số kỹ thuật
DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gian và ngày tháng với 56 bytes NV SRAM. Địa chỉ và dữ liệu được truyền nối tiếp qua 2 đường bus 2 chiều. Nó cung cấp thông tin về giờ, phút, giây, thứ, ngày,
tháng, năm. Ngày cuối tháng sẽ tự động được điều chỉnh với các tháng nhỏ hơn 31 ngày, bao gồm cả việc tự động nhảy năm. Đồng hồ có thể hoạt động ở dạng 24h hoặc 12h với chỉ thị AM/PM. DS1307 có một mạch cảm biến điện áp dùng để dò các điện áp lỗi và tự động đóng ngắt với nguồn pin cung cấp.
DS1307 hoạt động với vai trò slave trên đường bus nối tiếp. Việc truy cập được thi hành với chỉ thị START và một mã thiết bị nhất định được cung cấp bởi địa chỉ các thanh ghi. Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị STOP được thực thi.
2.1.3. Sơ đồ khối của DS1307
a. Địa chỉ Ram và RTC
Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc các byte thanh ghi thích hợp. thời gian và ngày tháng được thiết lập cũng thông qua các byte thanh ghi này bằng cách viết vào đó những giá trị thích hợp. Nội dung của các thanh ghi dưới dạng mã BCD (binary coded decreaseimal). Bit 7 của thanh ghi seconds là bit clock halt (CH), khi bit này được thiết lập 1 thì dao động disable, khi nó được xoá về 0 thì dao động được enable.
Thanh ghi thời gian thực được mô tả như sau:
Bảng 2.1: Mô tả thanh ghi thời gian thực
Bảng 2.2: Địa chỉ bit của các thành phần trong DS1307
DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của thanh ghi hours là bit chọn chế độ 24h hoặc 12h. khi bit này ở mức cao thì chế độ 12h được chọn. Ở chế độ 12h thì bit 5 là bit AM/PM với mức cao là là PM. Ở chế độ 24h thì bit 5 là bit chỉ 20h (từ 20h đến 23h).
Trong DS1307 có một thanh ghi điều khiển để điều khiển hoạt động của chân SQW/OUT.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
OUT 0 0 SQWE 0 0 RS1 RS0
Bảng 2.3: Thanh ghi điều khiển hoạt động chân SQW/OUT
- OUT (output control): bit này điều khiển mức ra của chân SQW/OUT khi đầu ra xung vuông bị cấm. Nếu SQWE=0 thì mức logic ở chân SQW/OUT sẽ là 1 nếu OUT=1,và =0 nếu OUT=0.
- SQWE (square wave enable): bit này được thiết lập 1 sẽ cho phép đầu ra của bộ tạo dao động. Tần số của đầu ra xung vuông phụ thuộc vào giá trị của RS1 và RS0. RS1 RS0 Tần số xung vuông 0 0 1HZ 0 1 4,096KHz 1 0 8,192KHz 1 1 32,768KHz Bảng 2.4: Chế độ chọn tần số
Thanh ghi giây (SECONDS): thanh ghi này là thanh ghi đầu tiên trong bộ nhớ của DS1307, địa chỉ của nó là 0x00. Bốn bit thấp của thanh ghi này chứa mã BCD 4- bit của chữ số hàng đơn vị của giá trị giây. Do giá trị cao nhất của chữ số hàng chục là 5 (không có giây 60 ) nên chỉ cần 3 bit (các bit SECONDS6:4) là có thể mã hoá được (số 5=101, 3 bit). Bit cao nhất, bit 7, trong thanh ghi này là 1 điều khiển có tên CH (Clock halt – treo đồng hồ), nếu bit này được set bằng 1 bộ dao động trong chip bị vô hiệu hoá, đồng hồ không hoạt động. Vì vậy, nhất thiết phải reset bit này xuống 0 ngay từ ban đầu.
Thanh ghi phút (MINUTES): có địa chỉ 0x01, chứa giá trị phút của đồng hồ. Tương tự thanh ghi SECONDS, chỉ có 7 bit của thanh ghi này được dùng lưu mã BCD của phút, bit 7 luôn bằng 0.
Thanh ghi giờ (HOURS): có thể nói đây là thanh ghi phức tạp nhất trong DS1307. Thanh ghi này có địa chỉ 0x02. Trước hết 4-bit thấp của thanh ghi này được dùng cho chữ số hàng đơn vị của giờ. Do DS1307 hỗ trợ 2 loại hệ thống hiển thị giờ (gọi là mode) là 12h (1h đến 12h) và 24h (1h đến 24h), bit6 xác lập hệ thống giờ. Nếu bit6=0 thì hệ thống 24h được chọn, khi đó 2 bit cao 5 và 4 dùng mã hoá số hàng chục của giá trị giờ. Do đó giá trị lớn nhất của chữ số hàng chục trong trường hợp này là 2 (=10, nhị phân) nên 2 bit 5 và 4 là đủ để mã hoá. Nếu bit 6=1 thì hệ thống 12h được
chọn, với trường hợp này chỉ có bit 4 dùng mã hoá chữ số hàng chục của giờ, bit 5 chỉ buổi trong ngày, AM hoặc PM. Bit 5=0 là AM và bit 5=1 là PM. Bit 7 luôn bằng 0.
Thang ghi thứ (DAY- ngày trong tuần): nằm ở địa chỉ 0x03. Thang ghi DAY chỉ mang giá trị từ 1 đến 7 tương ứng chủ nhật đến thứ 7 trong 1 tuần. Vì thế, chỉ có 3 bit thấp trong thanh ghi này có nghĩa.
Các thanh ghi còn lại có cấu trúc tương tự, DATE chứa ngày trong tháng (1 đến 31), MONTH chứa tháng (1 đến 12) và YEAR chứa năm (00 đến 99). DS1307 chỉ dùng cho 100 năm, nên giá trị năm chỉ có 2 chữ số.
Các thanh ghi còn lại trong bộ nhớ, DS1307 còn có một thanh ghi khác nằm riêng gọi là con trỏ địa chỉ hay thanh ghi địa chỉ (Address Register). Giá trị của thanh ghi này là địa chỉ của thanh ghi trong bộ nhớ mà người dùng muốn truy cập. Giá trị của thanh ghi địa chỉ ( tức địa chỉ của bộ nhớ) được set trong lệnh Write.
b. Hoạt động
DS1307 hỗ trợ truyền dữ liệu bus 2 dây 2 chiều. Một thiết bị gửi dữ liệu lên đường truyền được định nghĩa như là 1 máy phát và một thiết bị nhận dữ liệu như là máy nhận. Thiết bị điều khiển thông điệp gọi là Master. Thiết bị được điều khiển bởi Master được gọi là Slaver. Đường truyền (Bus) phải được điều khiển bởi thiết bị Master mà phát ra xung nối tiếp (Serial Clock_SCL) điều khiển sự truy cập đường truyền và phát ra điều kiện bắt đầu, dừng (Start, Stop condition). DS1307 hoạt động như là Slave trên bus 2 dây.
Hình 2.3: Cấu hình bus 2 dây điển hình
Việc truyền dữ liệu chỉ có thể được bắt đầu khi bus không bận.
Trong lúc truyền dữ liệu, đường dữ liệu phải ổn định bất cứ khi nào đường Clock là cao (High).
Do đó, các điều kiện về đường truyền sau được định nghĩa:
- Bus not busy: cả đường dữ liệu và xung đều ở mức cao (High).
- Start data transfer: một sự thay đổi trong trang thái của đường dữ liệu từ
HIGH - LOW trong khi xung clock vẫn cao (H), đây là điều kiện bắt đầu (Start