You are on page 1of 103

MỤC LỤC

PHẦN II: LINH KIỆN ĐIỆN TỬ ......................................................................... 5


PHẦN II: THIẾT KẾ MẠCH ĐIỆN TỬ .............................................................. 6
CHƯƠNG 1 MỞ ĐẦU QUÁ TRÌNH THIẾT KẾ MẠCH ĐIỆN TỬ ................. 6
I. 1.1 Các giai đoạn thiết kế trong các mạch tích hợp ..................................... 6
II. 1.2 Mô hình hoá mạch điện ...................................................................... 8
III. 1.3 Tổng hợp và tối ưu hoá mạch dùng máy tính ................................... 10
CHƯƠNG 2 GIỚI THIỆU PHẦN MỀM MÔ PHỎNG PROTUES .................. 12
IV. 2.2 Những khả năng khác của ISIS ........................................................ 12
V. 2.3 ARES PCB Layout ........................................................................... 12
VI. 2.4 Đặc điểm chính ................................................................................. 13
CHƯƠNG 3 THIẾT KẾ MẠCH......................................................................... 14
VII. 3.1 .Hướng dẫn sử dụng phần mềm protues ........................................... 14
3.1.1Vẽ sơ đồ nguyên lý với SIS 7............................................................... 14
3.1.3 Một số thao tác cơ bản ........................................................................ 16
3.1.4 Các công cụ chính ............................................................................... 25
VIII. 3.2 Các ví dụ thiết kế mạch nguyên lý “Sematic”, mạch in “PCB”.... 27
3.2.1 Thiết kế bộ nguồn 5V dùng IC ............................................................ 27
3.2.2 Thiết kế mạch khuyếch đại chế độ A dùng BJT 2N2222 ................... 29
3.2.3 Thiết kế mạch in mạch nguồn 12VDC ................................................ 34
CHƯƠNG 4 ĐIỂM CẦN LƯU Ý KHI THIẾT KẾ MẠCH .............................. 44
IX. 4.1 Điểm cần lưu ý khi thiết kế mạch in................................................. 44
X. 4.2 Thiết kế mạch nguyên lý .................................................................. 45
PHẦN III: LẬP TRÌNH VI ĐIỀU KHIỂN ......................................................... 46
CHƯƠNG 1: VI ĐIỀU KHIỂN AT89S52 ......................................................... 46
XI. GIỚI THIỆU ........................................................................................... 46
1) Tổng quan Vi xử lý (VXL) và Vi điều khiển (VĐK).......................... 46
2) Họ VĐK MCS-51 ................................................................................ 47
XII. CẤU TRÚC VĐK AT89S52 .................................................................. 48
1) Thông số chung ................................................................................... 48
2) Sơ đồ chân ........................................................................................... 48
3) Cấu trúc trong AT89S52 ..................................................................... 53
CHƯƠNG 2: KIT PHÁT TRIÊN 89S52 V3 ...................................................... 55
I. GIỚI THIỆU CHUNG ............................................................................... 55
II. CÁC KHỐI NGOẠI VI CÓ SẴN TRÊN KIT ....................................... 56
1) Khối cấp nguồn.................................................................................... 56
2) Khối VĐK trung tâm AT89S52 .......................................................... 57
3) Khối nút nhấn và Led .......................................................................... 58
4) Khối điều khiển Rơ le và còi chip ....................................................... 59
5) Khối cổng truyền thông RS232 ........................................................... 59
6) Khối Led 7 thanh ................................................................................. 60
7) Khối LCD ............................................................................................ 61
8) Khối RTC I2C DS1302 ....................................................................... 62
9) Khối EEPROM I2C 24C08 ................................................................. 62
10) Khối EEPROM SPI X5045 ................................................................. 63
11) Khối ADC0832 .................................................................................... 63
12) Khối cảm biến nhiệt độ 1 dây DS18B20 ............................................. 63
13) Khối tạo dao động ............................................................................... 64
CHƯƠNG 3: NGÔN NGỮ LẬP TRÌNH C CHO AT89S52 ............................. 65
I. KIỂU DỮ LIỆU TRONG C ...................................................................... 65
1) Kiểu dữ liệu cơ bản của C ................................................................... 65
2) Kiểu dữ liệu bổ xung trong Keil C ...................................................... 66
3) Kiểu dữ liệu Mảng ............................................................................... 67
4) Kiểu dữ liệu Con trỏ ............................................................................ 67
5) Kiểu dữ liệu Cấu trúc .......................................................................... 68
II. PHÉP TOÁN .......................................................................................... 68
1) Phép gán giá trị .................................................................................... 68
2) Phép toán số học .................................................................................. 68
3) Phép toán Logic ................................................................................... 69
4) Các phép toán so sánh ......................................................................... 69
5) Phép toán thao tác Bit .......................................................................... 70
6) Phép toán kết hợp ................................................................................ 70
III. CẤU TRÚC CHƯƠNG TRÌNH ............................................................ 70
1) Cấu trúc chung ..................................................................................... 70
2) Chỉ thị tiền xử lý .................................................................................. 71
3) Chú thích trong chương trình .............................................................. 73
IV. CÁC LÊNH CƠ BẢN TRONG C .......................................................... 74
1) Câu lệnh rẽ nhánh ................................................................................ 74
2) Câu lệnh lựa chọn ................................................................................ 74
3) Vòng lặp xác định - For ....................................................................... 75
4) Vòng lặp không xác định - while ........................................................ 75
5) Vòng lặp không xác định - do while ................................................... 75
CHƯƠNG 4: LẬP TRÌNH VI ĐIỀU KHIỂN .................................................... 76
I. GIAO TIẾP VỚI GPIO ............................................................................. 76
II. HIỂN THỊ TRÊN LED 7 THANH ......................................................... 77
1) Cấu tạo Led 7 thanh đơn...................................................................... 77
2) Cấu tạo Led 7 thanh 4 số ..................................................................... 78
3) Một số phương pháp hiển thị Led 7 thanh .......................................... 79
III. HIỂN THỊ TRÊN LCD16x02 ................................................................ 80
1) Cách kết nối VĐK 8051 với LCD ....................................................... 80
2) Các hàm điều khiẻn LCD .................................................................... 81
3) Hiển thị trên LCD ................................................................................ 82
IV. ĐỌC MA TRẬN PHÍM 4x4 .................................................................. 83
1) Cấu tạo ma trận phím 4x4 ................................................................... 83
2) Thuật toán đọc ma trận phím ............................................................... 85
3) Đọc ma trận phím và hiển thị trên LCD1602 ...................................... 85
V. SỬ DỤNG TIMER/COUNTER ............................................................. 87
1) Timer/Counter trong 8051: .................................................................. 87
2) Định thời 16 bit: .................................................................................. 88
3) Tạo Baud Rate bằng timer 1: ............................................................... 89
4) Tạo Baud Rate bằng timer 2: ............................................................... 89
VI. GIAO TIÊP UART ................................................................................. 90
1) UART trong 8051. ............................................................................... 90
2) Lập trình UART .................................................................................. 90
3) Bài toán ví dụ: ..................................................................................... 92
VII. NGẮT NGOÀI ....................................................................................... 92
1) Ngắt ngoài với 8051. ........................................................................... 93
2) Bài toán ví dụ: ..................................................................................... 93
VIII. GIAO TIẾP DS18B20 ......................................................................... 94
1) Cấu tạo và đặc tính kỹ thuật của DS18B20 ......................................... 94
2) Lập trình đo nhiệt độ với VĐK 89S52. ............................................... 96
IX. GIAO TIẾP VỚI EEPROM 24C08 ........................................................ 97
1) EEPROM 24CXX ............................................................................... 97
2) Giao tiếp với EEPROM 24CXX ......................................................... 98
3) Bài toán ví dụ: ..................................................................................... 99
X. GIAO TIẾP VỚI ADC 0832 .................................................................. 99
1) ADC0832 ........................................................................................... 100
2) Bài toán ví dụ: ................................................................................... 100
XI. GIAO TIẾP VỚI IC THỜI GIAN THỰC DS1302.............................. 101
1) DS1302 .............................................................................................. 101
2) Lập trình giao tiếp với DS1302. ........................................................ 102
3) Bài toán ví dụ: ................................................................................... 103
PHẦN II: LINH KIỆN ĐIỆN TỬ
PHẦN II: THIẾT KẾ MẠCH ĐIỆN TỬ
CHƯƠNG 1 MỞ ĐẦU QUÁ TRÌNH THIẾT KẾ MẠCH ĐIỆN TỬ

