Trong xu hướng chung đó, vận dụng những kiến thức mà tôi đã được học trong quá trình học tập ở trường cũng như tìm hiểu thêm tôi xin thực hiện Luận văn về “Kỹ thuật vi điều khiển” với đ
Trang 1KHOA SƢ PHẠM
BỘ MÔN SƢ PHẠM VẬT LÝ - -
THIẾT KẾ MẠCH ĐO NHIỆT ĐỘ DÙNG VI ĐIỀU KHIỂN AT89C51 VÀ CẢM BIẾN NHIỆT DS18B20
Luận Văn Tốt Nghiệp
Trang 2LỜI CẢM ƠN
Để đề tài hoàn thành đạt được kết quả như mong trên không chỉ là sự nỗ lực của bản thân mà còn có sự chỉ dạy tận tình của quý thầy cô, cùng với sự giúp đỡ của bạn bè Đặc biệt, tôi xin chân thành cảm ơn sự hướng dẫn của thầy Vương Tấn Sĩ, thầy đã tận tình giúp đỡ tôi hoàn thành đề tài nghiên cứu của mình Thầy giúp tôi định hướng được mục tiêu của đề tài, chỉ dạy cho tôi biết cách nghiên cứu khoa học, và cách trình bày bài luận Ngoài ra, thầy đã dành nhiều thời gian để giúp tôi điều chỉnh những sai sót trong cả lý thuyết cũng như phần thực hành Qua đó, tôi đã đúc kết được nhiều kinh nghiệm và nó sẽ là hành trang quan trọng cho tôi sau này
Một lần nữa, tôi xin chân thành cảm ơn quý thầy cô và bạn bè đã luôn đồng hành cùng tôi trong suốt thời gian qua Tôi xin gửi lời chúc sức khỏe và thành công đến tất cả mọi người
Sinh viên thực hiện
Phạm Thành Tiến
Trang 3
LỜI CAM ĐOAN
Tôi xin cam đoan đây là công trình nghiên cứu do chính tôi thực hiện Các số liệu, kết quả phân tích trong luận văn là hoàn toàn trung thực và chưa từng được công bố trong bất kỳ công trình nghiên cứu nào trước đây
Mọi tham khảo, trích dẫn đều được chỉ rõ nguồn trong danh mục tài liệu tham khảo của luận văn
Cần Thơ, ngày 27 tháng 04 năm 2015
Tác giả
Phạm Thành Tiến
Trang 4MỤC LỤC
PHẦN MỞ ĐẦU 1
1 LÝ DO CHỌN ĐỀ TÀI 1
2 MỤC ĐÍCH NGHIÊN CỨU 2
3 ĐỐI TƯỢNG NGHIÊN CỨU 2
4 PHƯƠNG PHÁP NGHIÊN CỨU 2
5 GIỚI HẠN ĐỀ TÀI 2
PHẦN NỘI DUNG 3
CHƯƠNG 1: TỔNG QUAN VỀ ĐO NHIỆT ĐỘ 3
1 ĐO LƯỜNG 3
2 ĐO NHIỆT ĐỘ 3
2.1 Khái niệm về nhiệt độ và thang đo nhiệt độ 3
2.2 Các phương pháp đo nhiệt độ 4
CHƯƠNG 2: GIỚI THIỆU VI ĐIỀU KHIỂN VÀ VĐK AT89C51 6
1 GIỚI THIỆU CHUNG VỀ VI ĐIỀU KHIỂN 6
1.1 Khái quát chung về vi khiển: 6
1.2 Lịch sử phát triển của vi điều khiển 6
1.3 Sơ đồ khối của một bộ vi điều khiển 7
2 KIẾN TRÚC CỦA VI ĐIỀU KHIỂN AT89C51 7
2.1 Cấu trúc bên trong của AT89C51 8
2.2 Sơ đồ và chức năng các chân AT89C51 9
2.3 Tổ chức bộ nhớ 12
2.4 Phần mềm lập trình vi điều khiển AT89C51 14
CHƯƠNG 3: GIỚI THIỆU NGÔN NGỮ C CHO AT89C51 VÀ KEIL C 16
1 GIỚI THIỆU NGÔN NGỮ C 16
2 NGÔN NGỮ C CHO VI ĐIỀU KHIỂN AT89C51 16
2.1 Kiểu dữ liệu 16
2.2 Phép toán 19
2.3 Cấu trúc chương trình C 21
2.4 Các lệnh cơ bản trong C 24
3 TRÌNH BIÊN DỊCH KEIL C (COMPILER) 26
Trang 53.1 Khởi tạo cho Project 26
3.2 Soạn thảo chương trình 31
3.3 Biên dịch một chương trình 31
CHƯƠNG 4: GIỚI THIỆU CÁC LINH KIỆN TRONG MẠCH 36
1 CẢM BIẾN ĐO NHIỆT ĐỘ DS18B20 36
2 IC 7805 40
3 LCD 16x2 41
4 ĐIỆN TRỞ 43
5 THẠCH ANH 44
6 TỤ DIỆN 45
CHƯƠNG 5: THIẾT KẾ MẠCH VÀ THI CÔNG ĐỀ TÀI 47
1 KHỐI NGUỒN ỔN ÁP DÙNG IC 7805 47
1.1 Sơ đồ nguyên lý của mạch 47
1.2 Nguyên lý hoạt động của mạch 47
2 KHỐI ĐIỀU KHIỂN TRUNG TÂM DÙNG IC AT89C51 49
2.1 Mạch RESET 49
2.2 Mạch tạo dao động 50
2.3 IC AT89C51 51
3 KHỐI ĐO NHIỆT ĐỘ DÙNG DS18B20 52
3.1 Sơ đồ khối 52
3.2 Nguyên tắc hoạt động: 52
4 KHỐI HIỂN THỊ LCD 16X2 53
4.1 Sơ đồ nguyên lí 53
4.2 Nguyên tắc hoạt động 54
5 PHẦN MỀM CHƯƠNG TRÌNH 55
6 SƠ ĐỒ MẠCH IN……… 58
7 SƠ ĐỒ MÔ PHỎNG PROTEUS………… ……… 59
8 MỘT SỐ HÌNH ẢNH THỰC TẾ VÀ KẾT QUẢ THỰC TẾ…… ……… 60
PHỤ LỤC 1……… 62
PHỤ LỤC 2……… 74
PHẦN KẾT LUẬN 87
1 VỀ LÝ THUYẾT 86
Trang 62 VỀ THỰC NGHIỆM 86
3 HẠN CHẾ 86
4 PHƯƠNG HƯỚNG 86
TÀI LIỆU THAM KHẢO 87
Trang 7Danh sách hình ảnh
Hình 2.1 IC AT89C51
Hình 2.2 Sơ đồ chân IC AT89C51
Hình 3.1 Khởi tạo cho Project
Hình 3.2 Tạo Project mới
Hình 3.3 Đặt tên cho Project mới
Hình 3.4 Chọn vi điều khiển
Hình 3.5 Tạo File chương trình mới
Hình 3.6 Save As file chương trình mới
Hình 3.7 Đặt tên cho file chương trình
Hình 3.8 Bổ sung file chương trình vào Project
Hình 3.9 File chương trình đã được bổ sung vào Project
Hình 3.10 Chèn thư viện vào cho chương trình
Hình 3.11 Chương trình nhảy LED đơn
Hình 3.12 Biên dịch chương trình
Hình 3.13 Biên dịch chương trình thành file HEX
Hình 3.14 Chọn các thông số kỹ thuật cho file HEX
Hình 3.15 Chọn các cổng và thanh ghi
Hình 3.16 Chọn các thông số kỹ thuật cho Port 1
Hình 3.17 Chạy file code
Hình 4.1 Dạng đóng vỏ và bề ngoài của cảm biến DS18B20
Hình 4.2 Sơ đồ bộ nhớ DS18B20
Hình 4.3 IC ổn áp 7805
Hình 4.4 LCD 16x2
Hình 4.5 Kết nối Text LCD
Hình 4.6 Điện trở trong các thiết bị điện tử
Hình 4.7 Ký hiệu của điện trở trên các sơ đồ nguyên lý
Trang 9PHẦN MỞ ĐẦU
1 LÝ DO CHỌN ĐỀ TÀI
Ngày nay, nhân loại đã và đang trải qua những sự phát triển vượt bậc về mọi mặt
Trong đó lĩnh vực điện - điện tử đóng một vai trò không nhỏ Điện tử góp phần rất lớn vào quá trình tự động hoá, thực sự đã giúp con người có những tiến bộ vượt bậc Trên thế giới, việc ứng dụng điện - điện tử vào cuộc sống với xu hướng tối ưu hóa, hiện đại hóa nhằm đem lại tiện ích cho con người đang được phát triển mạnh Tuy vậy ở Việt Nam việc nghiên cứu và ứng dụng các thành tựu của “vi điều
khiển” còn khá mới mẻ trong thời điểm hiện tại Trong xu hướng chung đó, vận
dụng những kiến thức mà tôi đã được học trong quá trình học tập ở trường cũng như tìm hiểu thêm tôi xin thực hiện Luận văn về “Kỹ thuật vi điều khiển” với đề
tài Thiết kế mạch đo nhiệt độ dùng vi điều khiển AT89C51 và cảm biến DS18B20 Đề tài này được áp dụng chủ yếu dựa vào vi điều khiển, mà thực tế là
IC AT89C51, với mục đích giúp tôi hiểu một cách tường tận hơn các kiến thức về
vi điều khiển, cách đọc, viết và nhận biết về các chân IC, xây dựng mạch nguyên
l ý…
Các ứng dụng của vi điều khiển rất đa dạng và phong phú Từ những ứng dụng
đơn giản chỉ có vài thiết bị ngoại vi cho đến những hệ thống điều khiển phức tạp Tuy nhiên do phạm vi trình độ của tôi còn hạn chế, nên việc nghiên cứu và tìm hiểu về vi điều khiển còn nhiều vướng mắc, do đây là lần đầu tiên áp dụng vào thực tế nên việc học hỏi và tìm hiểu còn gặp nhiều khó khăn hơn Trong quá trình
làm đề tài tôi xin chân thành cám ơn thầy Vương Tấn Sĩ đã tận tình chỉ bảo, định hướng cho tôi hoàn thành tốt luận văn này
Xin chân thành cảm ơn!
Cần Thơ, tháng 5 năm 2015
Trang 102 MỤC ĐÍCH NGHIÊN CỨU
Nghiên cứu và khảo sát về IC AT89C51 và ứng dụng nó vào thiết kế mạch đo nhiệt
độ để vận dụng vào đời sống
3 ĐỐI TƯỢNG NGHIÊN CỨU
IC AT89C51 và mạch đo nhiệt độ dùng cảm biến nhiệt DS18B20
4 PHƯƠNG PHÁP NGHIÊN CỨU
Kết hợp nghiên cứu lý thuyết, thực hành trên máy vi tính và thực hành lắp ráp mạch điện tử ứng dụng của IC AT89C51 với cảm biến nhiệt DS18B20 trên thực tế
5 GIỚI HẠN ĐỀ TÀI
Trong phạm vi của đề tài là thiết kế và thi công mạch với chức năng đo nhiệt độ môi trường với sự hỗ trợ của IC AT89C51 và cảm biến nhiệt độ DS18B20 Chức năng chính của đề tài này là dùng DS18B20 đo nhiệt độ của môi trường thông qua chức năng xử lý của IC AT89C51, việc hiển thị giá trị nhiệt độ được hiển thị trực tiếp trên màn hình LCD Là một sinh viên sư phạm Vật lý, ít được làm quen với kỹ thuật điện tử vì vậy việc nghiên cứu đề tài về lĩnh vực điện tử đối với tôi gần như bước vào một thế giới kiến thức mới, rất đa dạng và phong phú Tôi hy vọng qua đề tài này có thể giúp các bạn sinh viên không chuyên về điện tử có thể hiểu được phần nào về kỹ thuật điện tử vô cùng hấp dẫn và những ứng dụng rất rộng rãi của
nó, qua đó hình thành lòng say mê và hứng thú tìm hiểu về kỹ thuật điện tử Mặc dù
đã cố gắng rất nhiều trong việc thực hiện đề tài, nhưng do đây là lần đầu nghiên cứu
về kỹ thuật điện tử và thời gian có hạn nên chắc chắn đề tài không thể tránh khỏi thiếu sót Kính mong được sự thông cảm, giúp đỡ của các thầy cô, bạn bè và hội đồng bảo vệ Tôi xin chân thành cảm ơn!
Trang 11PHẦN NỘI DUNG
CHƯƠNG 1: TỔNG QUAN VỀ ĐO NHIỆT ĐỘ
1 ĐO LƯỜNG
Đo lường là một quá trình đánh giá định hướng đại lượng cần đo để có kết quả bằng
số với đơn vị đo
Kết quả đo lường là giá trị bằng số của đại lượng cần đo Ax, nó bằng tỷ số của đại lượng cần đo X và đơn vị đo X0
Vậy quá trình có thể viết dưới dạng:
0 0
.X
A X X
X
Đây là phương trình cơ bản của phép đo, nó chỉ rõ sự so sánh đại lượng cần đo với mẫu và cho ra kết quả bằng số
Quá trình đo được tiến hành thông qua các thao tác cơ bản về đo lường sau:
- Thao tác xác định mẫu và thành lập mẫu
- Thao tác so sánh
- Thao tác biến đổi
- Thao tác thể hiện kết quả hay chỉ thị
Phân loại các cách thực hiện phương pháp đo
+ Đo trực tiếp: là cách đo mà kết quả nhận được trực tiếp từ một phép đo duy nhất
+ Đo gián tiếp: là cách đo mà kết quả đo được suy ra từ phép đo, từ sự phối hợp của nhiều phép đo trực trực tiếp
+ Đo thống kê: là phép đo nhiều lần một đại lượng nào đó, trong cùng một điều kiện và cùng một giá trị Từ đó dung phép tính xác suất để thể hiện kết quả đo có độ chính xác cần thiết [1]
2 ĐO NHIỆT ĐỘ
2.1 Khái niệm về nhiệt độ và thang đo nhiệt độ
Nhiệt độ là đại lượng vật lí đặc trưng cho mức chuyển động hỗn loạn của các phần tử trong các vật thể
Để đo được nhiệt độ thì phải có dụng cụ đo, thông thường trong công nghiệp nhiệt độ được đo bằng cảm biến và phương pháp này tiện lợi là có thể truyền tín hiệu nhiệt độ đi
xa, không ảnh hưởng tới sự làm việc của hệ thống khi cần xác định nhiệt độ
Để đo chính xác nhiệt độ thì cần có hiệu số Tx – T là cực tiểu với Tx là nhiệt độ cần
đo, T là nhiệt độ của cảm biến đặt trong môi trong môi trường cần đo
Trang 12Khi cảm biến được đặt trong môi trường cần đo nhiệt độ, thì nhiệt lượng cảm biến hấp thụ từ môi trường tỷ lệ với độ chênh lệch nhiệt giữa cảm biến và môi trường theo biểu thức:
dQ = a A(Tx- T)dt với a là độ dẫn nhiệt, A là diện tích bề mặt truyền nhiệt [1]
2.2 Các phương pháp đo nhiệt độ
Cùng với sự ra đời và phát triển mạnh mẽ của các hệ vi xử lý, việc đo nhiệt độ áp dụng vi xử lý, vi điều khiển đã mở ra nhiều hướng, đưa đến nhiều phương pháp khác nhau, linh hoạt và chính xác hơn Có nhiều cách để đo nhiệt độ, trong đó có thể liệt kê
một số phương pháp sau đây:
- Phương pháp quang dựa trên sự phân bố bức xạ nhiệt do dao động nhiệt (do hiệu ứng Doppler)
- Phương pháp cơ dựa trên sự dãn nở của vật rắn, của chất lỏng hoặc khí (với áp suất không đổi), hoặc dựa trên tốc độ âm
- Phương pháp dựa trên sự phụ thuộc của điện trở vào nhiệt độ, hiệu ứng Seebeck, hoặc dựa trên sự thay đổi tần số dao động của thạch anh [1]
Trước tiên nói về các cảm biến nhiệt độ, đó là các cảm biến được sử dụng vào các quá trình nhiệt như: đốt nóng, làm lạnh, trao đổi nhiệt.v.v .Đại lượng vào của cảm biến nhiệt độ là nhiệt độ và đại lượng ra là tín hiệu điện (dòng, áp) Một số cảm biến thường
sử dụng:
+ Nhiệt điện trở: nguyên lý làm việc là có điện trở thay đổi theo sự thay đổi nhiệt độ của nó Tuỳ theo tác dụng nhiệt của dòng điện cung cấp chạy qua chuyển đổi người ta phân ra: nhiệt điện trở đốt nóng và nhiệt điện trở không đốt nóng
Nhiệt điện trở đốt nóng, dòng điện chạy qua rất lớn làm nhiệt độ của nó tăng lên cao hơn nhiệt độ môi trường (1000C – 8000C), nên có sự toả nhiệt ra môi trường xung quanh, như nhiệt dẫn, đối lưu, bức xạ
Nhiệt điện trở không đốt nóng, dòng điện chạy qua rất nhỏ không làm tăng nhiệt độ của điện trở và nhệt độ của nó bằng nhiệt độ môi trường Nhiệt điện trở loại này dùng để đo nhiệt độ và các đại lượng cơ học như đo di chuyển
Nhiệt điện trở phân làm hai loại: nhiệt điện trở dây (nhiệt điện trở đồng, nhiệt điện trở Platin, nhiệt điện trở Niken) và nhiệt điện trở bán dẫn
+ Cặp nhiệt điện: nguyên lý làm việc dựa trên 2 hiệu ứng: Thomson và Seebeck ứng dụng của cặp nhiệt điện chủ yếu để đo nhiệt độ, ngoài ra nó còn dược dùng để đo các đại lượng không điện và điện khác như: đo dòng điện ở tần số cao, đo hướng chuyển động và lưu lượng của các dòng chảy, đo di chuyển, đo áp suất nhỏ
+ Cảm biến nhiệt độ dùng đặc tính diode và tranzitor [1]
Trang 13Đo nhiệt độ là nhiệm vụ thường gặp trong các ngành nhiệt học, hoá học, luyện kim Tuỳ theo nhiệt độ đo mà có thể dùng các phương pháp đo khác nhau Thông thường nhiệt độ đo được chia thành 3 dải: nhiệt độ thấp, nhiệt độ trung bình và nhiệt độ cao Ở nhiệt độ trung bình và thấp, phương pháp đo thường là tiếp xúc nghĩa là các chuyển đổi được đặt trực tiếp ở ngay môi trường cần đo Đối với nhiệt độ cao, đo bằng phương pháp không tiếp xúc, nghĩa là dụng cụ đo đặt ngoài môi trường đo Một trong số những cách
đó là đo nhiệt độ không tiếp xúc sử dụng cảm biến DS18B20
Trang 14CHƯƠNG 2: GIỚI THIỆU VI ĐIỀU KHIỂN VÀ VĐK AT89C51
1 GIỚI THIỆU CHUNG VỀ VI ĐIỀU KHIỂN
1.1 Khái quát chung về vi điều khiển:
Bộ vi điều khiển viết tắt là Micro-controller, là mạch tích hợp trên một chip có thể lập trình được, dùng để điều khiển hoạt động của một hệ thống Theo chương trình điều khiển đã nạp sẵn bên trong chip, bộ vi điều khiển tiến hành đọc, lưu trữ thông tin, xử lý thông tin, sau đó dựa vào kết quả của quá trình xử lý để đưa ra các thông báo, tín hiệu điều khiển tiến hành điều khiển quá trình hoạt động của các thiết bị bên ngoài Vi điều khiển được ứng dụng trong rất nhiều sản phẩm công nghiệp và tiêu dùng Trong các thiết
bị điện và điện tử dân dụng, các bộ vi điều khiển điều khiển hoạt động của TV, máy giặt, đầu đọc laser, điện thoại, lò vi-ba Trong hệ thống sản xuất tự động, bộ vi điều khiển được sử dụng trong Robot, dây chuyền tự động Các hệ thống càng thông minh thì vai trò của hệ vi điều khiển càng quan trọng [2]
1.2 Lịch sử phát triển của vi điều khiển
Bộ vi điều khiển thực ra là một loại vi xử lí trong tập hợp các bộ vi xử lý nói chung Bộ vi điều khiển được phát triển từ bộ vi xử lí, từ những năm 1970 do sự phát triển và hoàn thiện về công nghệ vi điện tử dựa trên kỹ thuật MOS (Metal-Oxide-Semiconductor), mức độ tích hợp của các linh kiện bán dẫn trong một chip ngày càng
cao
Năm 1971 xuất hiện bộ vi xử lí 4 bit loại TMS1000 do công ty Texas Instruments vừa là nơi phát minh vừa là nhà sản xuất Nhìn tổng thể thì bộ vi xử lý chỉ có chứa trên một chip những chức năng cần thiết để xử lý chương trình theo một trình tự, còn tất cả bộ phận phụ trợ khác cần thiết như: bộ nhớ dữ liệu, bộ nhớ chương trình, bộ chuyển đổi AD, khối điều khiển, khối hiển thị, điều khiển máy in, nối đồng hồ và lịch là những linh kiện nằm ở bên ngoài được nối vào bộ vi xử lý
Mãi đến năm 1976 công ty INTEL (Intelligent-Elictronics) mới cho ra đời bộ vi điều khiển đơn chip đầu tiên trên thế giới với tên gọi 8048 Bên cạnh bộ xử lý trung tâm,
8048 còn chứa bộ nhớ dữ liệu, bộ nhớ chương trình, bộ đếm và phát thời gian, các cổng
Trang 15vào ra digital trên một chip Các công ty khác cũng lần lược cho ra đời các bộ vi điều khiển 8 bit tương tự như 8048 và hình thành họ vi điều khiển MCS-48
Đến năm 1980 công ty INTEL cho ra đời thế hệ thứ hai của bộ vi điều khiển đơn chip với tên gọi 8051 Và sau đó hàng loạt các vi điều khiển cùng loại với 8051 ra đời và hình thành họ vi điều khiển MCS-51
Đến nay họ vi điều khiển 8 bit MCS-51 đã có đến 250 thành viên và hầu hết các công ty hàng đầu thế giới chế tạo Đứng đầu là công ty INTEL và rất nhiều công ty khác như: AMD, SIEMENS, PHILIPS, DALLAS, OKI …[2]
1.3 Sơ đồ khối của một bộ vi điều khiển
Sơ đồ khối chung của hầu hết các bộ vi điều khiển bao gồm CPU, bộ nhớ ROM hay EPROM và RAM, mạch giao tiếp, mạch giao tiếp song song, bộ định thời gian, hệ thống ngắt và các BUS được tích hợp trên cùng một chip
2 KIẾN TRÚC CỦA VI ĐIỀU KHIỂN AT89C51
IC vi điều khiển AT89C51 thuộc họ MCS-51 có các đặc điểm sau :
+ 4 kbyte ROM
+ 128 byte RAM
+ 4 port I/0 8 bit
+ Hai bộ định thời 16 bits
+ Giao tiếp nối tiếp
+ Quản lý được 64K bộ nhớ chương trình bên ngoài
+ Quản lý được 64K bộ nhớ dữ liệu bên ngoài
+ 210 vị trí nhớ được định địa chỉ bit
+ Thực hiện phép nhân/chia trong 4s
Hình 2.1 IC AT89C51
Trang 162.1 Cấu trúc bên trong của AT89C51
Sơ Đồ Khối AT89C51
Phần chính của vi điều khiển AT89C51 là bộ xử lí trung tâm (CPU: central processing unit) bao gồm:
+ Thanh ghi tích lũy A
+ Thanh ghi tích lũy phụ B, dùng cho phép nhân và phép chia
+ Đơn vị logic học (ALU: Arithmetic Logical Unit)
+ Từ trạng thái chương trình (PSW: Prorgam Status Word)
+ Bốn băng thanh ghi
Hai bộ định thời 16 bit hoạt động như một bộ đếm
BUS CONTROL
SERIAL PORT
EXTERNAL
INTERRUPTS
CPU
ON - CHIP RAM
ETC TIMER 0 TIMER 1
ADDRESS/DATA
TXD RXD P0 P1 P2 P3
Trang 17Các cổng (port 0, 1, 2, 3), sử dụng vào mục đích điều khiển Ở cổng 3 có thêm các đường dẫn điều khiển dùng để trao đổi với một bộ nhớ bên ngoài, hoặc để đầu nối giao diện nối tiếp, cũng như các đường ngắt dẫn bên ngoài Giao diện nối tiếp có chứa một bộ truyền và một bộ nhận không đồng bộ, làm việc độc lập với nhau Tốc độ truyền qua cổng nối tiếp có thể đặt trong dải rộng và được ấn định bằng một bộ định thời
Trong vi điều khiển AT89C51 có hai thành phần quan trọng khác đó là bộ nhớ và các thanh ghi:
+ Bộ nhớ gồm có bộ nhớ RAM và bộ nhớ ROM dùng để lưu trữ dữ liệu và mã lệnh + Các thanh ghi sử dụng để lưu trữ thông tin trong quá trình xử lí Khi CPU làm việc nó làm thay đổi nội dung của các thanh ghi [3]
2.2 Sơ đồ và chức năng các chân AT89C51
Sơ đồ các chân ra trên vỏ của các vi mạch MCS-51 như hình dưới đây
Vi điều khiển AT89C51 có 32 trong 40 chân có chức năng như là các cổng I/O, trong đó 24 chân được sử dụng với hai mục đích Nghĩa là ngoài chức năng cổng I/O, mỗi chân có công dụng kép này có thể là một đường điều khiển của Bus địa chỉ hay Bus
dữ liệu hoặc là mỗi chân hoạt động mọt cách độc lập để giao tiếp với các thiết đơn bit như là công tắc, LED, transistor…
18
9
12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10
EA/VP X1
X2
RESET
INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
RST 12MHz
Hình 2.2 Sơ đồ chần IC AT89C51
Trang 18a.Port0: là port có 2 chức năng, ở trên chân từ 32 đến 39 của AT89C51 Trong các
thiết kế cỡ nhỏ không dùng bộ nhớ ngoài, P0 được sử dụng như là những cổng I/O Còn trong các thiết kế lớn có yêu cầu một số lượng đáng kể bộ nhớ ngoài thì P0 trở thành các đường truyền dữ liệu và 8 bit thấp của bus địa chỉ
b Port1: là một port I/O chuyên dụng, trên các chân 1-8 của AT89C51 Chúng
được sử dụng với một múc đích duy nhất là giao tiếp với các thiết bị ngoài khi cần thiết
c Port2: là một cổng có công dụng kép trên các chân 21 – 28 của AT89C51 Ngoài
chức năng I/O, các chân này dùng làm 8 bit cao của bus địa chỉ cho những mô hình thiết
kế có bộ nhớ chương trình ROM ngoài hoặc bộ nhớ dữ liệu RAM có dung lượng lớn hơn
256 byte
d Port3: là một cổng có công dụng kép trên các chân 10 – 17 của AT89C51 Ngoài
chức năng là cổng I/O, những chân này kiêm luôn nhiều chức năng khác nữa liên quan đến nhiều tính năng đặc biệt của AT89C51, được mô tả trong bảng sau:
Bit Tên Chức năng chuyển đổi
P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
RxD TxD
0INT1INT
T0 T1
ÖWR
RD
Ngõ vào dữ liệu nối tiếp
Ngõ xuất dữ liệu nối tiếp
Ngắt ngoài 0
Ngắt ngoài 1
Ngõ vào TIMER 0
Ngõ vào của TIMER 1
Điều khiển ghi dữ liệu lên bộ nhớ ngoài
Điều khiển đọc bộ nhớ dữ liệu ngoài
Chức năng của các chân trên port3
e PSEN (Program Store Enable): AT89C51 có 4 tín hiệu điều khiển, PSEN là tín
hiệu ra trên chân 29 Nó là tín hiệu điều khiển để cho phép truy xuất bộ nhớ chương trình
mở rộng và thường được nối đến chân OE (Output Enable) của một EPROM để cho phép đọc các byte mã lệnh của chương trình Tín hiệu PSEN ở mức thấp trong suốt phạm vi quá trình của một lệnh Các mã nhị phân của chương trình được đọc từ EPROM qua bus
Trang 19và được chốt vào thanh ghi lệnh của AT89C51 để giải mã lệnh Khi thi hành chương trình trong ROM nội PSEN sẽ ở mức cao
f ALE (Address Latch Enable ): Tín hiệu ra ALE trên chân 30 tương hợp với các
thiết bị làm việc với các xử lý 8585, 8088 AT89C51 dùng ALE để giải đa hợp bus địa chỉ và dữ liệu, khi port 0 được dùng làm bus địa chỉ/dữ liệu đa hợp: vừa là bus dữ liệu vừa là byte thấp của địa chỉ 16 bit ALE là tín hiệu để chốt địa chỉ vào một thanh ghi bên ngoài trong nữa đầu của chu kỳ bộ nhớ Sau đó, các đường Port 0 dùng để xuất hoặc nhập
dữ liệu trong nữa sau chu kỳ của chu kỳ bộ nhớ
Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng là nguồn xung nhịp cho các hệ thống Nếu xung trên 8951 là 12MHz thì ALE
có tần số 2MHz Chân này cũng được làm ngõ vào cho xung lập trình cho EPROM trong AT89C51
g EA (External Access): Tín hiệu vào EA trên chân 31 thường được nối lên mức
cao (+5V) hoặc mức thấp (GND) Nếu ở mức cao, AT89C51 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp (4K) Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng Người ta còn dùng chân EA làm chân cấp điện áp 21V khi lập trình cho EPROM trong AT89C51
h RST (Reset): Ngõ vào RST trên chân 9 là ngõ reset của AT89C51 Khi tín hiệu
này được đưa lên mức cao (trong ít nhất 2 chu kỳ máy), các thanh ghi trong AT89C51 được đưa vào những giá trị thích hợp để khởi động hệ thống
i.OSC: AT89C51 có một bộ dao động trên chip, nó thường được nối với thạch anh
giữa hai chân 18 và 19 Tần số thạch anh thông thường là 12MHz
j.POWER: AT89C51 vận hành với nguồn đơn +5V Vcc được nối vào chân 40 và
Vss (GND) được nối vào chân 20 [4]
Trang 20mã chương trình từ bộ nhớ chương trình ngoài bằng tín hiệu /PSEN, còn bộ nhớ số liệu ngoài được truy nhập bằng các tín hiệu /WR và /RD, do có bộ nhớ chương trình và bộ nhớ số liệu ngoài có thể dùng chung bus địa chỉ A0 A15 Bộ nhớ số liệu trong của AT89C51 có địa chỉ từ 00h đến FFh, trong đó nhóm 8052 có đủ 256 byte RAM, nhóm
8051 chỉ có 128 byte RAM ở các địa chỉ thấp từ 00h đến 7fh, vùng địa chỉ cao từ 80h đến FFh được dành cho các thanh ghi chức năng đặc biệt SFR Tổ chức vùng 128 byte thấp
bộ nhớ số liệu RAM trong của AT89C51 như trên hình 3, nó được chia thành ba miền
- Miền các băng thanh ghi chiếm địa chỉ từ 00h đến 1fh có 32 byte chia thành băng, mỗi băng có 8 thanh ghi được đánh số từ R0 đến R7
- Tại mỗi thời điểm chỉ có một băng thanh ghi có thể truy nhập và được gọi là băng tích cực Để chọn băng tích cực cần nạp giá trị thích hợp cho các bít RS0 và RS1 của thanh ghi từ trạng thái PSW, mặc định bằng 0 là tích cực Miền RAM được định địa chỉ bít có 16 byte 8 bít = 128 bít, chiếm địa chỉ từ 20h đến 1fh Mỗi bít ở miền này được
Trang 21định địa chỉ riêng từ 00h đến 7fh nên có thể truy nhập đến từng bít riêng rẽ bằng các lệnh
xử lý bít Vùng RAM được định địa chỉ bít và các lệnh xử lý bít là một trong những đặc tính nổi bật đem lại sức mạnh cho vi điều khiển AT89C51
- Miền RAM thông thường có 80 byte chiếm địa chỉ từ 30h đến 7fh Các thanh ghi chức năng đặc biệt (viết tắt theo tiếng Anh là SFR) là tập các thanh ghi bên trong của bộ
vi điều khiển AT89C51 định địa chỉ cho tất cả các SFR ở vùng 128 byte cao của bộ nhớ
số liệu trong, mỗi SFR có tên gọi và địa chỉ riêng, một số SFR có định địa chỉ cho từng bít Khi bật nguồn hoặc RESET, tất cả các SFR đều được nạp giá trị đầu, sau đó chương trình cần nạp lại giá trị cho các SFR cần dùng theo yêu cầu sử dụng
- Việc truy nhập đến các SFR chỉ có thể thực hiện bằng phương pháp địa chỉ trực tiếp với tên gọi hoặc địa chỉ của SFR là toán hạng của lệnh Với các SFR có định địa chỉ bít, có thể truy nhập và thay đổi trực tiếp từng bít của nó bằng các lệnh xừ lý bít Bảng 2 cho biết thông tin chủ yếu về các SFR
- Ở nhóm 8051 vùng 128 byte cao của bộ nhớ số liệu trong chỉ có các SFR, không tồn tại các ô nhớ khác ở vùng nhớ này Ở nhóm 8052 bộ nhớ số liệu trong có 256 byte RAM, các ô nhớ của vùng RAM 128 byte cao chỉ có thể truy nhập được bằng phương pháp địa chỉ gián tiếp, còn các SFR cũng có địa chỉ nằm trong vùng đó nhưng chỉ truy nhập được bằng phương pháp địa chỉ trực tiếp, vì thế việc truy nhập chúng không bị xung đột và nhầm lẫn [4]
Trang 22RAM
2.4 Phần mềm lập trình vi điều khiển AT89C51
- Có thể viết trên ngôn ngữ Assembler hoặc các ngôn ngữ bậc cao khác như C, Basic,
Forth Tập lệnh Assembler của họ AT89C51 có 83 lệnh, được chia thành 5 nhóm là các lệnh số học, các lệnh logic, các lệnh chuyển số liệu, các lệnh xử lý bít và các lệnh rẽ nhánh Các lệnh xứ lý bít là điểm mạnh cơ bản của AT89C51, vì chúng làm cho chương trình ngắn gọn hơn và chạy nhanh hơn Chương trình Assembler được viết trên máy tính, sau đó phải dịch ra mã máy của AT89C51 bằng trình biên dịch ASM51, rồi mới nạp
7F
30 2F 2E 2D 2C 2B 2A
18
17
10 0F
67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58
57 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48
47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38
37 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28
27 26 25 24 23 22 21 20 1F 1E 1D 1C 1B 1A 19 18
17 16 15 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08
07 06 05 04 03 02 01 00 BANK 3
BANK 2 BANK 1 Default register Bank for ROR7
Trang 23Chương trình mã máy vào bộ nhớ cho trình EEPROM (hoặc EPROM) ở bên trong hoặc bên ngoài AT89C51 Khi lập trình bằng ngôn ngữ bậc cao như C, Basic, Forth cũng phải dịch chúng ra mã máy của họ AT89C51 bằng các trình biên dịch tương ứng, sau đó nạp chương trình mã máy vào bộ nhớ chương trình Nói chung, chương trình viết trên ngôn ngữ Assembler khó hơn viết trên ngôn ngữ bậc cao, nhưng khi dịch ra mã máy sẽ ngắn gọn hơn và chạy nhanh hơn các chương trình viết trên ngôn ngữ bậc cao Để viết và nạp phần mềm cho AT89C51, bạn phải có các công cụ là máy vi tính, trình biên dịch
ngôn ngữ sử dụng ra mã máy của AT89C51 và bộ nạp chương trình mã máy từ máy tính
vào bộ nhớ chương trình EEPROM trong AT89C51 hoặc bộ nhớ EPROM ngoài
Trang 24
CHƯƠNG 3: GIỚI THIỆU NGÔN NGỮ C CHO AT89C51 VÀ
TRÌNH BIÊN DỊCH KEIL C
1 GIỚI THIỆU NGÔN NGỮ C
Trong kỹ thuật lập trình vi điều khiển 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 vi điều khiển 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ộ
vi điều khiển 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 vi điều khiển đó 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
2 NGÔN NGỮ C CHO VI ĐIỀU KHIỂN
Miền giá trị (Range)
1 unsigned char 1 byte 0 đến 255
2 char 1 byte -128 đến 127
3 enum 2 bytes -32,768 đến 32,767
4 unsigned int 2 bytes 0 đến 65,535
5 short int 2 bytes -32,768 đến 32,767
Trang 25* Khai báo biến:
- Cú pháp: Kiểu_dữ_liệu Vùng_nhớ Tên_biến _at_ Đia_chỉ;
Ví dụ: Unsigned char data x;
- Khi khai báo biến có thể gán luôn cho biến giá trị ban đầu
Ví dụ: Thay vì: unsigned char x; x = 0;
Ta chỉ cần: unsigned char x = 0;
- Có thể khai báo nhiều biến cùng một kiểu một lúc Ví dụ: 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 Keil C sẽ mặc định đó là vùng nhớ DATA [4]
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 vi điều khiển
BDATA Bộ nhớ dữ liệu có thể định địa chỉ bit, nằm trong vùng nhớ DATA IDATA Bộ nhớ dữ liệu gồm 128 Byte cao của RAM trong vi điều khiển chỉ
có ở một số dòng vi điều khiển sau này PDATA Bộ nhớ dữ liệu ngoài gồm 256 Byte, được truy cập bởi địa chỉ đặt
trên P0 XDATA Bộ nhớ dữ liệu ngoài có dung lượng có thể lên đến 64 KB, được truy
cập bởi địa chỉ trên P0 và P2
* Định nghĩa lại kiểu
- Cú pháp: typedef Kiễu_dữ_liệu Tên_biến;
- Ten_biến sau này sẽ được sử dụng như một kiểu dữ liệu mới và có thể dùng để khai báo các biến khác
Trang 26- 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 vi điều khiển Khi khai báo biến kiểu bit trình dịch 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 vi điều khiển dùng để truy nhập các đoạn dữ liệu 1 bit, 8 bit, 16 bit [4]
2.1.3 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:
- Cú pháp: 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ì
Ví dụ: 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ố
Ví dụ: phần tử mảng b[0] [1] là đúng Khi viết b[0] là sai [4]
2.1.4 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ể
Trang 27* Khai báo biến con trỏ:
- Cú pháp: Kiểu_Dữ_liệu Vùng_nhớ *Tên_biến;
Ví dụ:
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 [4]
2.1.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:
- Định nghĩa: typedef struct {
Khai báo các biến thành phần;
Trang 28=== Đồng nhất Hai số hạng bằng nhau và cùng kiểu $a===5
>= Lớn hơn hoặc bằng Vế trái lớn hơn hoặc bằng vế phải $a>=5
<= Nhỏ hơn hoặc bằng Vế trái nhỏ hơn hoặc bằng vế phải $a<=5
2.2.4 Phép toán thao tác Bit
^ Phép hoặc loại trừ (XOR) Bit_1 ^ Bit_2
Trang 292.3 Cấu trúc chương trình C
2.3.1 Cấu trúc chương trình
* Cấu trúc
1 Khai báo chỉ thị tiền xử lý
2 Khai báo các biến toàn cục
3 Khai báo nguyên mẫu các hàm
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);
void delay(unsigned int n)
Bit kiemtra(unsigned int a)
{ Khai báo biến cục bộ;
Mã chương trình kiểm tra biến a;
}
Trang 30Chú ý: 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
2.3.2 Chỉ thị tiền xử lý
Các chỉ thị tiền xử 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 [4]
* Chỉ thị #define
Chỉ thị #define cho phép tạo các macro thay thế đơn giản
- Cú pháp: #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ị:
Trang 31Đoạn chương trình 1
#else Đoạn chương trình 2
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 “Đoạn chương trình” sẽ được dịch ngược lại “Đoạn chương trình” sẽ bị bỏ qua [4]
2.3.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ở nê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à “*\”
Trang 322.4 Các lệnh cơ bản trong C
+ Câu lệnh rẽ nhánh if:
- Cấu trúc: 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: 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”
+ Câu lệnh lựa chọn:
Cấu trúc: switch(bien)
{
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_3: {//các câu lệnh break;}
………
case gia_tri_n: {//các câu lệnh break;}
}
Giải thích: tuỳ vào biến có gia_tri_1 thì thực hiện các câu lệnh tương ứng rồi sau
đó thoát khỏi cấu trúc nhờ câu lệnh break
Biến có gia_tri_2 thì thực hiện câu lệnh tương ứng rồi thoát
Trang 33Giải thích: m, l là giá trị(m>l), còn n là biến Thực hiện lặp các câu lệnh (l-m) lần
+ Vòng lặp không xác định while:
- Cấu trúc: while(dieu_kien)
{
// các câu lệnh }
Giải thích: thực hiện lặp các câu lệnh khi điều kiện đúng nếu điều kiện sai thì thoát khỏi vòng lặp
+ Vòng lặp không xác định do while:
Cấu trúc: do
{ // các câu lệnh } while(dieu_kien);
Giải thích: thực hiện lặp các câu lệnh sau đó kiểm tra điều kiện nếu đúng, nếu sai thì thoát khỏi vòng lặp [4]
Trang 343 TRÌNH BIÊN DỊCH KEIL C (COMPILER)
3.1 Khởi tạo cho Project
Để tạo 1 project mới chọn Project → New project nhƣ sau:
Hình 3.1 Khởi tạo cho Project
Hình 3.2 Tạo Project mới
Trang 35Hộp thoại Create New Project hiện ra như sau:
Đánh tên và chuyển đến thư mục nơi lưu project Ta nên tạo mỗi một thư mục cho 1
project Rồi chọn Save Hộp thoại sau hiện ra:
Hình 3.3 Đặt tên cho Project mới
Hình 3.4 Chọn vi điều khiển
Trang 36Trong này có một loạt các hãng điện tử sản xuất AT89C51 Để lập trình cho IC nào thì chọn IC đấy, kích chuột vào dấu + để mở rộng các con IC của các hãng Ở đây ta lập trình cho AT89C51 của hãng ATMEL nên ta chọn như trên
Khi chọn chip thì ngay lập tức 1 bảng hiện ra 1 số tính năng của chip mà ta có thể nhìn thấy: 8051 based fully static 24Mhz … nhập OK, chọn câu trả lời NO khi được hỏi
“copy standard 8051 startup code to project and addfile to project” vì nếu chọn YES chỉ làm cho file lập trình sẽ thêm nặng
Để tạo một file code ta chọn File→New hoặc ấn Ctrl+N như sau:
Cửa sổ text1 hiện ra Tiếp theo ta chọn File → Save As hoặc Ctrl+S, để lưu File mặc
dù chưa có gì như sau:
Hình 3.5 Tạo File chương trình mới
Hình 3.6 Save As file chương trình mới
Trang 37Đƣợc cửa sổ sau:
Ta nhập tên vào text box File name Chú ý tên gì cũng đƣợc nhƣng không đƣợc thiếu đuôi mở rộng C, và nhấn SAVE
Trong ô bên trái màn hình, cửa sổ PROJECT WORKSPACE, các bạn mở rộng
cái target 1 ra nhƣ sau:
Hình 3.7 Đặt tên cho file code
Hình 3.8 Bổ sung file code vào Project
Trang 38Nhấp chuột phải lên SOURCE GROUP, chọn Add file to Group “Source Group 1” hộp thoại hiện ra chọn file C mà ta vừa SAVE rồi nhấn Add một lần rồi nhấn Close Nếu ta nhấn Add hai lần nó sẽ thông báo là file đã add, lúc này ta chỉ việc OK rồi
nhấn Close Đƣợc nhƣ sau:
Bây giờ trong hình nhìn thấy trong Source Group 1 có file Machdonhietdo.C Ta nhấp chuột phải vào vùng soạn thảo file Machdonhietdo.C để
thêm file thƣ viện Chon Insert “#include<REGX51.H>”
Hình 3.9 File code đã đƣợc bổ sung vào
Project
Hình 3.10 Chèn thƣ viện vào cho file code
Trang 39Phần cuối cùng của công việc khởi tạo là ta có thể viết lời giải thích cho dự án của mình Phần này rất cần thiết vì nó để người khác hiểu mình làm gì trong project này và khi mình cần sử dụng lại code đọc lại còn biết nó là cái gì
3.2 Soạn thảo chương trình
Các bạn viết thử một chương trình làm ví dụ Khi viết xong mỗi dòng lệnh nên giải thích dòng lệnh đó làm gì Ví dụ:
Trang 40Để biên dịch chương trình thành file HEX các bạn chọn: Project→Option for
„target 1‟ như hình vẽ:
Hình 3.12 Biên dịch chương trình
Hình 3.13 Biên dịch chương trình thành file HEX