Professional Documents
Culture Documents
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
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
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
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:
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
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:
Để 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:
Để 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:
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.
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.
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.
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)
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.
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:
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.
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.
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
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
Trong đó:
7805: IC ổn áp đầu ra 5V
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 đó:
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.
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.
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.
X5045 là IC EEPROM 512kB giao tiếp nối tiếp theo chuẩn SPI.
ADC0832 là ADC 8 bit truyền thông nối tiếp có xung đồng bộ, có 02
kênh vào.
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:
Đầ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ị
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
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
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ể.
- 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;
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)
AND &&
OR ||
NOT !
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
a!=b
!= So sánh khác nhau
9!=9 sẽ trả ra giá trị 0
Phép toán Ví dụ
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
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).
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).
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_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;
}
Để có thể điều khiển được LCD ta phải đi xây dựng các hàm cơ bản sau:
Để 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.
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
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.
Để 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’).
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).
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
- Để 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).
- 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).
- 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.
- Để 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:
Để 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.
- 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.
- Để 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.
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;
}
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á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:
Đ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).
Khi xử lý DS18b20, cần chú ý tới 2 nhóm lệnh (Cụ thể có thể xem ở
datasheet DS18b20):
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:
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);
}
}
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.
- Để 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 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;
}
- Để 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.
- 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.
- Để 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);
}
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.
- Để 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.
- Để 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.