I. 1.1 Các giai đoạn thiết kế trong các mạch tích hợp
Sự ra đời của các mạch điện tử đã làm cơ sở phát triển phần cứng và phần
mềm của các hệ thống tính toán trong những thập kỷ gần đây. Việc tăng liên tục
mức độ tích hợp của các mạch điện tử trên một nền đơn đã đưa tới việc chế tạo
những hệ thống với độ phức tạp ngày càng tăng. Việc ra đời của những mạch
điện tử đã làm nảy sinh sự cần thiết phải có một phương pháp luận và quy trình
thiết kế, chế tạo thích hợp.
Trong công nghiệp, việc chế tạo các mạch tích hợp được thực hiện qua 4
giai đoạn:
• Giai đoạn thiết kế
• Giai đoạn chế tạo
• Giai đoạn kiểm tra
• Giai đoạn đóng gói
Giai đoạn thiết kế: từ các chức năng mà mạch sẽ thực hiện, chúng ta xây
dựng mô hình của mạch trên nhiều mức độ chi tiết khác nhau. Các mức độ chi
tiết có thể được chia thành mức kiến trúc, mức logic, mức vật lý. Kết quả của
giai đoạn thiết kế là các mô hình của mạch đã được xác nhận không chứa lỗi
trên phương diện thiết kế.
Giai đoạn chế tạo: mạch tích hợp sẽ được chế tạo theo các công nghệ cấy
ghép các phần tử mạch lên các tinh thể chất bán dẫn bằng phương pháp mặt nạ
che phủ và công nghệ xây dựng các mạch nhiều lớp. Kết quả của giai đoạn này
là những vi mạch thực hiện những chức năng như trong thiết kế.
Giai đoạn kiểm tra: Những mạch đã chế tạo sẽ được kiểm nghiệm ngẫu
nhiên để khẳng định rằng mạch không chứa lỗi về mặt chế tạo. Trong trường
hợp có những lỗi gặp nhiều lần có thể rút ra kết luận lỗi đó có thể là lỗi trong
quá rình chế tạo. Dựa vào việc kiểm tra quy trình công nghệ ta có thể rút ra kết
luận về các khâu có thể sinh ra lỗi.
Giai đoạn cuối cùng là giai đoạn đóng gói. Lúc đó các mạch sẽ được phân
tách và được tạo vỏ bọc.
Quá trình thiết kế vi mạch điện tử trong công nghiệp được chia làm 3 phân
đoạn:
• Mô hình hóa
• Tổng hợp và tối ưu hóa
• Kiểm nghiệm và phê chuẩn
Mô hình hóa: Nhà thiết kế xây dựng các mô hình cấu trúc mạch và các
chức năng mà mạch sẽ thực hiện. Các mô hình mạch là công cụ biểu diễn các ý
tưởng thiết kế. Mô hình hóa đóng vai trò quan trọng trong thiết kế mạch điện tử
bởi vì các mô hình là các phương tiện mang thông tin về các mạch sẽ được xây
dựng một cách cô đọng và chính xác. Do đó mô hình cần phải chính xác, chặt
chẽ cũng như có mức độ tổng quát, trong suốt và dễ hiểu đối với người thiết kế
và máy. Với sự phát triển của các kỹ thuật mô phỏng, mô hình mạch có thể được
xây dựng trên cơ sở các ngôn ngữ mô tả phần cứng. Trong nhiều trường hợp,
các mô hình đồ họa như biểu đồ dòng thông tin, sơ đồ mạch và mô tả hình dạng
hình học của các đối tượng cũng như cách sắp xếp chúng trên bản mạch đều có
thể dùng để biểu diễn mạch. Đối với những mạch có độ tích hợp siêu lớn do độ
phức tạp của mạch rất cao nên việc xây dựng mô hình mạch thường theo các
mức độ chi tiết khác nhau. Điều đó cho phép người thiết kế tập trung vào từng
phần của mô hình tại từng giai đoạn thiết kế.
Tổng hợp: Tổng hợp là giai đoạn sáng tạo thứ hai của quá trình thiết kế.
Giai đoạn đầu tuân theo các ý tưởng của nhà thiết kế hình thành dần các khái
niệm về mạch và xây dựng những mô hình sơ bộ đầu tiên về mạch. Mục đích
chính của giai đoạn này là xây dựng mô hình chi tiết của mạch như các chi tiết
về dạng hình học phục vụ cho công đoạn lắp ráp và tạo vỏ bọc cho mạch. Điều
này đạt được thông qua quá trình xây dựng và chính xác hóa thiết kế từng bước
trong đó mô hình trừu tượng ban đầu được người thiết kế chi tiết hóa từng bước
lặp đi lặp lại. Khi thực hiện quá trình tổng hợp mạch theo các bước cải tiến mô
hình, người thiết kế cần nhiều thông tin liên quan tới các công nghệ chế tạo và
các phong cách thiết kế mong muốn. Ta có thể thấy các chức năng của mạch có
thể độc lập với các chi tiết thực hiện, trong khi đó các dạng biểu diễn hình học
của mạch hoàn toàn phụ thuộc vào các đặc tính của công nghệ như kích thước
của các dây dẫn trong mạch phụ thuộc vào công nghệ chế tạo.
Bài toán tối ưu mạch luôn kết hợp chặt chẽ với bài toán tổng hợp mạch.
Quá trình tối ưu đòi hỏi phải lựa chọn những chi tiết xác định của mạch với mục
đích làm tăng khả năng của mạch về phương diện thiết kế tương ứng với những
độ đo xác định. Vai trò của tối ưu là nâng cao chất lượng của mạch điện như tối
ưu về chức năng, về diện tích, về tính dễ kiểm nghiệm và phát hiện lỗi. Chức
năng liên quan đến thời gian để thực hiện một quá trình xử lý thông tin cũng như
số lượng thông tin có thể được xử lý trong một đơn vị thời gian. Các tính năng
của mạch là ảnh hưởng lớn tới khả năng cạnh tranh của mạch trên thị trường.
Vấn đề chất lượng của mạch cũng liên quan tới kích thước cũng như diện tích
của mạch. Diện tích cũng là đối tượng của tối ưu mạch. Kích thước nhỏ của
mạch cho phép có thể phân bố nhiều mạch trên một lớp, điều đó làm giảm giá
thành chế tạo và đóng gói. Trong công nghiệp chế tạo chúng ta mang muốn có
những thiết kế cho phép phát hiện lỗi và xác định vị trí lỗi của mạch sau khi chế
tạo.Khả năng này, trong nhiều trường hợp, ảnh hưởng lớn tới chất lượng của
mạch. Một thông số quan trọng trong vấn đề phát hiện lỗi của mạch là phần trăm
lỗi có thể được phát hiện đối với một bộ giá trị thử nghiệm. Nói chung người
thiết kế mong muốn có những mạch dễ kiểm nghiệm, điều đó làm giảm giá
thành chung của quá trình sản xuất.
Quá trình phê chuẩn mạch là việc đạt được ở một mức độ chắc chắn hợp lý
rằng mạch điện sẽ làm việc đúng với giả thiết không có lỗi chế tạo. Nhằm loại
bỏ mọi lỗi thiết kế có thể có trước khi đưa vào sản xuất. Quá trình phê chuẩn
mạch bao gồm việc xây dựng mô hình mô phỏng mạch dựa trên thiết kế và thực
hiện kiểm tra. Mô phỏng mạch bao gồm phân tích các diễn biến hành vi của
mạch điện theo thời gian đối với một hoặc nhiều bộ giá trị đầu vào. Quá trình
mô phỏng có thể áp dụng trên nhiều mức thiết kế khác nhau tùy theo các mức
trừu tượng của mô hình.
II. 1.2 Mô hình hoá mạch điện
Mô hình mạch là biểu diễn trừu tượng trong đó chỉ ra những đặc tính thích
hợp mà không có những chi tiết tương ứng. Quá trình tổng hợp mạch là quá
trình tạo mô hình mạch bắt đầu từ những biểu diễn sơ lược nhất.Các mô hình
được phân loại theo các mức độ mô tả trừu tượng và các góc quan sát. Các mức
độ mô tả trừu tượng được chia làm ba mức như sau:
• Mức kiến trúc
Mạch điện được thể hiện qua tập hợp các thao tác như các tính toán trên dữ
liệu, các phép chuyển đổi và truyền thông tin. Ví dụ, trên mức kiến trúc, mạch
có thể được biểu diễn qua những mô hình trên các ngôn ngữ mô tả phần cứng,
những biểu đồ luồng thông tin.
Ví dụ minh họa sơ đồ cấu trúc phần cứng của rơ le P544:
• Mức logic
Mạch điện được thể hiện như tập hợp các chức năng logic và được chuyển
thành các hàm logic. Ví dụ, trên mức logic mạch có thể được biểu diễn thông
qua các biểu đồ chuyển trạng thái, các sơ đồ mạch lôgic.
• Mức hình học
Mạch có thể biểu diễn như tập hợp các đối tượng hình học. Ví dụ đơn giản
của biểu diễn hình học có thể là các lớp trong mạch nhiều lớp, dáng vẻ bề ngoài
và phân bố của các phần tử cấu thành mạch.
Các góc độ quan sát cũng được chia thành 3 góc độ:
• Góc độ hành vi: mô tả các chức năng của mạch mà không quan tâm tới
việc thực hiện các chức năng đó.
• Góc độ cấu trúc: mô tả mô hình mạch bằng các thành phần cơ bản của
mạch và các liên kết giữa các thành phần đó.
• Góc độ vật lý: có liên quan tới các đối tượng vật lý xuất hiện trong thiết
kế.
Các mô hình có các mức độ mô tả trừu tượng khác nhau và có thể được
quan sát theo những góc độ khác nhau.
Ví dụ: Ở mức kiến trúc theo góc độ hành vi thì mạch điện là tập hợp các
phép toán và sự liên quan giữa chúng với nhau, còn theo góc độ cấu trúc thì
mạch là tập hợp các khối cơ sở và các liên kết ghép nối giữa các khối cơ sở đó.
Nếu xét trường hợp thiết kế các mạch đồng bộ thì với các mô hình trên
mức logic, góc độ hành vi có thể là các lưu đồ chuyển trạng thái, còn góc độ cấu
trúc là các phần tử logic.
III. 1.3 Tổng hợp và tối ưu hoá mạch dùng máy tính
Các công cụ trợ giúp thiết kế bằng máy tính cho phép nâng cao năng suất
thiết kế. Các kỹ thuật thiết kế cho phép giảm thời gian nâng cao chu trình thiết
kế và giảm công sức con người. Các kỹ thuật tối ưu làm tăng chất lượng thiết kế.
Do đó kỹ thuật tổng hợp và tối ưu hóa mạch với sự trợ giúp của máy tính được
sử trong hầu hết các quá trình thiết kế mạch điện tử số.
Tổng hợp mạch điện gồm các phân đoạn sau:
 Tổng hợp ở mức kiến trúc bao gồm việc tạo ra góc độ cấu trúc của mô
hình ở mức kiến trúc, có nghĩa là xác định và phân các chức năng của mạch
thành các phép toán. Các phép toán này được gọi là tài nguyên thiết kế. Phân
đoạn này thường được gọi là tổng hợp ở mức cao hay tổng hợp cấu trúc vì ở đó
người thiết kế phải xác định các cấu trúc vĩ mô (trên mức độ các sơ đồ khối) của
mạch.
 Tổng hợp ở mức logic là phân đoạn tạo ra góc độ cấu trúc của mô hình ở
mức logic, gồm các thao tác sử dụng kỹ thuật logic để tạo nên mô hình logic.
Mô hình này bao gồm các phần tử logic cơ bản và kết nối giữa các phần tử đó.
Như vậy bước tổng hợp logic là bước xác định cấu trúc vi mô (ở mức các phần
tử logic cơ bản) của mạch.
 Tổng hợp ở mức hình học bao gồm việc tạo ra góc độ vật lý của mô hình
ở mức hình học. Ở mức này mô hình được mô tả thông qua các đặc tính của tất
cả các mẫu hình học tạo nên dạng của các mạch. Phân đoạn này thường được
gọi là thiết kế vật lý.
Tối ưu hóa mạch điện: Bài toán tối ưu hóa luôn đi đôi với bài toán tổng hợp
mạch. Tối ưu hóa không những để đạt được ở mức độ cao nhất về chất lượng
mạch mà còn tạo ra những mạch có tính cạnh tranh cao.
Xét hai độ đo chất lượng quan trọng: diện tích và hoạt động của mạch.
Ngoài ra một độ đo chất lượng quan trọng nữa là khả năng dễ kiểm tra và phát
hiện lỗi của mạch. Diện tích của mạch được xác định bằng tổng diện tích của
các phần tử mạch. Do đó diện tích của mạch có thể được xác định thông qua góc
độ cấu trúc của mạch nếu ta biết diện tích của từng thành phần mạch. Thông
thường các phần tử cơ bản của mạch logic là các phần tử logic, các thanh ghi,
các phần tử này có diện tích biết trước tùy thuộc vào từng loại thiết kế. Diện tích
các dây nối đóng vai trò quan trọng và không thể bỏ qua. Các thành phần diện
tích này có thể được xác định từ mô hình mạch trên góc độ vật lý hoặc ước
lượng từ các mô hình theo góc độ cấu trúc theo các phương pháp thống kê.
Hiệu năng của mạch được tối ưu hóa dựa trên thời gian trễ, thời gian đồng
bộ, cạnh tranh trên các phần tử,… Để tính toán độ đo hoạt động của mạch cần
thiết phải phân tích cấu trúc và hành vi của mạch. Vấn đề này khác nhau đối với
các loại mạch khác nhau. Hiệu năng của mạch tổ hợp được xác định thông qua
thời gian trễ truyền từ đầu vào đến đầu ra.
Ngoài ra, hiệu năng của mạch còn liên quan tới khả năng phát hiện lỗi và
định vị vị trí lỗi trong mạch.
Tóm lại bài toán tối ưu hóa thiết kế được đưa về kết hợp hai bài toán: giảm
thiểu diện tích thực tế của mạch và tăng hiệu năng của mạch với khả năng cao
nhất có thể có. Bài toán tối ưu hóa có thể phụ thuộc vào các ràng buộc như giới
hạn trên về diện tích và giới hạn dưới về hiệu năng.
CHƯƠNG 2 GIỚI THIỆU PHẦN MỀM MÔ PHỎNG PROTUES

2.1 Giới thiệu phần mềm thiết kế và mô phỏng mạch Protues


Điện tử hay những lĩnh vực khác: điện, thủy lực…thiết kế mạch là việc làm
thường xuyên. Nhưng muốn biết mạch thiết kế ra hoạt động như thế nào, có sai
sót gì không, trước khi tiến hành làm mạch thật thì làm thế nào? Câu trả lời, đó
là dùng các phần mềm mô phỏng (Simulation). Tuy nó chưa đạt độ chính xác
tuyệt đối như mạch thật nhưng cũng thõa mãn phần nào và giảm bớt chi phí thử
nghiệm do phải chết tạo mạch thật để đo đạc. Trong lĩnh vực điện tử, để mô
phỏng mạch điện tử, có rất nhiều phần mềm hỗ trợ như Proteus, Multisim,
Circuit Maker, OrCad. Proteus là phần mềm của hãng Labcenter Electronics, nó
mô phỏng được cho hầu hết các linh kiện điện tử thông dụng, đặc biệt có hỗ trợ
cho cả các MCU như PIC, 8051, AVR, Motorola.
Phần mềm Proteus là phần mềm cho phép mô phỏng hoạt động của mạch
điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển cho các họ
VĐK.
Phần mềm bao gồm 2 chương trình: ISIS cho phép mô phỏng mạch và
ARES dùng để vẽ mạch in. Proteus là công cụ mô phỏng cho các loại VĐK, nó
hỗ trợ các dòng VĐK 8051, AVR, PIC, dsPIC, ARM ... các giao tiếp I2C, SPI,
CAN, USB, Ethenet,... ngoài ra còn mô phỏng các mạch số, mạch tương tự một
cách hiệu quả. Proteus là bộ công cụ chuyên về mô phỏng mạch điện tử.
IV. 2.2 Những khả năng khác của ISIS
- Tự động sắp xếp đường mạch và vẽ điểm giao đường mạch.
- Chọn đối tượng và thiết lập thông số cho đối tượng dễ dàng.
- Xuất file thống kê linh kiện cho mạch.
- Xuất ra file Netlist tương thích với các chương trình làm mạch in thông
dụng.
- Đối với người thiết kế mạch chuyên nghiệp, ISIS tích hợp nhiều công cụ
giúp cho việc quản lý mạch điện lớn, mạch điện có thể lên đến hàng ngàn
linh kiện.
- Thiết kế theo cấu trúc (hierachical design).
- Khả năng tự động đánh số linh kiện dễ dàng.
V. 2.3 ARES PCB Layout
ARES (Advanced Routing and Editing Software) là phần mềm vẽ mạch in
PCB. Nó vẽ mạch dựa vào file nestlist cùng các công cụ tự động khác.
VI. 2.4 Đặc điểm chính
- C
ó cơ sở dữ liệu 32 bit cho phép độ chính xác đến 10nm, độ phân giải góc
0.10 và kích thước board lớn nhất là /- 10 mét. ARES hỗ trợ mạch in 16
lớp.
- L
àm việc thông qua các menu ngữ cảnh tiện lợi.
- F
ile netlist từ phần mềm vẽ mạch nguyên lý ISIS.
- T
ự động cập nhật ngược chỉ số linh kiện, sự đổi chân, đổi cổng ở mạch in
sang mạch nguyên lý.
- C
ông cụ kiểm tra lỗi thiết kế.
- T
hư viện đầy đủ từ lỗ khoan mạch đến linh kiện dán.
- P
ROTEUS VSM là sự kết hợp giữa chương trình mô phỏng mạch điện
theo chuẩn công nghiệp SPICE3F5 và mô hình linh kiện tương tác động
(animated model). Nó cho phép người dùng tự tạo linh kiện tương tác
động và thực ra có rất nhiều linh kiện loại này được tạo ra mà không cần
code lập trình. Do đó, PROTEUS VSM cho phép người dùng thực hiện
các “mô phỏng có tương tác” giống như hoạt động của một mạch thật.
- C
hương trình cung cấp cho chúng ta rất nhiều mô hình linh kiện có chức
năng mô phỏng, từ các VĐK thông dụng đến các linh kiện ngoại vi như
LED, LCD, keypad, cổng RS232… Do đó cho phép ta mô phỏng từ một
hệ VĐK hoàn chỉnh đến việc xây dựng phần mềm cho hệ thống đáp ứng
các giao thức vật lý.
CHƯƠNG 3 THIẾT KẾ MẠCH

VII. 3.1 .Hướng dẫn sử dụng phần mềm protues


3.1.1Vẽ sơ đồ nguyên lý với SIS 7
Chú ý: tương tự đối với protues 7.7, 8.0, 8.1, 8.2

3.1.1.1Giới thiệu giao diện sử dụng


Để vẽ sơ đồ nguyên lý, vào Start Menu khởi động chương trình ISIS như
hình Chương trình được khởi độnng và có giao diện như hình vẽ.

Giao diện khởi động

Giao diện sau khi khởi động


Phía trên và phía phải của chương trình là các công cụ có thể thiết kế sơ đồ
nguyên lý. Phần giữa có màu xám là nơi để vẽ mạch.
Section mode: Chức năng này để chọn linh kiện
Component mode: Dùng để lấy linh kiện trong thư viện linh kiện
Đặt lable cho wire

Bus.
Terminal: Chứa Power, Ground.
Graph: Dùng để vẽ dạng sóng, datasheet, trở kháng.

Generator Mode: Chứa các nguồn điện, nguồn xung, nguồn dòng.
Voltage Probe Mode: Dùng để đo điện thế tại 1 điểm trên mạch, đây
là 1 dụng cụ chỉ có 1 chân và không có thật trong thức tế.

Curent Probe mode: Dùng để đo chiều và độ lớn của dòng điện tại
1điểm trên wire.

Virtual Instrument Mode: Chứa các dụng cụ đo dòng và áp, các dụng
cụ này được mô phỏng như trong thực tế.

Với công cụ này, sau khi thiết kế mạch nguyên lý xong, có thể xác định
được một cách nhanh chóng loại và số lượng linh kiện mà ta dùng trong mạch để
tiện cho việc mua linh kiện lắp mạch.
3.1.3 Một số thao tác cơ bản
Giao diện chính của chương trình gồm 2 phân vùng chủ yếu sau:

Zooming
Có thể dùng Zoom in, Zoom out, Zoom Area trên menu Tools bar

Có thể dùng Mouse Scrool: Đặt con trỏ chuột nơi cần phóng to, thu nhỏ và
xoay Scrool mouse.
Có thể dùng phím tắt mà ta thiết lập cho chương trình.
Để lấy linh kiện ra và vẽ mạch, chọn linh kiện ở vùng mầu trắng đã nói ở
trên.

Ví dụ ta chọn 741, khi đó trên khung Overview xuất hiện Schematic của
linh kiện đó.

Sau đó đưa chuột qua vùng Editting Window, khi đó hình dạng linh kiện
hiện ra có màu đỏ.
Ta chỉ việc chọn vị trí đặt linh kiện phù hợp và Click, kết quả như sau.
Một đặc điểm rất hay của phân mêm này là có thê phóng to thu nhỏ vùng
làm việc bằng cách dùng Scroll của chuột. Nhấn F8 để Zoom 100%.
Move linh kiện: Chọn linh kiện

Right Click và chọn Drag Object

Sau đó ta có thể di chuyển linh kiện sang một ví trí khác


Ta cũng có thể Copy, Move, Rotate, Delete linh kiện bằng cách chọn nhóm
công cụ sau.

Wire. chọn công cụ Selection Mode

Sau đó đưa chuột lại chân linh kiện, khi đó con trỏ chuột có dạng một cây
bút màu xanh.

Click vào chân linh kiện để nối dây vào chân đó, sau đó đưa chuột đến chân
còn lại mà ta muốn.
Delete wire bằng cách Right Click 2 lần lên dây.
Hình dạng đường đi của dây di qua các điểm mà ta click chuột.
Wire repet
Khi cần nối dây giữa các chân của hai linh kiện gần nhau, ta có thê dùng
phương pháp nối dây lặp lại bằng cách nối hai chân bất kỳ làm mẫu.
Double click vào các chân tiếp theo, dây sẻ được tự động nối.

Move wire
Tương tự như Block move

To edit a wires topology after routing:


Ta cũng có thể Rotate/Mirror linh kiện trước khi đặt nó trong Editting
Window bằng cách chọn nhóm công cụ, sự thay đổi được hiển thị trên Overview.

Editing Part Labels.


Có thể ẩn hoăc hiện tên, giá trị của linh kiện bằng cách.
Right Click /Edit Properties.

Check/Uncheck Hidden
Block editing.
Để move/copy cả khối linh kiện ta làm như sau:
Chọn công cụ Selection tools;
Kéo chuột và chọn cả khối linh kiện;
Right Click và chọn Move/Copy.

Design Explorer
Đây là công cụ tạo ra cái nhìn toàn cảnh thiết kế:
Chứa danh sách gồm tên, kiểu, thông số, circuit/package.
Hiển thị những thiếu sót của mạch:

Từ đó xác định linh kiện con thiếu sót để bổ sung:


Nếu đã thiết kế PCB layout thi có thể biết được vị trí đó trên Board (linh
kiện đã được hightlight).

3.1.4 Các công cụ chính


Ground

Ký hiệu trên sơ đồ:

Power có kí hiệu như sau:


Cung cấp năng lượng cho mạch, tùy theo cách đặt tên cho nguồn mà ta có
nguồn âm hay dương.
Nếu đặt là + thì ta có nguồn dương, ngược lai để có nguồn âm thì đặt tên
cho nguồn là – trước giá trị điện thế:

Nếu đặt tên cho Power là VCC hay VEE thì giá trị điện thế nhân được là +/-
5V:
Ngoài ra còn có các Terminal default để làm các cực giao tiếp:

Ví dụ như sau:

Lable:
Để bản vẽ được gọn gàng, ta có thể dùng Lable để đặt cho wire. Trên wire,
Right Click và chọn Place wire lable:
VIII. 3.2 Các ví dụ thiết kế mạch nguyên lý “Sematic”, mạch in
“PCB”
3.2.1 Thiết kế bộ nguồn 5V dùng IC
Vào Pick Device, lấy các linh kiện cần thiết như 7805, tụ điện, led, điện
trở…
Vẽ mạch như hình:
Để thay đổi điện thế Vsin cung cấp cho mạch, double click vào Vsin.
Chọn các thông số: Amplitude = 9, Frequency=50 ~ 60Hz

Đây là dạng sóng vào:


Đây là dạng sóng ra:

3.2.2 Thiết kế mạch khuyếch đại chế độ A dùng BJT 2N2222


Mạch khuyếch đại chế độ A là mạch có VCE/Q=1/2.VCC.
Sơ đồ mạch như sau:
Tính toán các giá trị của R để phân cực cho BJT.
Trước hêt chúng ta vẽ đặc tuyến IC-VCE của 2N2222, vẽ mạch như hình
sau:

Chọn công cụ Generator , chọn DC , click vào nguồn


điện vừa tạo để edit.
Chọn IB là Current Source.
Tương tự cho VCE.

Chọn công cụ Graph .

Chọn Tranfer và vẽ “máy vẽ đặc tuyến” như hình dưới:

Double click vào Graph vùa mới vẽ để edit:


Sau đó chon Add Trace, chọn IC;

Sau khi hoàn tất, chọn Simulation graph:

Kết quả như sau:


Giả sử tải của chúng ta có giá trị là 2.2K, áp trên tải là 5V nên
ICQ=5/2.2K=2.2mA. Có thể chọn điểm làm việc có IB=10u và IC=2.11mA.
Sụt áp trên R1 là 1 V, khi đó R1=1/2.11m=473 Ohm, chon R1=470 Ohm,
theo Datasheet ta có IB=10uA, để ổn định phân cực ta chọn dòng qua:
IR4 = 20.IB = 20.10u = 200uA
VB = 0.66V

Nên R4=1.66/200u=8.3K R3=(12-1.66)/210u = 50K


Cuối cùng Press F12 ta có kết quả như hình:
Ta thấy VCE gần bằng 6V.

3.2.3 Thiết kế mạch in mạch nguồn 12VDC


Thiết kế bộ nguồn cho mạch, có thể sử dụng 7812 và 1 số phụ kiện khác
như hình vẽ.

Phải kiểm tra chắn rằng tất cả các linh kiện đều đã được đóng gói, tức là
hình dáng và chân đã được xác định như hình vẽ, Right Click và chọn Packing
tool.
Chuyển sơ đồ nguyên lý từ ISIS sang ARES bằng cách nhấn vào biểu
tượng ARES

trên thanh công cụ nằm ngang. Chương trình ARES sẽ được khởi
động như hình:

Nhấp chuột vào biểu tượng 2D Graphic Box kẻ 1 khung hình chữ nhật,
khung này sẽ tạo thành Board mạch:
Right-click vào khung vừa vẽ, chọn Change Layer/ Board Edge:

Tiếp theo, lấy linh kiện và bỏ vào Board vừa tạo:


Nếu không muốn làm công việc này Manual thì có thể dùng công cụ
AutoPlace để ARES tự đông sắp xếp linh kiện.

Để nối dây, nhấp chuột vào biểu tượng Autorouter , một hộp thoại hiện
ra, chọn Edit Strateies:

Để làm mạch in 1 lớp ta chọn Pair 1 chỉ có Bottom copper, chon Trace
Style là T50.
Trace- Trace clearnance là 20th.
Tương tự cho phần Signal:

Sau đó OK, ta được kết quả:


Ta có thể thay đổi độ lớn của mạch dây bằng cách chọn Section Mode ,
sau đó Right Click trên dây:

Đo kích thước của boad, chon Dimension Mode và đo kích thước.

Để thay đổi đơn vị đo, Right Click và chọn Properties.


Hộp tùy chọn hiện ra.

Ta được đơn vị đo là inch:

Để ghi tên lên Board, chọn công cụ 2D Graphic Text mode và click
lên vùng của boad mà ta muốn đặt text, một tùy chọn hiện ra. Ok sau khi hoàn
thành.

Right Click trên Text vừa tạo, chọn Properties để thay đổi layer:
Sau đó chọn X mirror:

Để xem hình ảnh 3D board mạch chúng ta vừa tạo, chọn Output/3D.
Hình ảnh TOP 3D của mạch in như sau:
Đây là BOTTOM:

Để tiết kiệm muối sắt làm mạch, ta có thể đổ đồng cho Board:

Tùy chọn hiện ra, chọn Net là VCC hay GND:


Sau đó OK, ta được kết quả:
CHƯƠNG 4 ĐIỂM CẦN LƯU Ý KHI THIẾT KẾ MẠCH

IX. 4.1 Điểm cần lưu ý khi thiết kế mạch in


- Vẽ tự động sẽ tạo ra các đường nét không tối ưu, nhiều khi chạy vòng
vòng (nhiều khi 2 con linh kiện sát nhau mà không nối với nhau luôn mà
lại vòng qua chỗ khác). Các đường nét của vẽ tự động không đẹp như vẽ
tay, chạy jump nhiều.
- Padstack là bao gồm tất cả các lớp của 1 chân linh kiện.
- Net là độ rộng của dây nối khi vẽ mạch in (độ rộng của dây dẫn nhỏ hay
lớn). Đơn vị tính độ rộng: 1mil=0.0254mm => 1 mm = 39.37mm.
- Pad chọn 80-85 là kinh nghiệm sau nhiều lần làm mạch chọn lựa như vậy
là hợp lý, nhưng chỉ sử dụng pad 58mil cho IC và 65mil cho tụ trở, các
linh kiện lớn hơn thì chọn 80mil.
- Khoảng cách giữa 2 chân linh kiện như IC hay 1 số linh kiện nhiều chân
là do nhà sản xuất quy định (thường là theo 1 chuẩn các IC là 2.54mm,
khi vẽ sang kích thước mil là chọn vừa bằng 100mil). 2.54mm là đối với
các IC họ có package là DIP hoạc SIP, còn đối với các IC có package là
SOIC thì khoảng cách là 1.27mm (50mil), SSOP khoảng cách 2 chân là
0.635mm (25mil) và còn nhiều loại có package với khoảng cách 2 chân
nhỏ hơn rất nhiều. những loại này thì phải dùng máy scan chì để quét chì
sau đó dùng máy để dán linh kiện và qua máy sấy mới được. Còn những
loại lớn hơn như SOIC hay SSOP thì có thể dùng máy cắm keo, sau đó
dùng máy dán linh kiện và cho qua máy sấy và qua bể nhúng chì.
- Độ rộng dây nhỏ nhất 3.75 mil là do nhà sản xuất mạch in quy định, ở
Việt Nam thì độ rộng nhỏ nhất có thể làm là 10mil.
- Các pad đều chọn Round vì tạo thẩm mỹ, nhỏ gọn và vẫn đảm bảo độ
bám chắc, không tốn diện tích như các loại pad khác.
- Khi vẽ mạch để đảm bảo tính về chống nhiễu của điện từ, thường sẽ đổ
đất cho các mạch để đảm báo tính chống nhiễu.
- Khi thiết kế mạch thường thiết kế làm sao cho đảm bảo tính tiện dụng khi
lắp đặt và kết nối với các module khác.
Ví dụ minh họa vị trí lắp đặt thông thường:
X. 4.2 Thiết kế mạch nguyên lý
- Đối với các mạch nguyên lý đơn giản ta có thể để mặc định dùng A4 để
thiết kế mạch, và nối các dây các điểm tín hiệu lại với nhau.
- Đối với các mạch lớn, sử dụng A3 đến A0 thì cần chia nhỏ thành các phân
vùng để dễ quản lý. Các đường tín hiệu nối dây trực tiếp mà dùng kí hiệu
để kết nối, sẽ làm mạch thoáng, để quản lý kiểm soát các đường tín hiệu.
PHẦN III: LẬP TRÌNH VI ĐIỀU KHIỂN
CHƯƠNG 1: VI ĐIỀU KHIỂN AT89S52

XI. GIỚI THIỆU

1) Tổng quan Vi xử lý (VXL) và Vi điều khiển (VĐK)

Trong những thập niên cuối thế kỉ XX, từ sự ra đời của công nghệ bán
dẫn, kĩ thuật điện tử đã có sự phát triển vượt bậc. Các thiết bị điện tử sau đó đã
được tích hợp với mật độ cao và rất cao trong các diện tích nhỏ, nhờ vậy các
thiết bị điện tử nhỏ hơn và nhiều chức năng hơn. Các thiết bị điện tử ngày càng
nhiều chức năng trong khi giá thành ngày càng rẻ hơn, chính vì vậy điện tử có
mặt khắp mọi nơi.

Bước đột phá mới trong công nghệ điện tử, công ty trẻ tuổi Intel cho ra
đời bộ vi xử lý đầu tiên. Đột phá ở chỗ: "Đó là một kết cấu logic mà có thể thay
đổi chức năng của nó bằng chương trình ngoài chứ không phát triển theo hướng
tạo một cấu trúc phần cứng chỉ thực hiện theo một số chức năng nhất định như
trước đây"(trích từ tài liệu 'Kĩ thuật VI XỬ LÝ và lập trình ASSEMBLY cho hệ
vi xử lý', tác giả Đỗ Xuân Tiến). Tức là phần cứng chỉ đóng vai trò thứ yếu,
phần mềm (chương trình) đóng vai trò chủ đạo đối với các chức năng cần thực
hiện. Nhờ vậy vi xử lý có sự mềm dẻo hóa trong các chức năng của mình. Ngày
nay vi xử lý có tốc độ tính toán rất cao và khả năng xử lý rất lớn.

Vi xử lý có các khối chức năng cần thiết để lấy dữ liệu, xử lý dữ liệu và


xuất dữ liệu ra ngoài sau khi đã xử lý. Và chức năng chính của Vi xử lý chính là
xử lý dữ liệu, chẳng hạn như cộng, trừ, nhân, chia, so sanh … Vi xử lý không có
khả năng giao tiếp trực tiếp với các thiết bị ngoại vi, nó chỉ có khả năng nhận và
xử lý dữ liệu mà thôi.

Vì một số nhược điểm trên nên các nhà chế tạo tích hợp một ít bộ nhớ và
một số mạch giao tiếp ngoại vi cùng với vi xử lý vào một IC duy nhất được gọi
là Microcontroller-Vi điều khiển. VĐK có khả năng tương tự như khả năng của
vi xử lý, nhưng cấu trúc phần cứng dành cho người dùng đơn giản hơn nhiều.
VĐK ra đời mang lại sự tiện lợi đối với người dùng, họ không cần nắm vững
một khối lượng kiến thức quá lớn như người dùng vi xử lý, kết cấu mạch điện
dành cho người dùng cũng trở nên đơn giản hơn nhiều và có khả năng giao tiếp
trực tiếp với các thiết bị bên ngoài. VĐK tuy được xây dựng với phần cứng dành
cho người sử dụng đơn giản hơn, nhưng thay vào lợi điểm này là khả năng xử lý
bị giới hạn (tốc độ xử lý chậm hơn và khả năng tính toán ít hơn, dung lượng
chương trình bị giới hạn). Thay vào đó, VĐK có giá thành rẻ hơn nhiều so với vi
xử lý, việc sử dụng đơn giản, do đó nó được ứng dụng rộng rãi vào nhiều ứng
dụng có chức năng đơn giản, không đòi hỏi tính toán phức tạp.

VĐK được ứng dụng trong các dây chuyền tự động loại nhỏ, các robot có
chức năng đơn giản, trong máy giặt, ôtô v.v...

2) Họ VĐK MCS-51

Hiện nay có rất nhiều họ VĐK trên thị trường với nhiều ứng dụng khác
nhau, trong đó họ VĐK họ MCS-51 được sử dụng rất rộng rãi trên thế giới và ở
Việt nam.

Vào năm 1980 Intel công bố chíp 8051(80C51), bộ VĐK đầu tiên của họ
VĐK MCS-51. Nó bao gồm 4KB ROM, 128 byte RAM, 32 đường xuất nhập, 1
port nối tiếp và 2 bộ định thời 16 bit. Tiếp theo sau đó là sự ra đời của chip
8052, 8053, 8055 với nhiều tính năng được cải tiến.

Sau khoảng thời gian cải tiến và phát triển, hãng Atmel tung ra thị trường
dòng VĐK mang số hiệu 89Sxx với nhiều cải tiến và đặc biệt là có thêm khả
năng nạp chương trình theo chế độ nối tiếp rất đơn giản và tiện lợi cho người sử
dụng.

Dung lượng RAM Dung lượng ROM Chế độ nạp

89S51 128 byte 4 Kbyte nối tiếp

89S52 128 byte 8 Kbyte nối tiếp


89S53 128 byte 124 Kbyte nối tiếp

89S55 128 byte 20 Kbyte nối tiếp

XII. CẤU TRÚC VĐK AT89S52

1) Thông số chung

Có 8Kbyte bộ nhớ FLASH ROM bên trong để lưu chương trình, có khả
năng nạp xoá chương trình bằng điện đến 10000 lần.

128 Byte RAM nội

4 Port xuất/nhập 8 bit

3 bộ định thời 16-bit

Có khả năng giao tiếp truyền dữ liệu nối tiếp

Có thể mở rộng không gian nhớ chương trình ngoài 64KByte (bộ nhớ
ROM ngoại), Dung lượng bộ nhớ ROM ngoại lớn nhất mà VĐK có thể kết nối
là 64KByte

Có thể mở rộng không gian nhớ dữ liệu ngoài 64KByte (bộ nhớ RAM
ngoại)

Bộ xử lí bit (thao tác trên các bit riêng rẽ)

210 bit có thể truy xuất đến từng bit

2) Sơ đồ chân

AT89S52 có nhiều kiểu đóng vỏ khác nhau: hai hàng chân DIP (Dual In-
Line Pakage); vỏ dẹt vuông QFP (Quad Flat Pakage): chíp không có chân đỡ
LLC (Leadless Chip Carrier. Tuy nhiên, vì hầu hết các nhà phát triển chính dụng
chíp đóng vỏ 40 chân với hai hàng chân DIP, nên chúng ta cùng khảo sát VĐK
với 40 chân dạng DIP
Sơ đồ chân PDIP:

Chân VCC: Chân số 40 là VCC cấp điện áp nguồn cho VĐK, Nguồn điện
cấp là +5V±0.5.

Chân GND: Chân số 20 nối GND (hay nối Mass).

Khi thiết kế cần sử dụng một mạch ổn áp để bảo vệ cho VĐK, cách đơn
giản là sử dụng IC ổn áp 7805.

Port 0 (P0) gồm 8 chân (từ chân 32 đến 39) có hai chức năng: (1) Chức
năng IO: các chân này được dùng để nhận tín hiệu từ bên ngoài vào để xử lí,
hoặc dùng để xuất tín hiệu ra bên ngoài, chẳng hạn xuất tín hiệu để điều khiển
led đơn sáng tắt; (2) Chức năng là bus dữ liệu và bus địa chỉ (AD7-AD0) : 8
chân này (hoặc Port 0) còn làm nhiệm vụ lấy dữ liệu từ ROM hoặc RAM ngoại
(nếu có kết nối với bộ nhớ ngoài), đồng thời Port 0 còn được dùng để định địa
chỉ của bộ nhớ ngoài.
Port 1 (P1) gồm 8 chân (từ chân 1 đến chân 8), chỉ có chức năng IO,
không có chức năng khác.

Port 2 (P2) gồm 8 chân (từ chân 21 đến chân 28) có hai chức năng: (1)
Chức năng IO; (2) Chức năng là bus địa chỉ cao (A8-A15): khi kết nối với bộ
nhớ ngoài có dung lượng lớn, cần 2 byte để định địa chỉ của bộ nhớ, byte thấp
do P0 đảm nhận, byte cao do P2 này đảm nhận.

Port 3 (P3) gồm 8 chân (từ chân 10 đến 17), có 2 chức năng: (1) Chức
năng IO; (2) Với mỗi chân có một chức năng riêng thứ hai như trong bảng sau:

Bit Tên Chức năng

P3.0 RxD Ngõ vào nhận dữ liệu nối tiếp

P3.1 TxD Ngõ xuất dữ liệu nối tiếp

P3.2 INT0 Ngõ vào ngắt cứng thứ 0

P3.3 INT1 Ngõ vào ngắt cứng thứ 1

P3.4 T0 Ngõ vào của Timer/Counter thứ 0

P3.5 T1 Ngõ vào của Timer/Counter thứ 1

P3.6 WR Ngõ điều khiển ghi dữ liệu lên bộ nhớ ngoài

P3.7 RD Ngõ điều khiển đọc dữ liệu từ bộ nhớ bên ngoài

Chân RESET (RST) chân số 9. Sơ đồ kết nối mạch reset:


Chân XTAL1 và XTAL2: Hai chân này có vị trí chân là 18 và 19 được sử
dụng để nhận nguồn xung clock từ bên ngoài để hoạt động, thường được ghép
nối với thạch anh và các tụ để tạo nguồn xung clock ổn định.

Sơ đồ kết nối mạch dao động bằng thạch anh:

Ghi chú: C1, C2= 30pF±10pF (thường được sử dụng với C1,C2 là tụ
33pF) dùng ổn định dao động cho thạch anh.

Chân cho phép bộ nhớ chương trình PSEN (program store enable) chân
29 dùng để truy xuất bộ nhớ chương trình ngoài. Chân này thường được nối với
chân OE (output enable) của ROM ngoài. Khi VĐK làm việc với bộ nhớ chương
trình ngoài, chân này phát ra tín hiệu kích hoạt ở mức thấp và được kích hoạt 2
lần trong một chu kì máy. Khi thực thi một chương trình ở ROM nội, chân này
được duy trì ở mức logic không tích cực (logic 1). Không cần kết nối chân này
khi không sử dụng đến.

Chân chốt địa chỉ ALE (chân 30). Khi VĐK truy xuất bộ nhớ từ bên
ngoài, port 0 vừa có chức năng là bus địa chỉ, vừa có chức năng là bus dữ liệu do
đó phải tách các đường dữ liệu và địa chỉ. Tín hiệu ở chân ALE dùng làm tín
hiệu điều khiển để giải đa hợp các đường địa chỉ và các đường dữ liệu khi kết
nối chúng với IC chốt.

Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động đưa vào
VĐK, như vậy có thể dùng tín hiệu ở ngõ ra ALE làm xung clock cung cấp cho
các phần khác của hệ thống.

Ghi chú: khi không sử dụng có thể bỏ trống chân này

Chân EA dùng để xác định chương trình thực hiện được lấy từ ROM nội
hay ROM ngoại. Khi EA nối với logic 1(+5V) thì VĐK thực hiện chương trình
lấy từ bộ nhớ nội; Khi EA nối với logic 0(0V) thì VĐK thực hiện chương trình
lấy từ bộ nhớ ngoại.

Sơ đồ kết nối các port với Led:

Khi Px.x ở mức 1 led không sáng

Khi Px.x ở mức 0 led sang


3) Cấu trúc trong AT89S52

a) Bộ nhớ ROM
Bộ nhớ ROM dùng để lưu chương trình do người viết chương trình viết
ra. Chương trình là tập hợp các câu lệnh thể hiện các thuật toán để giải quyết các
công việc cụ thể, chương trình do người thiết kế viết trên máy vi tính, sau đó
được đưa vào lưu trong ROM của VĐK, khi hoạt động, VĐK truy xuất từng câu
lệnh trong ROM để thực hiện chương trình. ROM còn dùng để chứa số liệu các
bảng, các tham số hệ thống, các số liệu cố định của hệ thống. Trong quá trình
hoạt động nội dung ROM là cố định, không thể thay đổi, nội dung ROM chỉ
thay đổi khi ROM ở chế độ xóa hoặc nạp chương trình (do các mạch điện riêng
biệt thực hiện).

Bộ nhớ ROM được tích hợp trong chip VĐK 89S52 là 8Kbyte và có địa
chỉ từ 0x0000 đến 0x1FFF
b) Bộ nhớ RAM
Bộ nhớ RAM dùng làm môi trường xử lý thông tin, lưu trữ các kết quả
trung gian và kết quả cuối cùng của các phép toán, xử lí thông tin. Nó cũng dùng
để tổ chức các vùng đệm dữ liệu, trong các thao tác thu phát, chuyển đổi dữ liệu.

RAM nội trong AT89S52 gồm 256 byte có địa chỉ từ 0x00 đến 0xFF;
trong đó 128 byte là các thanh ghi chức năng đặc biệt, người viết chương trình
chỉ sử dụng 128 byte RAM đầu tiên (Từ 0x00 đến 0x7F).

Có 210 vị trí được định địa chỉ bit, người dùng chỉ sử dụng 128 bit và có
địa chỉ từ 0x00 đến 0x7F

c) Chu kì máy
Chu kì máy là khoảng thời gian cần thiết được qui định để VĐK thực hiện
hoàn thành một lệnh cơ bản. Một chu kì máy bằng 12 lần chu kì dao động của
nguồn xung dao động cấp cho nó. Tck = 12.Toc

Ví dụ: Ta kết nối VĐK với thạch anh có tần số fzat là 12MHz, thì chu kì
máy

Tck=12/(12.106)=10-6s =1µs

Khi giao tiếp truyền nối tiếp với máy vi tính dùng thạch anh có tần số fzat
là 11.0592MHz.
CHƯƠNG 2: KIT PHÁT TRIÊN 89S52 V3

I. GIỚI THIỆU CHUNG

Kit phát triên AT89S52 V3 do công ty Minh Hà phát triển tháng 9.2012,
tích hợp sẵn nhiều ngoại vi trên 01 kít, từ đó người dung có thể thử nghiệm và
phát triển ứng dụng trên dòng VĐK AT89S52 thuộc họ MCS51 của ATMEL
II. CÁC KHỐI NGOẠI VI CÓ SẴN TRÊN KIT

1) Khối cấp nguồn

Trong đó:

 CON2: Socket cấp nguồn

 7805: IC ổn áp đầu ra 5V

 K1: Công tắc nguồn dạng nút bấm tự giữ

Nguồn cấp cho Kit có thể cấp qua Socket CON2 hoặc cổng USB.
2) Khối VĐK trung tâm AT89S52

Trong đó:

 U1: VĐK AT89S52

 P0..P3: Jump đực đôi dung cho kết nối mở rộng.

 RP2: Điện trở dãy 10kΩ, dùng để Pull-up cổng P0, có thể cấu hình
sử dụng Pull-up hay không thông qua Jumper JPR.

Mạch Reset cho VĐK:

Mạch dao động sử dụng thạch anh có tần số 11.0592MHz


3) Khối nút nhấn và Led

Cổng P1 được kết nối với ma trận 4x4 nút nhấn và 08 Led.

Đối với các nút nhấn có thể cấu hình thành dạng ma trận 4x4 hoặc sử
dụng 4 nút nối trực tiếp với GND (qua KGND).

Các Led được nối nối tiếp với 01 điện trở (Trong điện trở dãy RP1) để
hạn chế dòng qua Led; Có thể cấu hình sử dụng Led hay không thông qua
Jumper JPLED.
4) Khối điều khiển Rơ le và còi chip

Chân P1.0 được tùy chọn nối đến điều khiển 1 rơ le trung gian thông qua
1 transistor khuếch đại dòng điện.

Chân P1.3 được tùy chọn nối đến điều khiển 01 còi chíp thông qua 1
transistor khuếch đại dòng điện.

5) Khối cổng truyền thông RS232


02 chân P3.0 và P3.1 của VĐK được thiết kế cho chức năng truyền thông
UART, Kit được thiết kế them IC MAX232 để chuyển đổi tín hiệu từ chuẩn
UART sang RS232.

6) Khối Led 7 thanh

Kit được thiết kế 08 Led 7 thanh loại Anot chung và hoạt động ở chế độ
quét 1/8, tức là tại 1 thời điểm chỉ có 01 led 7 thanh sáng.

VĐK kết nối với bộ Led 7 thanh thông qua 2 cổng P0 và P2, cổng P0 kết
nối với các thanh A, B, …, G, DP của tất cả các Led 7 thanh thông qua các điện
trở 200Ω để hạn chế dòng qua Led; Cổng P2 kết nối với chân Anot chung của
các led 7 thanh và được khuếch đại bởi các transistor loại PNP (A1015, A564
…)
7) Khối LCD

Kit được thiết kế kết nối với 02 loại LCD gồm LCD1602 (02 hàng chữ x
16 ký tự ASCII) và LCD128x64 (LCD ma trận đồ họa 128x64 pixel).

VĐK sử dụng cổng P0 và một số chân của P2 để thực hiện giao tiếp với
LCD. Người dùng có thể tùy chọn bật/tắt đèn nền LCD không thông qua Jumper
1602 và T4.

Tại mỗi mạch LCD có 1 chiết áp W1 và W2, dùng để điều chỉnh độ tương
phản của màn hình.
8) Khối RTC I2C DS1302

RTC DS1302 sử dụng giao tiếp I2C, có nguồn pin dự phòng và thạch anh
dao động riêng. Khi toàn bộ Kit bị ngắt nguồn thì IC thời gian thực DS1302 vẫn
hoạt động bằng nguồn pin dự phòng và thạch anh riêng.

9) Khối EEPROM I2C 24C08

EEPROM 24C08 sử dụng giao tiếp I2C.


10) Khối EEPROM SPI X5045

X5045 là IC EEPROM 512kB giao tiếp nối tiếp theo chuẩn SPI.

11) Khối ADC0832

ADC0832 là ADC 8 bit truyền thông nối tiếp có xung đồng bộ, có 02
kênh vào.

12) Khối cảm biến nhiệt độ 1 dây DS18B20

DS18B20 là cảm biến nhiệt độ có độ phân giải 9 đến 12 bit, cảm biến khả
trình và có chức năng cảnh báo nhiệt độ, giải làm việc trong khoảng -55 đến
+125oC.
13) Khối tạo dao động

Mạch tạo dao động sử dụng 01 IC NE555, với sơ đồ trên, mạch sẽ tạo ra
tần số tính theo công thức:

F ≈ 1.44 / [(R2 + 2.R3).C6] ≈ 0.5Hz

Đầu ra có thể được chọn nối đến VĐK thông qua jumper NQ.
CHƯƠNG 3: NGÔN NGỮ LẬP TRÌNH C CHO AT89S52

Trong kỹ thuật lập trình VĐK nói chung, ngôn ngữ lập trình được sử
dụng thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao.
Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do
đó việc lập trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn. Có thể
kể đến một số ngôn ngữ lập trình bậc cao như C, Basic, Pascal… trong dó C là
ngôn ngữ thông dụng hơn cả trong kỹ thuật VĐK. Về bản chất, sử dụng các
ngôn ngữ này thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong
việc nghiên cứu các tập lệnh và xây dựng các cấu trúc giải thuật. Chương trình
viết bằng ngôn ngữ bậc cao cũng sẽ được một phần mềm trên máy tính gọi là
trình biên dịch (Compiler) chuyển sang dạng hợp ngữ trước khi chuyển sang mã
máy.
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu
trúc của bộ VĐK. Có nghĩa là với một người chưa quen với một vi điểu khiển
cho trước sẽ xây dựng được chương trình một cách nhanh chóng hơn, do không
phải mất thời gian tìm hiểu kiến trúc của VĐK đó. Và việc sử dụng lại các
chương trình đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộ
hoặc sửa chữa một phần.
I. KIỂU DỮ LIỆU TRONG C
1) Kiểu dữ liệu cơ bản của C
Kiểu Số Byte Khoảng giá trị

Char 1 -128 – +127

Unsigned char 1 0 – 255

Int 2 -32768 - +32767

Unsigned int 2 0 - 65535

Long 4 -2147483648 - +2147483647

Unsigned long 4 0 – 4294967295

Float 4
Khai báo biến:
- Cú pháp: Kiểu_dữ_liệu Vùng_nhớ Tên_biến _at_ Đia_chỉ;
- Khi khai báo biến có thể gán luôn cho biến giá trị ban đầu.
- Có thể khai báo nhiều biến cùng một kiểu một lúc.
Unsigned char data x;
unsigned char x = 0;
Unsigned int x,y,z,t;

- Chỉ định vùng nhớ: từ khoá “Vùng_nhớ” cho phép người dùng có thể
chỉ ra vùng nhớ sử dụng để lưu trữ các biến sử dụng trong chương trình. Các
vùng nhớ có thể sử dụng là: CODE, DATA, DATAB, IDATA, PDATA, XDTA.
Khi không khai báo vùng nhớ trình dịch sẽ mặc định đó là vùng nhớ DATA
Vùng nhớ Ý nghĩa

CODE Bộ nhớ mã nguồn chương trình

DATA Bộ nhớ dữ liệu gồm 128 Byte thấp của RAM trong VĐK

BDATA Bộ nhớ dữ liệu có thê định địa chỉ bit, nằm trong vùng nhớ DATA

Bộ nhớ dữ liệu gồm 128 Byte cao của RAM trong VĐK chỉ có ở
IDATA
một số dòng VĐK sau này

Bố nhớ dữ liệu ngoài gồm 256 Byte, được truy cập bởi địa chỉ đặt
PDATA
trên P0

Bộ nhớ dữ liệu ngoài có dung lượng có thể lên đến 64 KB, được
XDATA
truy cập bởi địa chỉ đặt trên P0 và P2

2) Kiểu dữ liệu bổ xung trong Keil C


Kiểu Số bit

Bit 1

Sbit 1

Sfr 8

Sfr16 16
- bit: dùng để khai báo các biến có giá trị 0 hoặc một hay các biến logic
trên vùng RAM của VĐK. Khi khai báo biến kiểu bit trình dịc Keil C sẽ mặc
định vùng nhớ sử dụng là BDATA.
- sbit, sfr, sfr16: dùng để định nghĩa các cho các thanh ghi chức năng
hoặc các cổng trên VĐK dùng để truy nhập các đoạn dữ liệu 1 bit, 8 bit, 16 bit.
3) Kiểu dữ liệu Mảng
Mảng là một tập hợp nhiều phần tử cùng một kiểu giá trị và chung một
tên. Các phần tử của mảng phân biệt với nhau bởi chỉ số hay số thứ tự của phần
tử trong dãy phẩn tử. Mỗi phần tử có vai trò như một biến và lưu trữ được một
giá trị độc lập với các phần tử khác của mảng.
Mảng có thể là mảng một chiều hoặc mảng nhiều chiều.
Khai báo:
Tên_kiểu Vùng_nhớ Tên_mảng[số_phần_tử_mảng];
Khi bỏ trống số phần tử mảng ta sẽ có mảng có số phần tử bất kì.
Unsigned int data a[5],b[2] [3];

Với khai báo trên ta sẽ có: mảng a là mảng một chiều 5 phần tử. Mảng b
là mảng hai chiều, tổng số phần tử là 6.
Chỉ số của mảng bắt đầu từ số 0. Mảng có bao nhiêu chiều phải cung cấp
đầy đủ bấy nhiêu chỉ số.
4) Kiểu dữ liệu Con trỏ
Khi ta khai báo một biến, biến đó sẽ được cấp phát một khoảng nhớ bao
gồm một số byte nhất định dùng để lưu trữ giá trị. Địa chỉ đầu tiên của khoảng
nhớ đó chính là địa chỉ của biến được khai báo.
Con trỏ là một biến dùng để chứa địa chỉ mà không chứa giá trị, hay giá
trị của con trỏ chính là địa chỉ khoảng nhớ mà nó trỏ tới.
Với các vùng nhớ cụ thể con trỏ tới vùng nhớ đó chiếm dung lượng phụ
thuộc vào độ lớn của vùng nhớ đó. Con trỏ tổng quát khi không xác định trước
vùng nhớ sẽ có dung lượng lớn nhất vì vậy tốt nhất nên sử dụng con trỏ cụ thể.

Loại con trỏ Kích thước

Con trỏ tổng quát 3 byte

Con trỏ XDATA 2 byte


Con trỏ CODE 2 byte

Con trỏ DATA 1 byte

Con trỏ IDATA 1 byte

Con trỏ PDATA 1 byte

Khai báo biến con trỏ:


- Cú pháp: Kiểu_Dữ_liệu Vùng_nhớ *Tên_biến;
int *int_ptr;
long data *long_ptr;

- khi không chỉ rõ vùng nhớ con trỏ sẽ được coi là con trỏ tổng quát.
5) Kiểu dữ liệu Cấu trúc
Kiểu dữ liệu cấu trúc là một tập hợp các biến, các mảng và cả các kiểu
cấu trúc khác được biểu thị bởi một tên duy nhất. kiểu dữ liệu cấu trúc dùng để
lưu trữ các giá trị, thông tin có liên quan đến nhau.
Định nghĩa và khai báo biến cấu trúc:
Typedef struct {
Khai báo các bi?n thành ph?n;
} Tên_kieu_cau_truc;

- Khai báo: Tên_kiểu_cấu_trúc Vùng_nhớ Tên_biến;


Typedef struct {
char day;
char month;
int year;
} Date_type;
Date_type date,date_arr[5];

II. PHÉP TOÁN


1) Phép gán giá trị
Phép gán kí hiệu: “=”.
- Cú pháp: Biến_1 = Biến_2;
Trong đó Biến_2 có thể là giá trị xác định cũng có thể là biến
2) Phép toán số học

Phép toán Ý nghĩa Ví dụ


Phép toán Ý nghĩa Ví dụ

+ Phép cộng X = a+b;

- Phép trừ X = a-b;

* Phép nhân X = a*b;

X = a/b;
/ Phép chia lấy phần nguyên
(a=9, b=2 → X=4)

X = a%b;
% Phép chia lấy phần dư
(a=9, b=2 → X=1)

3) Phép toán Logic

Chức năng Phép toán

AND &&

OR ||

NOT !

4) Các phép toán so sánh

Phép toán ý nghĩa Ví dụ

a>b
> So sánh lớn hơn
4>5 sẽ trả ra giá trị 0

a>=b
>= So sánh lớn hơn hoặc bằng
6>=2 sẽ trả ra giá trị 1

a<b
< So sánh nhỏ hơn
6<7 sẽ trả ra giá trị 1

a<=b
<= So sánh nhỏ hơn hoặc bằng
8<=5 sẽ trả ra giá trị 0

== So sánh bằng nhau a==b


Phép toán ý nghĩa Ví dụ
6==6 sẽ trả ra giá trị 1

a!=b
!= So sánh khác nhau
9!=9 sẽ trả ra giá trị 0

5) Phép toán thao tác Bit

Phép toán Ý nghĩa Ví dụ

& Phép và (AND) Bit_1 & Bit_2

| Phép hoặc (OR) Bit_1 | Bit_2

! Phép đảo (NOT) !Bit_1

^ Phép hoặc loại trừ (XOR) Bit_1 ^ Bit_2

<< Dịch trái a<<3

>> Dịch phải a>>4

~ Lấy bù theo bit ~a

6) Phép toán kết hợp

Phép toán Ví dụ

+= a+=5 <=> a=a+5

-= a-=5 <=> a=a-5

*= a*=5 <=> a=a*5

/= a/=5 <=> a=a/5

%= a%=5 <=> a=a%5

III. CẤU TRÚC CHƯƠNG TRÌNH


1) Cấu trúc chung
 Khai báo chỉ thị tiền xử lý
 Khai báo các biến toàn cục
 Khai báo nguyên mẫu các hàm
 Xây dựng các hàm và chương trình chính
Ví dụ:
// Khai báo chỉ thị tiền xử lý:
#include<regx51.h>
#include<string.h>
#define Led1 P1_0
//*********************************
// Khai báo biến toàn cục:
Unsigned char code Led_arr[3];
Unsigned char data dem;
Unsigned int xdata X;
//*********************************
// Khai báo nguyên mẫu hàm
Void delay(unsigned int n);
bit kiemtra(unsigned int a);
//*********************************
// Xây dựng các hàm và chương trình chính:
void delay(unsigned int n)
{
Khai báo biến cục bộ;
Mã chương trình trễ;
}
Void main() // Chương trình chính
{
Khai báo biến cụ bộ;
Mã chương trình chính;
}
Bit kiemtra(unsigned int a)
{
Khai báo biến cục bô;
Mã chương trình kiểm tra biến a;
}

Chú ý: Hàm không khai báo nguyên mẫu phải được xây dựng trước hàm
có lời gọi hàm đó. Ở ví dụ trên do hàm “bit kiemtra(unsigned int a)” đã được
khai báo nguyên mẫu hàm ở trên nên có thể xây dựng hàm ở bất kì vị trí nào
trong chương trình.
Tuy nhiên chúng ta nên khai báo nguyên mẫu hàm trước hàm main, và
xây dựng các hàm phụ ở sau hàm main. Như thế sẽ tạo thói quen lập trình gọn
gàng hơn, và cũng tạo thuận lợi hơn cho việc xem lại code, tìm kiếm và sửa lỗi
sau này.
2) Chỉ thị tiền xử lý
Các chỉ thị tiền sử lý không phải là các lệnh của ngôn ngữ C mà là các
lệnh giúp cho việc soạn thảo chương trình nguồn C trước khi biên dịch. Khi dịch
một chương trình C thì không phải chính bản chương trình nguồn mà ta soạn
thảo được dịch. Trước khi dịch, các lệnh tiền xử lý sẽ chỉnh lý bản gốc, sau đó
bản chỉnh lý này sẽ được dịch. Có ba cách chỉnh lý được dùng là:
+ Phép thay thế #Define
+ Phép chèn tệp #Include
+ Phép lựa chọn biên dịch #Ifdef
Các chỉ thị tiền xử lý giúp ta viết chương trình ngắn gọn hơn và tổ chức
biên dịch, gỡ rối chương trình linh hoạt, hiệu quả hơn.
Chỉ thị #Define: Chỉ thị #define cho phép tạo các macro thay thế đơn
giản.
#Define Tên_thay_thế dãy_kí_tự

Một Tên_thay_thế có thể được định nghĩa lại nhiều lần, nhưng trước khi
định nghĩa lại phải giải phóng định nghĩa bằng chỉ thị:
#Undef Tên_thay_thế

Chỉ thị #Include: Chỉ thị #include báo cho trình biên dịch nhận nội dung
của tệp khác và chèn vào tệp chương trình nguồn mà ta soạn thảo.
Cú pháp:
Cách 1:
#include<tên_tệp>

Cách 2:
#include“tên_tệp”

Ví dụ:
#include<regx51.h>

Ở cách này tệp regx51.h sẽ được tìm trong thư mục INC để chèn vào
chương trình nguồn.
#include“regx51.h”

Ở cách này tệp regx51.h sẽ được tìm trong thư mục chứa chương trình
nguồn nếu không có mới tìm trong thư mục INC.
Khi muốn chèn tệp ngoài thư viện hoặc ngoài thư mục chứa chương trình
nguồn thìtên_tệp sẽ bao gồm cả đường dẫn thư mục chứa tệp.
Chỉ thị #Ifdef: Chỉ thị #ifdef này thường dùng để biên dịch các tệp thư
viện.
Cú pháp:
Cách 1:
#Ifdef ten_macro
//Đoạn chương trình
#endif

Cách 2:
#ifdef ten_macro
//Đoạn chương trình 1

#else
//Đoạn chương trình 2
#endif

Ở cách 1: nếu tên_macro đã được định nghĩa thì “Đoạn chương trình” sẽ
được dịch, ngược lại thì “Đoạn chương trình” sẽ bị bỏ qua.
Chỉ thị #Ifndef: Chỉ thị #ifndef này thường dùng để biên dịch các tệp thư
viện.
Cú pháp:
Cách 1:
#ifndef ten_macro
//Đoạn chương trình
#endif

Cách 2:
#ifndef ten_macro
//Đoạn chương trình 1
#else
//Đoạn chương trình 2
#endif

Ở cách 1: nếu tên_macro chưa được định nghĩa thì “Đoạn chương trình”
sẽ được dịch, ngược lại thì “Đoạn chương trình” sẽ bị bỏ qua.
3) Chú thích trong chương trình
Việc viết chú thích trong trình nhằm mục đích giải thích ý nghĩa của câu
lệnh, đoạn chương trình hoặc hàm hoạt động như thế nào và làm gì. Viết chú
thích sẽ giúp cho người đọc có thể hiểu được chương trình dễ dàng và nhanh
chóng hơn, sửa lỗi đơn giản hơn hoặc giúp cho ta xem lại chương trình cũ mà ta
đã làm trở lên nhanh hơn.
Chú thích trong chương trình sẽ không ảnh hưởng đến chương trình mà ta
soạn thảo vì trình dịch sẽ bỏ qua tất cả lời chú thích khi biên dịch chương trình
sang mã máy.
Lời giải thích được đặt sau dấu “//” nếu chú thích chỉ viết trên một dòng
hoặc trong cặp dấu “\*” và “*\”.
IV. CÁC LÊNH CƠ BẢN TRONG C
1) Câu lệnh rẽ nhánh
Cấu trúc 1:
if(dieu_kien)
{
// Đoạn chương trình
}

Giải thích: nếu dieu_kien đúng thì xử lí các câu lệnh bên trong còn sai thì
nhảy qua.
Cấu trúc 2:
if(dieu_kien)
{
// Đoạn chương trình 1
}
else
{
// Đoạn chương trình 2
}

Giải thích: nếu dieu_kien đúng thì xử lí “Đoạn chương trình 1” bên trong
còn sai thì xử lý “Đoạn chương trình 2”.
2) Câu lệnh lựa chọn
Cấu trúc:
switch(biến)
{
case gia_tri_1:
//các câu lệnh
break;
case gia_tri_2:
//các câu lệnh
break;
……………………………………...
case gia_tri_n:
//các câu lệnh
break;
Default:
//các câu lệnh
}

Giải thích: Tuỳ vào biến có giá trị bằng giá trị của Case nào thì thực
hiện các câu lệnh tương ứng trong Case đó, sau đó thoát khỏi cấu trúc nhờ câu
lệnh “break;”. Nếu không có Case nào phù hợp thì thực hiện các câu
lệnh trong default.
3) Vòng lặp xác định - For
Cấu trúc:
for( x=n ; điều_kiện ; phép_toán )
{
// các câu lệnh xử lí
}

Giải thích: x là biến, n là giá trị xác định. Trước tiên vòng lặp sẽ gán giá
trị ban đầu cho biến: x=n, rồi kiểm tra nếu điều_kiện đúng thì thực hiện các câu
lệnh xử lý, sau đó thực hiện Phép_toán nhằm tác động đến điều kiện. Sau đó lại
kiểm tra lại điều_kiện, nếu còn đúng thì thực hiện tiếp, nếu sai sẽ thoát khỏi
vòng lặp.
Các thành phần trong vòng for có thể không cần khai báo, for sẽ bỏ qua
phần đó, nhưng vẫn phải có đủ 2 dấu “;”.
4) Vòng lặp không xác định - while
while(dieu_kien)
{
// các câu lệnh
}

Giả thích: Trước tiên chương trình sẽ kiểm tra điều_kiện, nếu đúng thì
thực hiện các câu lệnh, sau đó quay lại kiểm tra điều_kiện. Còn nếu điều_kiện
sai thì thoát khỏi vòng lặp ngay.
5) Vòng lặp không xác định - do while
do
{
// các câu lệnh
} while(dieu_kien);

Giả thích: Trước tiên đoạn chương trình thực hiện các câu lệnh sau đó
kiểm trađiều_kiện nếu đúng thì lặp lại thực hiện các câu lệnh tiếp, nếu sai thì
thoát khỏi vòng lặp.
CHƯƠNG 4: LẬP TRÌNH VI ĐIỀU KHIỂN

I. GIAO TIẾP VỚI GPIO

GPIO là viết tắt của General Purpose Input Output. GPIO chính là cửa
ngõ để giao tiếp giữa VĐK với “thế giới bên ngoài”.

GPIO trong 8051 ngoài các chức năng cơ bản là input và output còn có
một số chức năng đặc biệt khác như chân giao tiếp UART, ngõ vào timer, bus
địa chỉ, ngõ vào ngắt ngoài…

Khi sử dụng một PIN là output ta chỉ cần xuất mức logic ra chân tương
ứng.

Khi muốn sử dụng một PIN là input ta cần phải ghi vào pin đó mức logic
1 trước khi có thể sử dụng nó.

Để cho các bạn hiểu rõ hơn về GPIO, ta sẽ cùng nhau đi giải quyết bài
toán sau:
Sử dụng một nút bấm, điều khiển 1 led đơn, khi khởi động LED sẽ sáng,
và khi có nút bấm led sẽ “đảo trạng thái” (đang sáng thành tắt và ngược lại).

Nội dung chương trình:


#include <AT89x52.H>

sbit BUTTON P3^2


sbit LED P1^0
/******************************************************/
void main()
{
LED = 0;// Ban dau LED sang
BUTTON=1;// Viet 1 de co the su dung la ngo vao
while(1){
if(!BUTTON)// Neu nut bam duoc bam
{
delay_ms(10);// Delay 1 khoang thoi gian de chong nhieu
10ms - 20ms
if(!BUTTON)// Neu dung la nut duoc bam
{
LED = ~LED;// Thay doi trang thai cua LED
delay_us(5);
while(!BUTTON); // Cho den khi nut bam duoc tha ra
moi thuc hien lenh
}
}
}
}

II. HIỂN THỊ TRÊN LED 7 THANH

1) Cấu tạo Led 7 thanh đơn

LED 7 thanh gồm 7 con LED đơn ghép lại với nhau (Hình dưới) theo hai
nguyên lý khác nhau là: CATHODE chung và ANODE chung (được sử dụng
phổ biến).

Sơ đồ nguyên lý:
-Với LED cathode chung: để led a,b,c,… sáng thì các chân a,b,c… của
led phải ở mức 1 (VCC).

-Với LED anode chung: để led a,b,c,… sáng thì các chân a,b,c,… của led
phải ở mức 0 (GND).

2) Cấu tạo Led 7 thanh 4 số

LED 7 thanh 4 số thực chất là 4 con led 7 thanh đơn ghép với nhau, và
cũng có 2 loại là ANODE chung và CATHODE chung.

Sơ đồ nguyên lý:

Mô phỏng:
3) Một số phương pháp hiển thị Led 7 thanh

Mắt con người sau khi nhìn thấy một hình ảnh phải mất khoảng 40ms để
xử lý (tương ứng 24 hình trên 1s). Vậy nếu chúng ta cho một LED sáng tắt liên
tục với khoảng thời gian giữa 2 lần thay đổi trạng thái bé hơn 40msthì mắt
chúng ta sẽ không thể nhận ra được sự thay đổi đó và ta vẫn nghĩ LED đang
sáng.

Tuy nhiên, khi sử dụng phương pháp quét LED thì số lượng LED được sử
dụng sẽ không nhiều (khoảng 20 LED), lý do ở đây là nếu số lượng LED quá
nhiều thì thời gian sáng trung bình cho các LED sẽ giảm xuống (LED bị mờ đi).

Trong bài tập này, các bạn cần quan tâm đến các hàm sau:

-LED7_ChuyenDoi(unsigned long int number): hàm này giúp các bạn


tách lần lượt các chữ số hàng trăm nghìn, chục nghìn … hàng đơn vị để hiển thị
lên LED 7 thanh.
void LED7_ChuyenDoi(unsigned long int number)
{
unsigned char i,j;
unsigned long int temp;
for(i=7;i>0;i--)
{
temp=1;
for(j=i;j>0;j--)
{
temp*=10;
}
buffer_led[i]=chu_so[number/temp];
number=number%temp;
}
buffer_led[0]=chu_so[number];
}

-LED7_OnLed(unsigned char addr): hàm này giúp các bạn xác định vị
trí LED 7 cần hiển thị và dữ liệu được hiển thị.
void LED7_OnLed(unsigned char addr)
{
PORT_DATA=0xff;
PORT_ADDR=~(0x01<<addr);
PORT_DATA=buffer_led[addr];
}

-LED7_Display(unsigned long int number): hàm này giúp các bạn đưa
số cần hiển thị lên màn hình LED 7 thanh 4 số.
void LED7_Display(unsigned long int number)
{
unsigned char i=8;
LED7_ChuyenDoi(number);
while(i!=0)
{
LED7_OnLed(--i);
delay_us(50);
}
}

-File Main.c
int main(void)
{
unsigned long int Num;
unsigned char i;
Num = 11111111;
while(1)
{
Num++;
for(i=0;i<4;i++)
LED7_display(Num);
}
return 1;
}

III. HIỂN THỊ TRÊN LCD16x02

1) Cách kết nối VĐK 8051 với LCD

Kết nối 4 bit:


2) Các hàm điều khiẻn LCD

Để có thể điều khiển được LCD ta phải đi xây dựng các hàm cơ bản sau:

- Hàm gửi một lệnh ra LCD:


void LCD_SendCommand(unsigned char command)
{
LCD_Send4Bit(command >>4); /* Gui 4 bit cao */
LCD_Enable();
LCD_Send4Bit(command); /* Gui 4 bit thap*/
LCD_Enable();
}

- Hàm khởi tạo LCD (hàm này là quan trọng nhất):


void LCD_Init(void)
{
LCD_Send4Bit(0x00);
delay_ms(20);
LCD_RS=0;
LCD_RW=0;
LCD_Send4Bit(0x03);
LCD_Enable();
delay_ms(5);
LCD_Enable();
delay_us(100);
LCD_Enable();
LCD_Send4Bit(0x02);
LCD_Enable();
LCD_SendCommand(0x28); // giao thuc 4 bit, hien thi 2 hang, ki
tu 5x8
LCD_SendCommand(0x0c); // cho phep hien thi man hinh
LCD_SendCommand(0x06); // tang ID, khong dich khung hinh
LCD_SendCommand(Clear_LCD); // xoa toan bo khung hinh
}

- Hàm xóa LCD :


void LCD_Clear()
{
LCD_SendCommand(Clear_LCD);
delay_us(10);
}

- Hàm thiết lập vị trí con trỏ LCD:


void LCD_Gotoxy(unsigned char x, unsigned char y)
{
unsigned char address;
if(!y)
address = (Line_1+x);
else
address = (Line_2+x);
delay_us(1000);
LCD_SendCommand(address);
delay_us(50);
}

- Hàm gửi một kí tự ra LCD:


void LCD_Putchar ( unsigned int Data )
{
LCD_RS=1;
LCD_SendCommand( Data );
LCD_RS=0 ;
}

- Hàm gửi một chuỗi kí tự ra LCD:


void LCD_Puts (char *s)
{
while (*s)
{
LCD_Putchar(*s);
s++;
}
}

3) Hiển thị trên LCD

Để minh họa cách sử dụng các hàm trên tôi sẽ đưa ra một bài toán ví dụ
sau:
- Hiển thị dòng chữ “PX Tu Dong” lên LCD hàng 1 của LCD.

- Hiển thị giá trị của một biến x (x: 0-9) lên hàng thứ 2 của LCD, giá trị
của x sẽ tăng lên 1 mỗi giây.

Code của bài toán trên:


int main(void)
{
/*******BIEN CUC BO********/
int x=0;
char str[16];
LCD_Init();
delay_ms(10);
LCD_Puts("DEMO LCD 16x2");
delay_ms(1000);
LCD_Clear();
while(1)
{
LCD_Gotoxy(0,0);
LCD_Puts("BanLinhKien.Vn");
LCD_Gotoxy(0,1);
LCD_Puts("Gia Tri X = ");
sprintf(str,"%d",x);
LCD_Gotoxy(13,1);
LCD_Puts(str);
x=x+1;
if(x>9)x=0;
delay_ms(1000);
}
return 1;
}

IV. ĐỌC MA TRẬN PHÍM 4x4

Trong phần này ta sẽ thực hiện bài toán nhập ký tự lên màn hình
LCD1602 sử dụng ma trận phím 4x4

1) Cấu tạo ma trận phím 4x4

Ma trận phím 4x4 gồm có 16 nút bấm được sắp xếp theo ma trận 4 hàng,
4 cột. Các nút bấm trong cùng một hàng và một cột được nối với nhau, vì vậy
ma trận phím 4x4 sẽ có tổng cộng 8 ngõ ra.

Sơ đồ nguyên lý:
Mô phỏng:

Ma trận phím 4x4 cho phép các bạn nhập các chữ số, chữ cái, ký hiệu vào
bộ điều khiển qua đó dùng để điều khiển một thiết bị ngoại vi nào đó.
Các bạn có thể mắc thêm trở treo (thông thường là 10K) cho các nút bấm để nút
bấm hoạt động ổn định hơn.

2) Thuật toán đọc ma trận phím

Để giao tiếp được với ma trận phím 4x4, tôi dùng phương pháp "Quét" để
kiểm tra xem nút nào được bấm, cụ thể cách quét như sau (quét theo cột):

-Các chân P1.0, P1.1, P1.2, P1.3 (các hàng) được thiết lập là các
chân INPUT, còn lại các chân P1.4, P1.5, P1.6, P1.7 (các cột) là các
chân OUTPUT (ở mức logic ‘0’).

-Giả sử SW9 được bấm:

 Cho COL1 = 0 (COL[2..4] = 1), kiểm tra trạng thái của các hàng:
ROWA= ROWB= ROWC= ROWD=1: vậy kết luận không có nút
được bấm trên COL1.

 Cho COL2 = 0 (COL[1,3,4] = 1), kiểm tra trạng thái của các hàng:
ROWA=ROWB=ROWD=1, ROWC =0: vậy kết luận có nút nằm
trên hàng C, cột 2 được bấm (SW9).

 Cho COL3 = 0 (COL[1,2,4]=1): ROWA = ROWB = ROWC=


ROWD=1: vậy kết luận không có nút được bấm trên COL3.

 Cho COL4 = 0 (COL[1,2,3]=1): ROWA= ROWB= ROWC=


ROWD=1: vậy kết luận không có nút được bấm trên COL4.

Quét tương tự đối với những nút bấm khác.

3) Đọc ma trận phím và hiển thị trên LCD1602

Ta có bảng mã ký tự cho ma trận phím (theo mô phỏng proteust):


// Ban phim trong mo phong protues
static unsigned char code KEYS_PAD[4][4] ={'7 ', '8' , '9' , '/ ',
'4' ,'5' , '6 ', 'x ',
'1' ,'2 ' ,'3 ', '- ',
'*' , '0 ', '.' , '+' };

Trong bài tập này các bạn cần quan tâm đến hàm:
-unsigned char mtp_quetphim(): Đây là hàm quét ma trận phím, giá trị
trả về của hàm sẽ là ký tự trong bảng mã tương ứng với nút được bấm.
unsigned char mtp_quetphim()
{
unsigned char r,c;
P1=0x0f;
delay_us(2);

if((P1&0x0f)!=0x0f) // Kiem tra xem co phim bat ky nao duoc bam hay
khong?
{
delay_us(100); // Chong nhieu
if((P1&0x0f)!=0x0f) // Neu dung có phim duoc bam: Bat dau qua
trinh quet phim
{
for(c=0;c<4;c++) // Quet theo cot
{
P1=~(0x01<<(4+c)); // Lan luot keo cac cot xuong
muc logic 0
delay_ms(1);
for(r=0;r<4;r++) // Kiem tra cac hang
{
if((P1&(0x01<<r))==0) // Neu hang nao co muc
logic 0
{
while((P1&0x0f)!=0x0f); // Cho den khi
nut bam duoc tha ra
return KEYS_PAD[r][c]; // Tra ve ma
phim da duoc bam
}
}
}
}
}
return 0; // Neu khong co phim nao duoc nhan: Tra ve gia tri 0
}

File main.c: Tiến hành quét phím và hiển thị ký tự lên LCD1602.
void main()
{
unsigned char Key;

lcd1602_init();
lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts("THUY DIEN SON LA");
lcd1602_gotoxy(0,1);
lcd1602_puts(" PX TU DONG");
delay_ms(2000);
lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts(" PX Tu dong");
lcd1602_gotoxy(0,1);
lcd1602_puts(" PHIM BAM: ");

while(1)
{
Key = mtp_quetphim(); // Gan gia tri ky tu tra ve cho bien Key
if(Key) // Neu phim duoc bam
{
lcd1602_gotoxy(11,1);
lcd1602_putchar(Key); // Cho hien thi gia tri phim bam
len LCD
delay_ms(1);
}
}
}

V. SỬ DỤNG TIMER/COUNTER

Phần này gồm các nội dung:

- Sử dụng timer ở mode 16bit để tạo bộ định thời.

- Tạo Baud Rate bằng timer 1.

- Tạo Baud Rate bằng timer 2.

1) Timer/Counter trong 8051:

- Trong 8051 có 2 hoặc 3(với AT89S52) bộ timer/counter 16 bit:

- Timer/Counter thường được sử dụng để tạo bộ định thời, hoặc bộ đếm


sự kiện. Timer/Counter trong 8051 còn có thêm chức năng là tạo baud rate cho
UART.
2) Định thời 16 bit:

- Để minh họa cho chế độ định thời 16 bit trong 8051 ta đi vào một ví dụ
sau: Tạo bộ định thời gian 1s, sau mỗi giây giá trị biến x(x=0-9) sẽ tăng lên 1
đơn vị, hiển thị giá trị x lên màn hình LCD 16x2.
void ngat_tran_timer0(void) interrupt 1
{
TL0=0x00;
TH0=0x10; //TH0*256+TL0=65536-61440
count_over=count_over+1;
if(count_over==15)// dung 1s
{
x++;
display_en=1;
if(x>9)x=0;
}
}

Hàm chính:
int main(void)
{
/*******BIEN CUC BO*********/
char str[16];
LCD_Init(); //Khoi tao LCD
delay_ms(10);
LCD_Clear();
LCD_Gotoxy(0,0);
LCD_Puts("THUY DIEN SON LA");
display_en=1;
TMOD=0x01; //su dung timer0 che do 2
TL0=0x00;
TH0=0x10;
TR0=1; //kich hoat timer0
ET0=1; //kich hoat ngat timer0
EA=1; //kich hoat ngat toan cuc
while(1)
{
if(display_en)
{
count_over=0;
LCD_Gotoxy(0,1);
LCD_Puts("Gia Tri X = ");
sprintf(str,"%d",x);
LCD_Gotoxy(13,1);
LCD_Puts(str);
display_en=0;
}
}
return 1;
}
3) Tạo Baud Rate bằng timer 1:

- Timer 1 có thể được cấu hình như một bộ tạo Baud Rate cho UART, tốc
độ tràn của Timer 1 chính bằng tốc độ baud.

- Để tạo baud rate bằng timer 1 ta cần cấu hình timer 1 ở chế độ auto
reload 8 bit. Tần số thạch anh các bạn nên sử dụng là 11.0592Mhz (sẽ gây sai số
thấp nhất).

- Hàm tạo baud rate 9600 dùng timer 1


void init_timer1()
{
TMOD &= ~(0x20);// cai dat che do 3 cho timer 1
TMOD |= 0x20;
// Baud rate = 9600
TL1 = 0xFD; //-3
TH1 = 0xFD; //-3
TR1 = 1; //Bat dau Timer
}

- Tham khảo thêm mục giao tiếp UART

4) Tạo Baud Rate bằng timer 2:

- Timer 2 có thể được cấu hình như một bộ tạo Baud Rate cho UART, tốc
độ tràn của Timer 2 chính bằng tốc độ baud.

- Để tạo baud rate bằng timer 2 ta cần cấu hình timer 2 ở chế độ auto
reload 16 bit. Tần số thạch anh các bạn nên sử dụng là 11.0592Mhz (sẽ gây sai
số thấp nhất).

- Hàm tạo baud rate 9600 dùng timer 2:


void init_timer2()
{
RCLK=1;
TCLK=1;
RCAP2L = 0xDC;
RCAP2H = 0xFF;
TR2=1;
}

- Tham khảo thêm mục giao tiếp UART


VI. GIAO TIÊP UART

Phần này gồm các nội dung:

- Biết cách truyền dữ liệu lên PC.

- Nhận dữ liệu từ PC.

1) UART trong 8051.

- Trong các chip 8051 có hỗ trợ 1 kênh giao tiếp UART với 4 chế độ. Chế
độ hay được sử dụng đó là chế độ 1,ở chế độ này mỗi khung UART gồm 10 bit :
1bit start + 8 bit data + 1 bit stop.

- Sơ đồ kết nối UART:

2) Lập trình UART

- Để có thể giao tiếp UART điều đầu tiên và quan trọng nhất là ta cần cấu
hình tốc độ baud rate. Baud rat thông thường sử dụng là 9600. Để cấu hình tốc
độ buad rate ta cần cấu hình timer1 hoặc timer 2 cho phù hợp. (xem thêm mục
Timer/Counter)

- Sau khi đã có nguồn tạo tốc độ baud cho UART ta đi xây dựng những
hàm cơ bản để điều khiển UART:

Hàm khởi tạo UART:


void UART_Init(void)
{
#ifdef UART_USE_TIMER1
TMOD&=0x0f;
TMOD |= 0x20; //Timer 1 mode 2.
TL1 = 0xFD;
TH1 = 0xFD; // baud rate =9600
TR1 = 1;
#endif
#ifdef UART_USE_TIMER2
RCLK=1;
TCLK=1; //Timer 2: Baud Rate Generator
RCAP2L = 0xDC; //Baud Rate 9600
RCAP2H = 0xFF; //Baud Rate 9600
TR2=1;
#endif
ES = 1; // Kich hoat ngat UART.
IP = 0x10; // Thiet lap muc uu tien cho ngat UART.
SCON = 0x50; // Chon che do UART mode 1.
PCON=PCON&(~(0x80));//khong nhan doi toc do baud.
}

Hàm truyền một kí tự ra UART:


void UART_PutChar(unsigned char c)
{
tran_busy = 1;
SBUF = c;
while(tran_busy);
}

Hàm nhận một kí tự UART:


unsigned char UART_GetChar(void)
{
unsigned char temp=0;
if(RI==1)
{
RI=0;
temp=SBUF;
}
return temp;
}

- Hàm gửi một chuỗi kí tự ra UART:


void UART_Puts(unsigned char *s)
{
while (*s)
{
UART_PutChar(*s);
s++;
}
}

3) Bài toán ví dụ:

Để hiểu hơn về cách sử dụng UART trong 8051 tôi đưa ra một bài toán
thực hành sau: - Gửi chuỗi kí tự “DEMO UART” và “PX Tu Dong” lên PC, sau
đó nhận kí tự được gửi từ PC rồi hiển thị kí tự nhận được lên PC.

Code bài toán như sau:


int main(void)
{
unsigned char key;
unsigned char str[25];
UART_Init();
LCD_Init();
delay_ms(10);
LCD_Puts("DEMO UART");
delay_ms(1000);
LCD_Clear();
EA=1;
UART_Puts("DEMO UART");
LCD_Puts("PX Tu Dong");
UART_Puts("PX Tu Dong");
while(1)
{
key=UART_GetChar();
if(key)
{
sprintf(str,"Ki Tu VDK nhan duoc : %c",key);
UART_Puts(str);
LCD_Gotoxy(0,1);
sprintf(str,"Ki Tu: %c",key);
LCD_Puts(str);
}
}
return 1;
}

VII. NGẮT NGOÀI

Phần này gồm các nội dung:

- Hiểu được ngắt ngoài.


- Cách cấu hình ngắt ngoài.

- Sử dụng ngắt ngoài.

1) Ngắt ngoài với 8051.

- Ta set bit EX lên 1 để kích hoạt ngắt ngoài, set bit IT lên 1 để chọn chế
độ ngắt cạnh xuống, xóa IT xuống 0 để chọn chế độ ngắt mức logic thấp.

2) Bài toán ví dụ:

- Để minh họa cho ngắt ngoài ta có bài toán sau: Có hai nút bấm BT1 và
BT2 được nối với 2 đầu vào ngắt ngoài 0 và ngắt ngoài 1. Khi nút BT1 được ấn
giá trị biến x tăng lên 1, khi nút BT2 được ấn thì giá trị biến x giảm đi 1. Hiển
thị giá trị x tương ứng lên LCD16x2.

- Code bài toán trên:

Hàm khởi tạo ngắt ngoài 0:


void EXT0_Init(void)
{
EX0=1; //Kich hoat ngat ngoai 0
IT0=1; //Chon ngat theo suon xuong
}

Hàm khởi tạo ngắt ngoài 1:


void EXT1_Init(void)
{
EX1=1; //Kich hoat ngat ngoai 0
IT1=1; // Chon ngat theo suon xuong
//IT1=0 chon ngat theo muc 0
}

Chương trình con ngắt ngoài 0:


void Ngat_Ngoai_0(void) interrupt 0
{
//Chuong trinh con phuc vu ngat ngoai 0
x++;
display_en=1;
}

Chương trình con ngắt ngoài 1:


void Ngat_Ngoai_1(void) interrupt 2
{
//Chuong trinh con phuc vu ngat ngoai 0
x--;
display_en=1;
}

Hàm chính:
int main(void)
{
LCD_Init();
delay_ms(100);
LCD_Puts("DEMO EXT INT");
EXT1_Init();
EXT0_Init();
EA=1;
delay_ms(1000);
LCD_Clear();
LCD_Puts("Thuy dien Son La");
display_en=1;
while(1)
{
if(display_en)
{
LCD_Gotoxy(0,1);
sprintf(str,"%u",x);
LCD_Puts(str);
display_en=0;
}
}
return 1;
}

VIII. GIAO TIẾP DS18B20

1) Cấu tạo và đặc tính kỹ thuật của DS18B20

Cấu tạo:

Cảm biến đo nhiệt độ DS18b20 sử dụng chuẩn giao tiếp 1 WIRE (đường
dẫn tín hiệu và đường dẫn điện áp nguồn nuôi có thể dùng chung trên một dây
dẫn). Ngoài ra, nhiều cảm biến có thể dùng chung trên một đường dẫn (Rất thích
hợp với các ứng dụng đo lường đa điểm).

Cảm biến DS18b20 thường dùng gồm có 3 chân: VCC, GND, DATA như
hình dưới:

Sơ đồ kết nối:

Đặc tính kỹ thuật:

Các đặc điểm kỹ thuật của cảm biến DS1820 có thể kể ra một cách tóm
tắt như sau:

 Độ phân giải khi đo nhiệt độ là 9 bit . Dải đo nhiệt độ -55oC đến


125oC, từng bậc 0,5oC, có thể đạt độ chính xác đến 0,1oC bằng
việc hiệu chỉnh qua phần mềm (Có thể đạt đến các độ phân giải 10
bit, 11 bit, 12 bit).

 Điện áp nguồn nuôi có thể thay đổi trong khoảng rộng (từ 3,0 V
đến 5,5 V).
 Dòng tiêu thụ tại chế độ nghỉ cực nhỏ.

 Thời gian lấy mẫu và biến đổi thành số tương đối nhanh, không quá
200 ms.

 Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ
nhớ ROM trên chip (on chip).

2) Lập trình đo nhiệt độ với VĐK 89S52.

Khi xử lý DS18b20, cần chú ý tới 2 nhóm lệnh (Cụ thể có thể xem ở
datasheet DS18b20):

 Lệnh truy cập ROM

 Lệnh chức năng bộ nhớ.

Trong bài tập này, để xử lý được nhiệt độ đo được từ DS18b20 các bạn
cần quan tâm hàm:

-float ds18b20_readtemp(void): Đây là hàm giúp các bạn tính toán và


trả về giá trị nhiệt độ mà DS18b2 đo được.
float ds18b20_readtemp(void)
{
float temp;
unsigned char a,b;
DS18B20_Init(); // Khoi tao DS18b20
ds18b20_writebyte(0xCC) ; // Cho phep VDK truy cap thang den cac lenh
bo nho cua DS18b20
ds18b20_writebyte(0x44) ; // Khoi dong qua trinh do va chuyen doi
nhiet do ra so nhi phan
DS18B20_Init() ;
ds18b20_writebyte(0xCC) ;
ds18b20_writebyte(0xBE) ; // Cho phep doc du lieu tu bo nho DS18b20
ra ngoai

a = ds18b20_readbyte();
temp=((float)(a&0x0f))/16; // Lay phan thuc cua gia tri nhiet do
b = ds18b20_readbyte();
a =((a&0xf0)>>4)|((b&0x0f)<<4) ; // Lay phan nguyen cua gia tri nhiet
do
temp=temp+a;
return temp; // Tra ve gia tri nhiet do
}

-File main.c:
#include <main.h>

void main()
{
float Nhiet_Do;
unsigned char Lcd_Buff[15];

lcd1602_init();
lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts("Thuy dien Son La");
lcd1602_gotoxy(0,1);
lcd1602_puts(" PX Tu Dong");
delay_ms(2000);
lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts(" PX TU DONG");

while(1)
{
Nhiet_Do = ds18b20_readtemp();
sprintf(Lcd_Buff," TEMP: %2.2f^C",Nhiet_Do);
lcd1602_gotoxy(0,1);
lcd1602_puts(Lcd_Buff);
delay_ms(300);
}
}

IX. GIAO TIẾP VỚI EEPROM 24C08

Phần này gồm các nội dung:

- Ghi một đoạn dữ liệu vào 24CXX.

- Đọc dữ liệu được lưu trữ trong 24CXX.

1) EEPROM 24CXX

- XX có giá trị 08,16,32,64… chính là giá trị bộ nhớ của EEPROM tính
theo đơn vị Kb.

- 24CXX sử dụng chuẩn giao tiếp 2 dây (I2C).


- Chân SCL là chân tạo xung nhịp, được điều khiển bới VĐK. Chân SDA
là chân truyền dữ liệu giữa VĐK và 24CXX.

2) Giao tiếp với EEPROM 24CXX

- Để có thể giao tiếp được với EEPROM 24CXX ta đi xây dựng các hàm
cơ bản sau:

- Hàm đọc một byte dữ liệu tại địa chỉ address:


unsigned char EEP_24CXX_Read(unsigned char address)
{
bit AckTemp=1;
unsigned char Data;
I2C_Start();
I2C_Write(0xa0);
AckTemp=I2C_CheckAck();
I2C_Write(address);
AckTemp=I2C_CheckAck();
I2C_Start();
I2C_Write(0xa1);
AckTemp=I2C_CheckAck();
Data=I2C_Read();
AckTemp=I2C_CheckAck();
I2C_Stop();
return Data;
}

- Hàm ghi 1 byte data vào địa chỉ address:


void EEP_24CXX_Write(unsigned char address,unsigned char Data)
{
bit AckTemp=1;
I2C_Start();
I2C_Write(0xa0);
AckTemp=I2C_CheckAck();
I2C_Write(address);
AckTemp=I2C_CheckAck();
I2C_Write(Data);
AckTemp=I2C_CheckAck();
I2C_Stop();
}

- Hàm ghi một chuỗi data vào 24CXX bắt đầu từ địa chỉ address:
void EEP_24CXX_WriteS(unsigned char address,unsigned char*s)
{
while(*s)
{
EEP_24CXX_Write(address++,*s);
s++;
}
}

- Hàm đọc một chuỗi data có độ dài length bắt đầu từ địa chỉ address:
void EEPROM_24CXX_ReadS(unsigned char address, unsigned char lenght,
unsigned char *s)
{
unsigned char i=0;
while(lenght)
{
s[i++]=EEP_24CXX_Read(address++);
lenght--;
}
s[++i]=0;
}

3) Bài toán ví dụ:

- Để hiểu hơn và cách dùng các hàm giao tiếp với EEPROM ta đi vào một
bài toán ví dụ đơn giản sau: Ghi vào 24C08 một chuỗi kí tự, sau đó đọc lại chuỗi
kí tự vừa ghi và hiển thị lên LCD 16x2.

- Code chương trình:


int main(void)
{
char str[16],str2[17];
LCD_Init();
delay_ms(10);
LCD_Puts("DEMO EEPROM");
delay_ms(1000);
LCD_Clear();
EEP_24CXX_Init();
sprintf(str,"EEPROM DEMO V1.0");
EEP_24CXX_WriteS(0x02,str);
LCD_Gotoxy(0,0);
LCD_Puts(" PX Tu Dong");
LCD_Gotoxy(0,1);
EEPROM_24CXX_ReadS(0x02,15,str2);
LCD_Puts(str2);
while(1)
{
}
return 1;
}

X. GIAO TIẾP VỚI ADC 0832

Phần này gồm các nội dung:

- Đo giá trị ADC của một tín hiệu sử dụng ADC0832.


1) ADC0832

- ADC0832 là IC chuyển đổi 16 bit giá trị tương tự sang giá trị số.
ADC0832 sử dụng giao tiếp 3 dây. Nhưng ta có thể chuyển thành kết nối 2 dây
bằng cách nối chung dây DI và DO.

- Sơ đồ kết nối ADC0832 với 8051 thông thường:

2) Bài toán ví dụ:

- Để thực hành với ADC0832 ta sẽ làm một ví dụ sau: Đọc giá trị ADC từ
kênh 0 của ADC 0832. Hiển thị giá trị ADC lên LCD 16x2.

- Trước tiên ta phải xây dựng hàm đọc giá trị ADC từ một kênh của
ADC0832:
unsigned int ADC0832_Read(unsigned char channel)
{
unsigned int Data=0;
unsigned char i,temp;
ADC0832_Start();
ADC0832_Channel(channel);
//Lay byte cao
for(i=0;i<8;i++)
{
temp=ADDO;
Data|=(temp<<(7-i));
ADC_Clk();
}
Data<<=8;
//Lay byte thap
for(i=0;i<8;i++)
{
temp=ADDO;
Data|=(temp<<i);
ADC_Clk();
}
ADCS=1;
ADCLK=0;
ADDO=1;
return(Data);
}

- Nội dung hàm main:


int main(void)
{
unsigned int Adc_Data;
unsigned char str[25];
LCD_Init();
delay_ms(10);
LCD_Puts("DEMO ADC0832");
delay_ms(1000);
LCD_Clear();
delay_ms(10);
LCD_Puts(" PX TU DONG");
while(1)
{
Adc_Data=ADC0832_Read(0);
sprintf(str,"ADC:%5u",Adc_Data);
LCD_Gotoxy(0,1);
LCD_Puts(str);
delay_ms(150);
}
return 1;
}

XI. GIAO TIẾP VỚI IC THỜI GIAN THỰC DS1302

Phần này gồm các nội dung:

- Ghi giá trị thời gian vào DS1302.

- Đọc thời gian trong DS1302.

- Có thể phát triển thêm để tạo đồng hồ cá nhân…

1) DS1302

- DS1302 là IC thời gian thực có chuẩn giao tiếp hai dây. Giá trị thời gian
của nó đúng đến năm 2100.

- Sơ đồ kết nối DS1302 với 8051.


2) Lập trình giao tiếp với DS1302.

- Để có thể điều khiển được DS1302 ta cần các hàm viết giá trị thời gian,
và hàm đọc giá trị thời gian bên trong IC.

- Hàm cài đặt thời gian:


void DS1302_SetTime(unsigned char hour,unsigned char minute,unsigned char
second)
{
DS1302_Write(0x80,second);
DS1302_Write(0x82,minute);
DS1302_Write(0x84,hour);
}

- Hàm cài đặt ngày, tháng:


void DS1302_SetDate(unsigned char day, unsigned char date, unsigned char
month, unsigned char year)
{
DS1302_Write(0x86,date);
DS1302_Write(0x88,month);
DS1302_Write(0x8A,day);
DS1302_Write(0x8C,year);
}

- Hàm đọc giá trị thời gian:


void DS1302_GetTime(unsigned char *hour,unsigned char *minute,unsigned char
*second)
{
*second=DS1302_Read(0x81);
*minute=DS1302_Read(0x83);
*hour=DS1302_Read(0x85);
}

- Hàm đọc giá trị ngày,tháng:


void DS1302_GetDate(unsigned char *day, unsigned char *date, unsigned char
*month, unsigned char *year)
{
*date=DS1302_Read(0x87);
*month=DS1302_Read(0x89);
*day=DS1302_Read(0x8B);
*year=DS1302_Read(0x8D);
}

3) Bài toán ví dụ:

- Để thực hành với DS1302 ta sẽ làm một ví dụ sau: Cài đặt thời gian mặc
định cho DS1302,sau đó đọc giá trị thời gian ghi trong IC và hiển thị
giờ,phút,giây,ngày,tháng,năm,thứ lên LCD16x2.

- Đây là nội dung của bài toán trên:


int main(void)
{
unsigned char s=6,m=58,h=6,d=6,da=21,mo=9,y=12;
unsigned char str[25];
DS1302_Init();
LCD_Init();
delay_ms(10);
LCD_Puts("DEMO DS1302");
delay_ms(1000);
LCD_Clear();
DS1302_SetTime(h,m,s);
DS1302_SetDate(d,da,mo,y);
while(1)
{
DS1302_GetTime(&h,&m,&s);
DS1302_GetDate(&d,&da,&mo,&y);
sprintf(str,"Day:%2bu-%2bu-%2bu-%2bu",d,da,mo,y);
LCD_Gotoxy(0,1);
LCD_Puts(str);
sprintf(str,"Time:%2bu-%2bu-%2bu",h,m,s);
LCD_Gotoxy(0,0);
LCD_Puts(str);
delay_ms(150);
}
return 1;
}

You might also like