Bài giảng Vi điều khiển

Tài liệu Bài giảng Vi điều khiển: TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CƠ KHÍ ĐỘNG LỰC BÀI GIẢNG HỌC PHẦN: VI ĐIỀU KHIỂN SỐ TÍN CHỈ: 02 LOẠI HÌNH ĐÀO TẠO: ĐẠI HỌC CHÍNH QUY NGÀNH: CÔNG NGHỆ KỸ THUẬT Ô TÔ Hưng Yên - 2015 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 1 Chƣơng 1 TỔNG QUAN ................................................................................................................ 4 1.1. Khái niệm ......................................................................................................................... 4 1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng .............................................................. 4 1.3 Các hệ thống số ..................................................................................................................... 5 1.3.1. Hệ thống số thập phân ................................................................................................... 5 1.3.2. Hệ thống số nhị phân ..................................

pdf75 trang | Chia sẻ: putihuynh11 | Lượt xem: 609 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Vi điều khiển, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CƠ KHÍ ĐỘNG LỰC BÀI GIẢNG HỌC PHẦN: VI ĐIỀU KHIỂN SỐ TÍN CHỈ: 02 LOẠI HÌNH ĐÀO TẠO: ĐẠI HỌC CHÍNH QUY NGÀNH: CÔNG NGHỆ KỸ THUẬT Ô TÔ Hưng Yên - 2015 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 1 Chƣơng 1 TỔNG QUAN ................................................................................................................ 4 1.1. Khái niệm ......................................................................................................................... 4 1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng .............................................................. 4 1.3 Các hệ thống số ..................................................................................................................... 5 1.3.1. Hệ thống số thập phân ................................................................................................... 5 1.3.2. Hệ thống số nhị phân ..................................................................................................... 5 1.3.3. Hệ thống số bát phân (BCD-Binary Coded Decimal) ................................................... 6 1.3.4. Hệ thống số thập lục (Hexadecimal) ............................................................................. 6 1.3.5. Số bù hai ........................................................................................................................ 7 1.3.6. Các phép toán số học đối với hệ nhị phân ..................................................................... 7 1.3.6.1. Phép cộng nhị phân không dấu .............................................................................. 7 1.3.6.2. Phép trừ nhị phân .................................................................................................. 7 1.3.6.3. Phép nhân nhị phân ............................................................................................... 7 1.3.6.4. Phép chia nhị phân ................................................................................................ 8 1.3.7. Chuyển đổi qua lại giữa các hệ thống số ....................................................................... 8 1.3.7.1. Chuyển đổi số thập phân sang nhị phân : ............................................................... 8 1.3.7.2. Chuyển đổi số nhị phân sang thập phân ................................................................. 8 1.3.7.3. Chuyển đổi số nhị phân sang Hexa : ...................................................................... 8 1.3.7.4. Chuyển đổi số Hexa sang nhị phân: ....................................................................... 9 1.3.7.5. Mã ASCII: (American Standard Code for Information Interchange ) ................... 9 Chƣơng 2. CẤU TRÚC PHẦN CỨNG VÀ NGÔN NGỮ LẬP TRÌNH C .................................. 11 2.1 Cấu trúc phần cứng của vi điều khiển 8051 ........................................................................ 11 2.2. Sơ đồ chân .......................................................................................................................... 11 2.2.1. Nhóm chân nguồn, dao động, điều khiển .................................................................... 12 2.2.2. Nhóm chân cổng vào ra .............................................................................................. 13 2.3. Tổ chức không gian bộ nhớ ................................................................................................ 14 2.3.1. Bản đồ bộ nhớ ROM của 8051 .................................................................................... 14 2.3.2. Tổ chức không gian bộ nhớ RAM của 8051 ............................................................... 15 2.4. Thanh ghi ............................................................................................................................ 17 2.4.1. Thanh ghi tích luỹ A: .................................................................................................. 18 2.4.2. Thanh ghi từ trạng thái PSW (hay còn gọi là thanh ghi cờ) : ..................................... 18 2.4.3. Thanh ghi điều khiển bộ đếm bộ định thời (TCON) .................................................. 18 2.4.4. Thanh ghi điều khiển chế độ bộ định thời/bộ đếm (TMOD) ...................................... 19 2.4.5. Thanh ghi cho phép ngắt IE ....................................................................................... 20 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 2 2.5. Ngôn ngữ lập trình C cho vi điều khiển ............................................................................. 20 2.5.1. Cấu trúc một chƣơng trình trong C ............................................................................. 20 2.5.2. Lời chú thích ............................................................................................................... 21 2.5.3. Các loại kiểu dữ liệu trong C...................................................................................... 21 2.5.4. Các hàm trong C ......................................................................................................... 23 2.5.5. Các toán tử ................................................................................................................. 24 2.5.6. Phép toán lấy địa chỉ biến (&) .................................................................................... 26 2.5.7. Phép toán chuyển đổi kiểu (bắt buộc) ........................................................................ 26 2.5.8. Các định dạng ............................................................................................................. 26 2.5.9. Cấu trúc điều khiển ..................................................................................................... 27 2.5.9.1. Cấu trúc rẽ nhánh ................................................................................................ 27 2.5.9.2. Cấu trúc lựa chọn switch ...................................................................................... 27 2.5.9.3. Vòng lặp có hạn for ............................................................................................. 28 2.5.9.4. Vòng lặp không xác định while ............................................................................ 28 2.5.9.5. Một số thƣ viện chuẩn của C ............................................................................... 28 2.5.9.6. Các từ khóa trong C ............................................................................................. 29 2.5.9.10. con trỏ và mảng .................................................................................................. 29 2.6. Thuật toán và lƣu đồ thuật toán .......................................................................................... 33 2.6.1. Khái niệm .................................................................................................................... 33 2.6.2. Biểu diễn thuật toán bằng sơ đồ khối .......................................................................... 33 CHƢƠNG 3. LẬP TRÌNH ỨNG DỤNG ..................................................................................... 34 3.1. Các bƣớc tạo một Project mới ............................................................................................ 34 3.2. Lập trình ứng dụng. ............................................................................................................ 40 3.2.1. Chƣơng trình tạo trễ ................................................................................................... 40 3.2.2. Ứng dụng điều khiển LED đơn .................................................................................. 40 3.2.3. Ứng dụng điều khiển 8 LED đơn ................................................................................ 41 3.2.4. Ứng dụng điều khiển LED 7 thanh ............................................................................. 43 3.2.5. Ứng dụng điều khiển LED ma trận ............................................................................. 47 3.2.6. Ứng dụng sử dụng nút nhấn ........................................................................................ 48 3.2.7 Ứng dụng sử dụng ngắt ngoài ...................................................................................... 51 3.2.8. Lập trình cho Timer ..................................................................................................... 55 3.2.8.1. Các thanh ghi cơ sở của bộ định thời ................................................................... 55 3.2.8.2. Lập trình cho timer ở chế độ 1 ............................................................................. 57 3.2.8.3. Lập trình cho Timer ở chế độ 2 ............................................................................ 59 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 3 3.2.8.4. Lập trình cho bộ đếm ........................................................................................... 60 3.2.9. Lập trình ngắt timer ..................................................................................................... 62 3.2.10. Lập trình với bộ biến đổi A/D ................................................................................... 65 3.2.11. Lập trình giao tiếp máy tính ...................................................................................... 67 3.2.11.1. Chế độ thu phát .................................................................................................. 67 3.2.11.2. Giao thức (protocol) ........................................................................................... 68 3.2.11.3. Tốc độ truyền ..................................................................................................... 69 3.2.11.4. Bố trí chân của RS232 ........................................................................................ 69 3.2.11.5. Ghép nối 8051 với RS232 .................................................................................. 71 3.2.11.6. Lập trình truyền thông nối tiếp cho 8051 ........................................................... 71 3.2.11.7. Lập trình 8051 truyền dữ liệu nối tiếp ................................................................ 73 3.2.11.8. Lập trình 8051 nhận dữ liệu nối tiếp .................................................................. 73 3.2.11.9. Truyền dữ liệu bằng ngắt ................................................................................... 74 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 4 Chƣơng 1 TỔNG QUAN 1.1. Khái niệm Hình 1.1. Cấu trúc chung của vi xử lí, vi điều khiển - Vi xử lý: theo nghĩa rộng hơn chính là CPU, các khối chức năng nhƣ bộ nhớ và các thiết bị ngoại vi khác phải đƣợc ghép từ bên ngoài tới chíp vi xử lý để hình thành một bản mạch (board) vi xử lý hoàn chỉnh. Hệ thống đƣợc thực hiện theo cách này đƣợc gọi là máy vi tính một bản mạch (single board). Thí dụ 8085, 8086, 80486 và các vi xử lý. - Vi điều khiển: là thiết bị mà tất cả các khối chức năng (RAM, ROM, CPU) nằm bên trong một vi mạch đơn lẻ. Hay còn gọi là máy tính “đơn chíp”. - Bộ nhớ: là một phần của vi điều khiển, có chức năng lƣu trữ dữ liệu. - Đơn vị xử lý trung tâm: Khối này có chức năng thực hiện các phép tính số học, logic và di chuyển dữ liệu từ ô nhớ này tới ô nhớ khác. - BUS: Các đƣờng dẫn để di chuyển dữ liệu từ một khối này sang một khối khác đƣợc gọi là BUS. Về mặt vật lý, bus là một nhóm các đƣờng dẫn, thƣờng gồm 8, 16 đƣờng dẫn hoặc có thể nhiều hơn. Các bus chia làm 2 loại: bus địa chỉ và bus dữ liệu. bus địa chỉ bao gồm số đƣờng dẫn tƣơng ứng với dung lƣợng bộ nhớ mà ta muốn định địa chỉ. Bus dữ liệu có độ rộng bằng độ rộng dữ liệu, thƣờng vi điều khiển là 8 bit hoặc 8 đƣờng kết nối. - Khối vào ra: có chức năng giao tiếp với các thiết bị ngoại vi. - Chuyển đổi tƣơng tự sang số (ADC): Khối này có nhiệm vụ chuyển đổi thông tin dƣới dạng một vài giá trị tƣơng tự thành một số nhị phân và đƣa tới đơn vị xử lí trung tâm. - Chƣơng trình: Sử dụng các câu lệnh đƣợc sắp xếp theo một quy tắc chặt chẽ, nhằm truyền tải mong muốn của con ngƣời tới vi điều khiển. 1.2. Các dòng vi điều khiển phổ biến trên thị trƣờng - Họ vi điều khiển 8051 - Vi điều khiển PIC - Vi điều khiển AVR Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 5 1.3 Các hệ thống số 1.3.1. Hệ thống số thập phân Hệ đếm thập phân còn gọi là hệ đếm cơ số mƣời và nó đƣợc biểu diễn bởi 10 con số từ (0,1,2,3,4,5,6,7,8,9 ) những con số này đƣợc sử dụng rất nhiều trong khoa học kỹ thuật cũng nhƣ trong đời sống hàng ngày, khi biểu diễn số thập phân thì dứng sau dãy số thƣờng có chữ D. Ví dụ: Ba nghìn Chin trăm Bảy mƣơi Tám đƣợc biểu diễn nhƣ sau 3978 = 3x103 + 9x102 + 7x101 + 8x100 = 3000 + 900 + 70 + 8 1.3.2. Hệ thống số nhị phân Hệ đếm nhị phân còn gọi là hệ đếm cơ số hai và nó đƣợc biểu diễn bởi 2 con số là 0 và 1, trong kỹ thuật điện tử số thì số 0 gọi là mức logic thấp ứng với điện áp thấp, số 1gọi là mức logic cao tƣơng ứng với điện áp cao nhất. Mỗi ký hiệu 0 hoặc 1 đƣợc gọi là 1 Bit (Binary Digit), khi biểu diễn số nhị phân thì dứng sau dãy số phải có chữ B. Ví dụ: 1100b gọi là 1 nibble 1001 1001b gọi là 1 Byte 1010 1011 1100 1101b gọi là 1 Word Trong dãy số nhị phân đƣợc biểu diễn thì số nhị phân sát phải gọi là bít LSB còn số nhị phân sát trái gọi là bít MSB Số nhị phân thƣờng đƣợc biểu diễn ở 2 dạng là số nhị phân có dấu và số nhị phân không dấu, nếu số nhị phân không dấu sẽ chỉ biểu diễn các số không âm (0) còn số nhị phân có dấu thì biểu diễn đƣợc cả giá trị âm Ví dụ : (1101) = 1x2^3 + 1x2^2 + 0x2^1 + 1x2^0 = 8 + 4 + 0 + 1 = 13 Giải giá trị của các số có dấu 8 bit là: -128 đến 127 Giải giá trị của các số có dấu 16 bit là: -32768 đến 32767 Trong khi biểu diễn dãy số nhị phân có dấu thì ngƣời ta sử dụng bít MSB để quy ƣớc cho bít dấu, với bít 0 cho dãy số nhị phân dƣơng còn bít 1 cho dãy số nhị phân âm. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 6 1.3.3. Hệ thống số bát phân (BCD-Binary Coded Decimal) Số đếm BCD đƣợc định nghĩa là số thập phân nhƣng đƣợc biểu diễn dƣới dạng nhị phân 4 bít, nhƣng dãy số nhị phân 4 bít này khi quy sang hệ thập phân thì giá trị của nó phải  9 .Trong kỹ thuật điện tử nói chung thì mã BCD đƣợc sử dụng để giải mã hiển thị LED bảy thanh Ví dụ: (0011), (0100), (0101), (0110), (1001) ; đây gọi là số BCD không nén Ví dụ: (00110100), (01010110), (01111000) ; đây gọi là số BCD nén Dƣới đây là bảng các mã BCD Thập phân BCD 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Ví dụ: số 15 biểu diễn dƣới dạng BCD: 0001 0101 1.3.4. Hệ thống số thập lục (Hexadecimal) Hệ đếm thập phân còn gọi là hệ đếm cơ số mƣời sáu và nó đƣợc biểu diễn bởi 16 ký số (0,1,2,3,4,5,6,7,8,9,B,C,D,E,F) những con số này đƣợc sử dụng rất nhiều trong khoa học kỹ thuật đặc biệt là khoa học máy tính vì biểu diễn mã Hexa rất ngắn gọn, khi biểu diễn số thập lục phân thì sau dãy số phải có chữ H. Ví dụ: 3978h , 12CCh, 1998h, ABCDh, 2008h Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 7 1.3.5. Số bù hai Trong kỹ thuật Vi xử lý để biểu diễn một con số nào đó dƣới dạng dãy số nhị phân thì ngoài việc biểu diễn số không dấu, số có dấu thì ngƣời ta còn sử dụng cách biểu diễn số bù 2. Vậy số bù 2 sẽ biểu diễn nhƣ thế nào? Ví dụ: Hãy biểu diễn dãy số A = 10011001 sang số bù 2 của nó: b1: Tìm số bù 1 của A(bằng cách lấy bù tất cả các bit của A): 01100110 b2: Tìm số bù 2 của A (bằng cách lấy số bù 1 cộng cho 1) : 01100111 đến đây ta nhận thấy rằng số bù 2 của một số nào đó nó chính là số đối của nó và tổng =0 1.3.6. Các phép toán số học đối với hệ nhị phân 1.3.6.1. Phép cộng nhị phân không dấu Quy ƣớc: 0 + 0 = 0 0 + 1 = 1 1 + 1 = 0 nhớ 1 Ví dụ: Cho 2 số nhị phân nhƣ sau A = 10010011 ; B = 00111001 hãy tìm tổng Y của 2 số nhị phân đã cho 1.3.6.2. Phép trừ nhị phân Quy ƣớc: 0 – 0 = 0 0 – 1 = 1 mƣợn 1 1 – 0 = 1 1 – 1 = 0 Ví dụ : Cho 2 số nhị phân nhƣ sau A = 10010011 ; B = 00111001 hãy tìm hiệu Z của 2 số nhị phân đã cho (Lưu ý rằng phép trừ có thể thực hiện bằng cách biến thành phép cộng bằng cách cộng với số bù 2 ) 1.3.6.3. Phép nhân nhị phân Ví dụ : Cho 2 số nhị phân nhƣ sau A = 00100101 ; B = 00000100 hãy tìm tích F Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 8 Khi nhân 2 dãy số nhị phân với nhau thì ta đặt phép toán nhân giống nhƣ nhân số thập phân, kết quả của phép nhân 2 dãy số nhị phân 8 bít sẽ thu đƣợc dãy số nhị phân là 16 bít, nhƣ vậy ta có F = A*B = 0000000010010100b 1.3.6.4. Phép chia nhị phân Ví dụ : Cho 2 số nhị phân nhƣ sau A = 10010110 ; B = 00000100 hãy tìm thƣơng Khi chia 2 dãy số nhị phân với nhau thì ta đặt phép toán chia cũng giống nhƣ khi chia 2 số thập phân, kết quả của phép chia cũng nhƣ phần dƣ (nếu có) thu đƣợc tƣơng tự nhƣ khi làm phép chia đối với số thập phân, nhƣ vậy ta có M = A/B = 00100101b dƣ 0010b 1.3.7. Chuyển đổi qua lại giữa các hệ thống số 1.3.7.1. Chuyển đổi số thập phân sang nhị phân : Để chuyển đổi số thập phân sang số nhị phân ngƣời ta thƣờng dùng phƣơng pháp lấy số thập phân cần chuyển rồi chia 2 liên tiếp đến khi không thể chia đƣợc nữa thì dừng Ví dụ : Chuyển số thập phân 25 sang số nhị phân không dấu Chia 2 Thƣơng số Dƣ số 25/2 = 12 1 LSB 12/2 = 6 0 6/2 = 3 0 3/2 = 1 1 1/2 = 0 1 MSB Kết quả thu đƣợc là: 11001 với số dƣ lần thứ nhất là bít có trọng số nhỏ nhất 1.3.7.2. Chuyển đổi số nhị phân sang thập phân Để chuyển đổi số nhị phân sang số thập phân ngƣời ta thƣờng dùng phƣơng pháp lấy tổng của tích n các số nhị phân cần chuyển nhân với 20 đến 2N-1 hay theo biểu thức tổng quát nhƣ sau: A = B(N-1)* 2 (N-1) + B(N-2)* 2 (N-2) + B(N-3)* 2 (N-3) + + B(1)* 2 (1) + B(0)* 2 (0) Ví dụ : Chuyển số nhị phân không dấu 01011110b sang số thập phân A = 0*2 7 + 1*2 6 +0*2 5 + 1*2 4 + 1*2 3 + 1*2 2 + 1*2 1 + 0*2 0 = 94 nhƣ vậy ta có 01011110b = 94 1.3.7.3. Chuyển đổi số nhị phân sang Hexa : Ví dụ : Chuyển số nhị phân 1100101011111110 sang số hexa Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 9 Trƣớc hết ta chia số nhị phân đã cho thành các nhóm 4-bit tính từ bít có trọng số nhỏ nhất, sau đó thay thế mỗi nhóm 4-bit bằng ký hiệu hexa tƣơng ứng với nó ta sẽ thu đƣợc kết quả nhƣ sau: 1100 1010 1111 1110 Kết quả CAFEh C A F E 1.3.7.4. Chuyển đổi số Hexa sang nhị phân: Ví dụ : Chuyển số hexa 2F8h và ABBAh sang số nhị phân Tƣơng tự nhƣ trƣờng hợp trên ta sẽ thay thế mỗi ký hiệu hexa bằng 4-bit nhị phân tƣơng ứng với nó và ta sẽ thu đƣợc kết quả nhƣ sau: (tham khảo chuyển đổi nhị phân sang hexa). 1.3.7.5. Mã ASCII: (American Standard Code for Information Interchange ) Quá trình trao đổi thông tin trong máy tính nói chung cũng nhƣ quá trình xử lý thông tin của các bộ vi xử lý, tất cả các thông tin đều đƣợc biểu diễn dƣới dạng các số 0 và 1. Mỗi tổ hợp số 0 hoặc 1 đƣợc gán một ký tự chữ cái, chữ số hoặc một ký tự đặc biệt nào đó. Khi thông tin đƣợc truyền đi, đƣợc lƣu giữ trong bộ nhớ và hiển thị trên màn hình đều ở dƣới dạng ký tự và tuân theo một loại mã chuẩn đƣợc sử dụng rất rộng rãi gọi là mã ASCII. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 10 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 11 Chƣơng 2. CẤU TRÚC PHẦN CỨNG VÀ NGÔN NGỮ LẬP TRÌNH C 2.1 Cấu trúc phần cứng của vi điều khiển 8051 - Bộ vi điều khiển 8051 đƣợc Intel cho ra mắt năm 1981, bộ vi điều khiển này có 128 byte RAM, 4KB ROM, 2 bộ định thời, một cổng nối tiếp và 4 cổng 8 bít. Tất cả đều đƣợc tích hợp trên một chíp. - 8051 trở nên phổ biến sau khi Intel sau khi cho phép các nhà sản xuất khác sản xuất và bán bất kỳ dạng biến thể nào của 8051 với điều kiện phải để mã chƣơng trình tƣơng thích với 8051. Từ đó dẫn đến sự ra đời nhiều phiên bản của 8051 với tốc độ chíp và dung lƣợng bộ nhớ ROM. Hình 2.1: Sơ đồ khối bộ vi điều khiển 8051 Bảng 2.1: Đặc điểm kỹ thuật cơ bản của một số thành viên họ 8051 2.2. Sơ đồ chân - Các thành viên họ 8051 nhƣ 8751, 89C51, DS5000 đều có kiểu đóng vỏ khác nhau nhƣ: Dạng hai hàng chân DIP (Dual in – line pakage) Dạng vỏ dẹt vuông QFP (Quad Flat Pakage) Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 12 Dạng không có chân đỡ LLC (Leadless Chip Carrier) Tất cả đều có 40 chân với các chức năng, vào ra I/O. đọc RD, ghi WR, địa chỉ, dữ liệu và ngắt. Tuy nhiên, để đáp ứng các ứng dụng có yêu cầu hạn chế một số chíp đƣợc đóng gói 20 chân với số cổng vào ra ít hơn. Hình 2.2. Sơ đồ chân của vi điều khiển 8051. 2.2.1. Nhóm chân nguồn, dao động, điều khiển - Vcc chân 40 cung cấp điện áp +5V cho chíp. - GND chân số 20 nối với 0 V - XTAL1, XTAL2 hai chân dao động đƣợc nối nhƣ sau: Hình 2.3. Nối hai chân với nguồn dao động là thạch anh Hình 2.4. Nối hai chân với nguồn phát xung ngoài Chú ý: Khi nối với bộ phát xung ngoài, thì chân 18 (XTAL2) để hở. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 13 - RST khởi động lại (reset chân số 9): bình thƣờng chân này đƣợc nối với mass thông qua điện trở, khi có xung cao đặt tới chân này thì bộ VĐK sẽ kết thúc mọi hoạt động hiện tại và tiến hành khởi động lại. Hình 2.5. Mạch nối chân Reset - EA: (External Access chân 31) truy cập bộ nhớ ngoài: Đối với họ 8051 có ROM chƣơng trình trên chíp thì chân EA đƣợc nối với nguồn Vcc. Trƣờng hợp không có ROM trên chíp nhƣ 8031 hoặc 8032 thì mã chƣơng trình thì lƣu cất ở bộ nhớ ROM ngoài, khi đó chân EA đƣợc nối với mass. Nhƣ vậy, chân EA hoặc đƣợc nối với mass hoặc đƣợc nối với dƣơng nguồn, chứ không bao giờ để hở. Ví dụ: Xác định chu kỳ máy với a) XTAL = 11.059MHz b) XTAL = 16MHz. Giải: a) 11.059 MHz/12= 921.6kHz. Chu kỳ máy = 1/921.6Khz=1.085µs b) 16MHz/12 = 1.333MHz Chu kỳ máy = 1/1.333MHz =0.75 µs - PSEN (chân 29 – program store enable): là chân cho phép cất chƣơng trình, khi chƣơng trình đƣợc cất ở ROM ngoài thì chân này đƣợc nối tới chân OE của ROM. - ALE (chân 30- Address Latch Enable): là chân có mức tích cực cao, chân này đƣợc sử dụng để phân kênh địa chỉ và dữ liệu bằng cách nối tới chân G của chíp 74LS373. 2.2.2. Nhóm chân cổng vào ra - 4 chân P0, P1, P2, P3 đều có 8 chân và tạo thành cổng 8 bít, tất cả các cổng khi Reset thì đều đƣợc cấu hình làm cổng ra. Để làm đầu vào thì cần đƣợc lập trình. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 14 - Cổng P0: Bình thƣờng là cổng ra, để có thể vừa làm đầu ra vừa làm đầu vào thì mỗi chân phải nối với điện trở kéo 10K. Vì P0 có dạng cực máng hở. Hình 2.6: Cổng P0 luôn đƣợc nối với điện trở kéo khi làm cổng vào ra. Mặc định P0 là cổng ra, để cấu hình P0 là cổng vào thì phải ghi 1 tới tất cả các bít của cổng bằng câu lệnh: MOV P0,#0FFH Ngoài ra, khi nối 8051/31 tới bộ nhớ ngoài thì P0 cung cấp cả địa chỉ và dữ liệu bằng cách dồn kênh để tiết kiệm số chân. Chân ALE sẽ báo P0 có địa chỉ hay dữ liệu. Nếu ALE = 0 thì P0 cấp dữ liệu. - Cổng P1: Sử dụng làm cổng vào ra, không cần điện trở kéo nhƣ cổng P0. - Cổng P2: Sử dụng làm cổng vào ra giống nhƣ P1. Tuy nhiên ở 8031, khi truy cập 64 KB bộ nhớ ngoài cần có bus địa chỉ 16 bít, khi đó P0 cung cấp 8 địa chỉ bít thấp qua A0~A7, còn lại 8 bít địa chỉ cao A8~A15 do P2 cung cấp. - Cổng P3: Sử dụng làm cổng vào ra giống nhƣ P0, P1, P2. Ngoài ra P3 còn có một số chức năng quan trọng khác 2.3. Tổ chức không gian bộ nhớ 2.3.1. Bản đồ bộ nhớ ROM của 8051 - Do bộ đến chƣơng trình của 8051 là 16 bít nên không gian ROM tối đa có thể truy cập đƣợc là 64K. - Dải địa chỉ của ROM từ 0000h ~FFFFH, lệnh đầu tiên của ROM chƣơng trình đều đặt ở 0000H còn lệnh cuối cùng phụ thuộc vào dung lƣợng ROM trên chíp của mỗi thành viên họ 8051. - Ví dụ : Tìm địa chỉ bộ nhớ ROM của những thành viên họ 8051 sau đây. a) AT 8951 ( hoặc 8751 ) với 4k byte. b) DS 500032 với 32K byte. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 15 Giải: a) Với 4k byte không gian nhớ ROM trên chip, ta có 4096 byte bằng 1000H ở dạng Hexa ( 4 x 1024 = 4096D = 1000H ). Bộ nhớ này đƣuọc sắp xếp trong các ngăn nhớ từ 0000 đến 0FFFFH. Lƣu ý 0 luôn là ngăn nhớ đầu tiên. b) Với 32k byte ta có 32.768 byte, ( 32 x 1024). Chuyển 32.768 về số Hexa ta nhận đƣợc giá trị 8000H. Do vậy, không gian nhớ là dải từ 0000 đến 7FFFH. Hình 2.7: Bộ vi xử lý và bộ vi điều khiển. 2.3.2. Tổ chức không gian bộ nhớ RAM của 8051 1. 128 byte RAM thấp - Có đị chỉ từ 00~7FH và đƣợc chia thành các vùng sau: - Ngăn nhớ từ 00H~1FH tổng cộng là 32 byte, đƣợc dành làm các băng thanh ghi và ngăn xếp. - Ngăn nhớ từ 20H~2FH tổng cộng 16 byte đƣợc dùng làm bộ nhớ đọc ghi định địa chỉ đƣợc theo bit. - Ngăn nhớ từ 30H~7FH tổng cộng 80 byte đƣợc dùng để lƣu thông tin khi đọc và ghi và thƣờng đƣợc gọi là RAM bảng nháp Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 16 Hình 2.8: Tổ chức RAM của 8051  Băng thanh ghi của 8051: 32 byte này đƣợc chia làm 4 băng thanh ghi (0,1,2,3). Mỗi băng thanh ghi có 8 thanh ghi từ R0~R7 Hình 2.9: các băng thanh ghi và địa chỉ RAM 2. 128 byte RAM cao  Vùng không gian RAM này đƣợc dành cho các thanh ghi đặc biệt Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 17 Hình 2.9. 128 byte RAM cao 2.4. Thanh ghi - Thanh ghi của 8051 đƣợc dùng để lƣu tạm thời dữ liệu hoặc địa chỉ. Các thanh ghi này chủ yếu có dữ liệu 8 bít và 8051 cũng chỉ có một kiểu dữ liệu 8 bít. Các bít của thanh ghi đƣợc xắp xếp nhƣ hình sau: - Trong đó bít D7 là bít có trọng số cao nhất (MSB), bít D0 là bít có trọng số thấp nhất (LSB). Vì chỉ có một kiểu dữ liệu 8 bít, nên mọi dữ liệu lớn hơn 8 bít trƣớc khi xử lý đều đƣợc chia thành các phần 8 bít. 8051 có nhiều thanh ghi nhƣng ở đây chúng ta chỉ đề cập tới một số thanh ghi đa năng cơ bản sau Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 18 2.4.1. Thanh ghi tích luỹ A: - Là thanh ghi 8 bít đƣợc sử dụng để lƣu giữ liệu tạm thời, thƣờng đƣợc sử dụng trong các phép toán số học và logic. D7 D6 D5 D4 D3 D2 D1 D0 2.4.2. Thanh ghi từ trạng thái PSW (hay còn gọi là thanh ghi cờ) : - Là một thanh ghi 8 bít dùng để báo trạng thái của chƣơng trình 2.4.3. Thanh ghi điều khiển bộ đếm bộ định thời (TCON) Tên bít Vị trí bít Mô tả TF1 7 Cờ tràn T1, thiết lập và xóa bằng phần cứng Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 19 TR1 6 TR1 = 1 thì T1 chạy TR1 = 0 thì T1 dừng TF0 5 Cờ tràn T0, thiết lập và xóa bằng phần cứng TR0 4 TR0 = 1 thì T0 chạy TR0 = 0 thì T0 dừng IE1 3 Cờ ngắt ngoài 1, thiết lập và xóa bằng phần cứng IT1 2 IT1 = 1 kích hoạt ngắt ngoài 1 theo sƣờn xuống IT1 = 0 kích hoạt ngắt ngoài 1 theo mức thấp (mặc định) IE0 1 Cờ ngắt ngoài 0, thiết lập và xóa bằng phần cứng IT0 0 IT0 = 1 kích hoạt ngắt ngoài 0 theo sƣờn xuống IT0 = 0 kích hoạt ngắt ngoài 0 theo mức thấp (mặc định) 2.4.4. Thanh ghi điều khiển chế độ bộ định thời/bộ đếm (TMOD) T/C1 T/C0 GATE C/T M1 M0 GATE C/T M1 M0 - GATE = 1: T/Cx (x = 0, 1) chạy chỉ khi chân INTx là HIGHT. - GATE = 0: T/Cx (x = 0, 1) chạy chỉ khi TRx = 1. - C/T = 0: Chức năng định thời (timer) đƣợc chọn - C/T = 1: Chức năng đếm xung ngoài (counter) đƣợc chọn. - M1 M0: hai bít lựa chọn chế độ của bộ định thời M1 M0 Chế độ hoạt động 0 0 Bộ định thời 13 bít 0 1 Bộ định thời/bộ đếm 16 bít 1 0 Bộ định thời/bộ đếm 8 bit tự động nạp lại 1 1 Hai bộ định thời 8 bít Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 20 2.4.5. Thanh ghi cho phép ngắt IE EA - - ES ET1 EX1 ET0 EX0 - EA = 0: Không ngắt nào đƣợc chấp nhận - EA = 1: Mỗi nguồn ngắt đƣợc cho phép hoặc cấm một cách riêng biệt bằng cách thiết lập hoặc xóa bit tƣơng ứng đƣợc cho ra dƣới đây. ES: Bit cho phép ngắt truyền thông nối tiếp ET1: Bit cho phép ngắt T1 EX1: Bit cho phép ngắt ngoài 1 ET0: Bit cho phép ngắt T0 EX0: Bit cho phép ngắt ngoài 0 2.5. Ngôn ngữ lập trình C cho vi điều khiển 2.5.1. Cấu trúc một chƣơng trình trong C // khai báo thƣ viện #include #include //================================================ // Khai báo biến toàn cục unsigned char x,y; int z; long n = 0; //================================================= // khai báo và định nghĩa các hàm void HAM1 (void) { // viết các câu lệnh } //================================================= Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 21 void HAM2 (unsigned char x) { // viết các câu lệnh } //================================================== // Hàm chính bắt buộc chƣơng trình nào cũng phải có void main (void) { // viết các câu lệnh } 2.5.2. Lời chú thích - Nếu lời giải thích trên một dòng thì có thể dùng dấu: “//” - Nếu lời giải thích trên nhiều dòng thì có thể dùng dấu: mở đầu bằng /* và kết thúc bằng */ Ví dụ: /* - đây là chƣơng trình điều khiển LED đơn viết cho vi điều khiển - Sử dụng vi điều khiển 8051 */ 2.5.3. Các loại kiểu dữ liệu trong C Bảng 1: Các kiểu dữ liệu trong C. Tên kiểu dữ liệu (Data type) Số byte Khoảng dữ liệu (Range) char 1 –127 to 127 or 0 to 255 unsigned char 1 0 to 255 signed char 1 –127 to 127 int 2 –32,767 to 32,767 unsigned int 2 0 to 65,535 signed int 2 Nhƣ kiểu int short int 2 Nhƣ kiểu int unsigned short int 2 0 to 65,535 signed short int 2 Nhƣ kiểu short int long int 4 –2,147,483,647 to 2,147,483,647 signed long int 4 Nhƣ kiểu long int Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 22 Tên kiểu dữ liệu (Data type) Số byte Khoảng dữ liệu (Range) unsigned long int 4 0 to 4,294,967,295 long long int 8 –(263–1) to 263–1 (C99 only) signed long long int 8 same as long long int (C99 only) unsigned long long int 8 0 to 2 64–1 (C99 only) float 4 6 digits of precision double 8 10 digits of precision long double 12 10 digits of precision - Cách khai báo biến: Kiểu_dữ_liệu Tên_biến; Ví dụ: unsigned char x; hoặc unsigned char x =0; // khai báo cộng khởi tạo giá trị ban đầu - Cũng có thể khai báo nhiều biến cùng một kiểu dữ liệu trên một dòng: unsigned char x, y, z; - Ngoài ra để dùng cho vi điều khiển trình dịch chuyên dụng còn hỗ trợ các loại biến sau: Dạng biến Số bít Số byte Miền giá trị bit 1 0 0;1 sbit 1 0 0;1 sfr 8 1 0 đến 255 sf16 16 2 0 đến 65535 - sbit: Kiểu dữ liệu này đƣợc đƣa ra để dung cho họ 8051 và đƣợc dùng để khai báo một bít riêng lẻ bên trong SFR của họ 8051. Thí dụ, khi ta sử dụng kiểu dữ liệu này ta có thể truy nhập lên các bít riêng biệt của một cổng I/O. - ví dụ: sbit switch = P3^1; // biến switch đƣợc gán tới bít 3 của cổng 1. - sfr: kiểu dữ liệu này tƣơng tự với sbit nhƣng đƣợc sử dụng để khai báo các biến kiểu 8 bít. - ví du: sfr P1 = 0x09; // địa chỉ 0x90 đƣợc gán cho P1 Sfr P2 = 0xA0;// địa chỉ 0xA0 đƣợc gán cho P2 Unsigned char my_data; My_data = P1; P2 = my_data++; - sfr16: kiểu dữ liệu này tƣơng tự với sfr nhƣng đƣợc sử dụng để khai báo các biến 16 bit. Khi sử dụng kiểu dữ liệu này, byte thấp sẽ đi trƣớc byte cao. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 23 - thí dụ bộ định thời T2 của vi điều khiển 8052 sử dụng các địa chỉ 0xCC và 0xCD cho các byte thấp (LOW) và cao (HIGH). Ta có thể khai báo biến T2 để truy cập: - sfr16 T2 = 0xCC; // Timer 2, T2L = CC, T2H = CD - T2 = 0xAE01; // ghi giá trị 0xAE01 vào timer 1; 2.5.4. Các hàm trong C Có hai loại hàm trong C và có cấu trúc nhƣ sau: - Hàm trả lại giá trị Kiểu giá trị hàm trả lại Tên hàm (biến truyền vào hàm) { // các lệnh xử lý ở đây } Ví dụ: Unsigned int Cong (unsigned int x, unsigned int y, unsigned int z) { z = x + y; return z; } - Hàm không trả lại giá trị void Tên hàm (biến truyền vào hàm) { // } - Hàm có thể truyền vào biến hoặc không Ví dụ unsigned char TenHam(void) { //viết các câu lệnh trong than này } - Hàm có biến truyền vào void TenHam(unsigned char x) Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 24 { //viết các câu lệnh trong thân này } - Ngoài ra riêng cho vi điều khiển phần mềm KeilC còn có một hàm phụ phụ ngắt có cấu trúc nhƣ sau: void TenHam(void)interrupt Nguồn_Ngắt using băng_thanh_ghi { // viết các lệnh ở đây } - Chú ý: + Hàm ngắt không đƣợc phép trả lại giá trị hay truyền tham biến vào hàm + Tên hàm có thể đặt bất kỳ + interrupt là từ khóa chỉ hàm ngắt 2.5.5. Các toán tử Toán tử là những ký hiệu báo cho trình biên dịch các nhiệm vụ cần thực hiện, các bảng bên dƣới tóm tắt các toán tử C dùng cho lập trình: Bảng 1. Toán tử đại số Bảng 2. Toán tử truy cập và kích thước Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 25 Bảng 3. Toán tử logic và quan hệ Bảng 4. Toán tử thao tác bít Bảng 5. Các toán tử khác Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 26 2.5.6. Phép toán lấy địa chỉ biến (&) Bộ nhớ máy tính bao gồm nhiều byte đƣợc đánh số từ 0 tới giới hạn của bộ nhớ. Các số này đƣợc gọi là số thứ tự và cũng là địa chỉ của các byte bộ nhớ. Mỗi biến đƣợc khai báo sẽ chiếm giữ một vùng nào đó trong bộ nhớ và địa chỉ của nó là địa chỉ của byte đầu tiên trong vùng nhớ đó. Để xác định địa chỉ biến ngƣời ta sử dụng phép toán một ngôi & đặt trƣớc biến. Ví dụ: int I; &i; Xác định cho ta địa chỉ của vùng nhớ 2 byte có tên là i. Không thể sử dụng phép toán & này cho các đối tượng khác như hằng số, biểu thức. 2.5.7. Phép toán chuyển đổi kiểu (bắt buộc) Ta có thể chuyển đổi một kiểu bất kỳ sang kiểu mong muốn bằng cách dùng toán tử chuyển kiểu bắt buộc theo quy tắc nhƣ sau: () Trong đó có thể là tên của một kiểu dữ liệu nào đó đã đƣợc định nghĩa trƣớc nhƣ là int; float; char Ví dụ: long n = 2520.40; (int) n; Thì sau lệnh này n = 2520 Chuyển đổi kiểu tự động tuân thao sơ đồ sau: Char >>int>>long>>float>>double>>long double 2.5.8. Các định dạng Định dạng Áp dụng cho kiểu dữ liệu Ghi chú %d int Đối là một số nguyên %i int Đối đƣợc coi là hệ 10 có dấu (nếu giá trị âm) %o int Đối đƣợc coi là số nguyên hệ 8 không dấu %u int Đối là số nguyên không dấu %x int Đối là số nguyên hệ 16 không dấu (không có 0x đứng trƣớc) Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 27 %X int Số nguyên hệ 16 với các chữ số là A,B,C,D,E,F %e, %E float,double Đối số đƣợc chuyển sang dạng thập phân dấu chấm động %f, %lf float,double Đối số đƣợc chuyển sang dạng thập phân dẫu phẩy tĩnh %g, %G float,double Đối số đƣợc chuyển sang dạng thập phân dấu phẩy tĩnh hay động tùy thuộc vào loại nào ngắn hơn %c char Đối số là một ký tự %s char* Đối số là một xâu ký tự 2.5.9. Cấu trúc điều khiển 2.5.9.1. Cấu trúc rẽ nhánh If (điều kiện) { Statement1; Statement2; } f (điều kiện) { Statement1; Statement2; }else { Statement1; Statement2; } 2.5.9.2. Cấu trúc lựa chọn switch switch(biến) { Case giá_trị_1: {//các câu lệnh; break;} Case giá_trị_2: {//các câu lệnh; break;} Case giá_trị_3: {//các câu lệnh; break;} case: giá_trị_n {//các câu lệnh; break;} } Hoạt động của cấu trúc này nhƣ sau: tùy vào giá trị của biến là:giá_trị_1 hay giá_trị_2thì thực hiện các câu lệnh tƣơng ứng sau đó thoát nhờ lệnh break; Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 28 2.5.9.3. Vòng lặp có hạn for for (i=giá_trị_ban_đầu; i<giá_trị_số_lần_lặp; i++) { //viết các câu lệnh ở đây } 2.5.9.4. Vòng lặp không xác định while While (điều_kiện) { // Viết các câu lệnh ở đây } - Hoạt động nhƣ sau: nếu điều kiện đúng thì thực hiện các câu lệnh trong than vòng while, còn nếu điều kiện sai thì bỏ qua vòng lặp. 2.5.9.5. Một số thƣ viện chuẩn của C tệp *.h Giải thích chứa những gì Các hàm nguyên mẫu và các thông tin liên quan của các hàm thƣ viện vào/ra chuẩn của C++ (cout, cin) Các macro và thông tin trợ giúp lập trình debbug Các hàm nguyên mẫu của các hàm kiểm tra một số thuộc tính của các kí tự, hay chuyển kí tự giữa chữ hoa và chữ thƣờng Các macro hiển thị các thông tin về lỗi Các giới hạn của số dấu phẩy động của hệ thống Các giới hạn của hệ thống Các hàm và các thông tin liên quan đến việc thay đổi ngôn ngữ và mã nƣớc của chƣơng trình đang chạy Các hàm nguyên mẫu của các hàm thƣ viện toán học Các hàm nguyên mẫu của các hàm cho phép bỏ qua lời gọi hàm thông thƣờng và trả quyền điều khiển lại một vị trí khác Các hàm nguyên mẫu và các macro điều khiển các điều kiện khác nhau có thể xuất hiện trong quá trình thực hiện chƣơng trình Định nghĩa các macro làm việc với danh sách các tham số đối với những hàm mà số lƣợng và kiểu của tham số là không biết Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 29 Định nghĩa các kiểu chung dùng để thực hiện tính toán Các hàm nguyên mẫu và các thông tin liên quan của các hàm thƣ viện vào/ra chuẩn (printf, scanf) Các hàm nguyên mẫu và các thông tin liên quan của các hàm chuyển kiểu, cung cấp bộ nhớ, tạo số ngẫu nhiên ... Các hàm nguyên mẫu của các hàm xử lý xâu Các hàm nguyên mẫu và kiểu dữ liệu cho thao tác thời gian 2.5.9.6. Các từ khóa trong C auto break case union char while continue default do double else unsigned extern typedef float for goto sizeof if int static long struct void register return short signed switch 2.5.9.10. con trỏ và mảng 1. Mảng a. Khái niệm Mảng (array) là một dãy liên tiếp các phần tử trong bộ nhớ, mỗi phần tử chứa dữ liệu cùng một kiểu. Một mảng số nguyên gồm các phần tử là các biến số nguyên. Kích thƣớc của mảng chính là số các phần tử trong mảng. Kích thƣớc này phải đƣợc khai báo tƣờng minh trong phần khai báo mảng vì nó xác định vị trí và kích thƣớc của vùng nhớ trong bộ nhớ trong đƣợc cấp phát cho mảng b. Khai báo mảng [kích_thước_mảng]; Ví dụ: int ti[7]; Hoặc: int ti[7] ={1,2,3,4,5,6,7}; c. Truy cập vào các phần tử của mảng Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 30 Mỗi phần tử mảng đƣợc truy cập thông qua tên biến mảng và chỉ số tƣơng ứng, phần tử đầu tiên có chỉ số là 0 Ví dụ int ti[7]; ti[0]- là phần tử đầu tiên ti[1]- là phần tử thứ 2 ti[2]- là phần tử thứ 3 Và ta có thể gán cho từng phần tử của mảng một giá trị ti[1] =5; d. Mảng nhiều chiều - Khai báo float tb[10][20]; ví dụ: int t2i[3,4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 2. Xâu ký tự a. Khai báo xâu ký tự Một biến xâu ký tự đƣợc khai báo tƣơng tự nhƣ một mảng một chiều chứa các ký tự. char str[10]; - Khai báo xâu ký tự char str[6]=”abc”; hoặc str[6]=(„a‟,‟b‟,‟c‟); sự khác biệt giữa mảng ký tự và xâu ký tự là trong xâu ký tự có ký tự kết thúc NUL hay „\0‟. Đây là các căn cứ của các thao tác xâu nhƣ: tính chiều dài, cộng xâu Một biến xâu ký tự muốn có chiều dài 9 phải đƣợc khai báo nhƣ một mảng ký tự có 10 phần tử str[0] „a‟ str[1] „b‟ str[2] „c‟ str[3] „d‟ str[4] „e‟ str[5] „f‟ Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 31 str[6] „g‟ str[7] „h‟ str[8] „\0‟ str[9] Trong hình vẽ trên, các ký tự str[8], str[9] không có vai trò gì trong các thao tác trên xâu str. Cần phân biệt giữa ký tự và xâu ký tự chứa một ký tự, ví dụ „A‟ là ký tự „A‟ đƣợc mã hóa bằng 1 byte, trong khi “A” là một xâu ký tự chứa ký tự „A‟ xâu này đƣợc mã hóa bằng 2 byte cho ký tự „A‟ và ký tự „\0‟ Trong C không tồn tại các phép toán so sánh, gán nội dung của xâu này cho xâu khác. 3. Con trỏ (pointer) a. Khái niệm Một con trỏ là một biến/hằng có giá trị (nội dung) là địa chỉ của một đối tƣợng khác; đối tƣợng ở đây có thể là một biến hoặc một hàm mà không thể là một hằng. - Khai báo một biến con trỏ theo mẫu sau: Kiểu_dữ_liệu *Tên_con_trỏ; Ví dụ: int *pi, qi; b. Toán tử & và * - Toán tử một ngôi & cho ta địa chỉ của một biến, còn biến con trỏ có giá trị là địa chỉ của một biến, nhƣ vậy: int n, *pi; pi=&n; là hợp lệ, nó gán địa chỉ của biến nguyên n cho con trỏ nguyên pi. Khi đó ta có thể nói rằng pi chỏ đến n. - Nhƣ vậy, khi pi chỉ đến n ta sẽ có 2 cách để mô tả giá trị của n hoặc trực tiếp bằng tên của biến nhƣ truyền thống hoặc bằng toán tử một ngôi * lên biến pi. Ví dụ: *pi=3; // có tác dụng gán giá trị 3 cho biến n *pi = *pi+10;//thì thêm 10 vào n m = *pi + 10; *pi +=1; ++*pi; (*pi)++;// Dấu ngoặc bắt buộc phải có nếu không có nghĩa là chúng ta tăng giá trị của pi chứ không phải giá trị của đối tượng mà pi trỏ tới. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 32 c. Các phép toán trên con trỏ - Phép gán trên hai con trỏ cùng kiểu - Chỉ có thể gán địa chỉ một biến nguyên cho một con trỏ nguyên, cũng vậy không thể gán giá trị của một con trỏ nguyên cho một con trỏ thực. qi=pi;//pi,qi xác định cùng một biến n như vậy *pi,*qi,n là một pf=&n; hoặc pf=pi;// là không hợp lệ vì khác kiểu - Tuy nhiên ta có thể sử dụng phƣơng pháp chuyển đổi kiểu pf=(float*)&m; pf=(float*)pi; - Phép cộng con trỏ với số nguyên - m,n,p là ba biến nguyên khai báo lien tiếp nhau. Khi đó m,n,p sẽ tƣơng ứng với 3 vùng nhớ 2 byte liên tiếp nhau. Và con trỏ pi trỏ đến biến n. - Phép cộng con trỏ pi+1 sẽ cho ta địa chỉ của số nguyên m đi ngay trƣớc còn pi+(-1) cho ta địa chỉ của số nguyên p đi liền sau . - Việc cộng trừ một con trỏ với một số nguyên có ý nghĩa trực quan nhƣ sau: nếu ta so sánh con trỏ với địa chỉ các ngôi nhà trên một con đƣờng, mỗi ngôi nhà là một biến có địa chỉ nào đó thì các địa chỉ này đƣợc đánh số tăng dần theo một chiều nhất định. Biết địa chỉ của nhà này, ta có thể tính đƣợc địa chỉ của nhà bên cạnh bằng cách cộng hoặc trừ 1. Điều đó có nghĩa là khi cộng hoặc trừ con trỏ với một số nguyên n ta sẽ đƣợc một địa chỉ mới chỉ đến một biến khác nằm cách biến trƣớc đó n vị trí. 4. Liên hệ giữa con trỏ và mảng a. Con trỏ và mảng một chiều - Xét chỉ thị int a[10]; - khai báo này sẽ xin cấp phát một vùng nhớ 10 số nguyên a[0], a[1], có địa chỉ xác định bởi a. Vậy a chính là địa chỉ của biến nguyên a[0], do vậy nếu pi là một con trỏ nguyên thì phép gán sau đây là hợp lệ: pi=a; - Nhƣ vậy sau phép gán này ta có thể sử dụng pi nhƣ một tên mảng: pi[0], pi[1], tƣơng ứng là a[0], a[1], b. Con trỏ đa cấp và mảng nhiều chiều int **ppi; int a2[10][10]; Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 33 - Ta có thể thực hiện phép gán ppi=a2; 2.6. Thuật toán và lƣu đồ thuật toán 2.6.1. Khái niệm Thuật toán, còn gọi là giải thuật là một khái niệm cơ sở của Toán học và Tin học. Hiểu một cách đơn giản, thuật toán là một tập hợp các hƣớng dẫn nhằm thực hiện một công việc nào đó. Đối với việc giải quyết một vấn đề - bài toán thì thuật toán có thể hiểu là một tập hữu hạn các hƣớng dẫn rõ ràng để ngƣời giải toán có thể theo đó mà giải quyết đƣợc vấn đề. Nhƣ vậy, thuật toán là một phƣơng pháp thể hiện lời giải của vấn đề - bài toán Việc nghiên cứu về thuật toán có vai trò rất quan trọng trong khoa học máy tính vì máy tính chỉ giải quyết đƣợc vấn đề khi đã có hƣớng dẫn giải rõ ràng và đúng. Nếu hƣớng dẫn giải sai hoặc không rõ ràng thì máy tính không thể giải đúng đƣợc bài toán. Trong khoa học máy tính, thuật toán đƣợc định nghĩa là một dãy hữu hạn các bước không mập mờ và có thể thực thi được, quá trình hành động theo các bước này phải dừng và cho được kết quả như mong muốn 2.6.2. Biểu diễn thuật toán bằng sơ đồ khối Sơ đồ khối (còn gọi là lƣu đồ) là một hình ảnh minh họa cho giải thuật. Nó vẽ ra biểu đồ của luồng chỉ thị hay những hoạt động trong một tiến trình. Mỗi hoạt động nhƣ vậy đƣợc biểu diễn qua những ký hiệu. Các quy ƣớc của lƣu đồ thuật toán: + Bắt đầu và kết thúc + Đƣờng hƣớng diễn tiến: + Khối công việc tuần tự: + Khối nhập/xuất dữ liệu: Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 34 + Khối rẽ nhánh + Lời gọi chƣơng trình con + Ví dụ: Xây dựng lƣu đồ thuật toán cho bài toán tính tổng 2 số tự nhiên đƣợc nhập từ bàn phím, sau đó in kết quả ra màn hình CHƢƠNG 3. LẬP TRÌNH ỨNG DỤNG 3.1. Các bƣớc tạo một Project mới Bƣớc 1: Tạo project mới Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 35 Bƣớc 2: Đặt tên bài tập Bƣớc 3: Chọn linh kiện Chọn AT89C51 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 36 Bƣớc 5: Chọn No Bƣớc 6 Bƣớc 7 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 37 Bƣớc 8: Dat tên file (file_name.c) bắt buộc phải có đuôi mở rộng “.c” Bƣớc 9: Kích chuột phải vào “Source Group1 – chọn Add files...” nhƣ hình dƣới Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 38 Bƣớc 10: Bƣớc 11 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 39 Bƣớc 12 Bƣớc 13 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 40 Bƣớc 14 : Nhấn F7 để dịch ra file Hex là xong 3.2. Lập trình ứng dụng. 3.2.1. Chƣơng trình tạo trễ void delay (long time) { long count; for (count =0; count <time; count <++) {}; // khong lam gi } 3.2.2. Ứng dụng điều khiển LED đơn Lập trình điều khiển LED đơn nối tới chân P2.0 sáng/tắt. Quá trình này được lặp đi lặp lại. #include #define SANG 1 #define TAT 0 sbit LED = P2^0; // khai bao bien // chuong trinh con tao tre void delay (long time) { long count; Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 41 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW for (count =0; count ++; count < time) {}; // khong lam gi } // Chuong trinh chinh void main (void) { while(1)// vong lap vo han { LED = SANG; delay(1000000); LED = TAT; delay(1000000); } } 3.2.3. Ứng dụng điều khiển 8 LED đơn Lập trình điều khiển 8 LED đơn sang theo quy luật từ D1 đến D8. D1 D2 D3 D4 D5 D6 D7 D8 D 1 D 2 D 3 D 4 D 5 D 6 D 7 D 8 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW D2 LED-YELLOW D3 LED-YELLOW D4 LED-YELLOW D5 LED-YELLOW D6 ED-YELLOW D7 LED-YELLOW D8 LED-YELLOW Sử dụng chương trình con: #include #define SANG 1 #define TAT 0 sbit LED1 = P2^0; // khai bao bien sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3; // Tat ta cac lED void Off_LED(void) { LED1 = TAT; LED2 = TAT; LED3 = TAT; LED4 = TAT; Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 42 sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7; // chuong trinh con tao tre void delay (long time) { long count; for (count =0; count<time; count++) {}; // khong lam gi } //CTC LED 1 sang void D1 (void) { LED1 = SANG; } //CTC LED 2 sang void D2 (void) { LED2 = SANG; } //CTC LED 3 sang void D3 (void) { LED3 = SANG; } //CTC LED 4 sang void D4 (void) { LED4 = SANG; } //CTC LED 5 sang void D5 (void) { LED5 = SANG; } //CTC LED 6 sang void D6 (void) { LED6 = SANG; } //CTC LED 7 sang void D7 (void) { LED7 = SANG; } //CTC LED 8 sang void D8 (void) { LED8 = SANG; } LED5 = TAT; LED6 = TAT; LED7 = TAT; LED8 = TAT; } // Chuong trinh chinh void main (void) { while(1)// vong lap vo han { Off_LED(); delay(1000000); D1(); delay(1000000); D2(); delay(1000000); D3(); delay(1000000); D4(); delay(1000000); D5(); delay(1000000); D6(); delay(1000000); D7(); delay(1000000); D8(); delay(1000000); } } Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 43 Sử dụng khai báo mảng giá trị: #include unsigned char LED_array[8] = {1,2,4,8,16,32,64,128}; void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh chinh main() { unsigned char i = 1; while(1)// vong lap vo han { for(i=0;i<8;i++) { P2 = LED_array[i]; delay(5000); } } } 3.2.4. Ứng dụng điều khiển LED 7 thanh Hình. Sơ đồ chân và hình dạng thực tế củaLed 7seg. Led 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình số 8 và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dƣới, bên phải của led 7 đoạn. Tám led đơn trên led 7 đoạn có Anode (cực +) hoặc Cathode (cực -) đƣợc nối chung với nhau vào một điểm, đƣợc đƣa chân ra ngoài để kết nối với mạch điện. Tám cực còn lại trên mỗi led đơn đƣợc đƣa thành 8 chân riêng, cũng đƣợc đƣa ra ngoài để kết nối với mạch điện. Nếu led 7 đoạn có Anode(cực +) chung, đầu chung này đƣợc nối với +Vcc, các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 0. Nếu led 7 đoạn có Cathode (cực -) chung, đầu chung này đƣợc nối xuống Ground (hay Mass), các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 1. Giả sử khi cấp nguồn cho chân nào thì đoạn tƣơng ứng với chân đó sáng ví dụ nhƣ nếu đƣa chân A lên mức logic 1 thì đoạn A sáng (mức logic 1 tƣơng ứng với mức điện áp cao). Nếu cấp nguồn cho E và F thì đoạn E F sáng tạo thành số 1. Nếu làm tƣơng tự với số 2 thì mức logic tƣơng ứng ABCDEFG là 1101101 số 3 là 1111001 và số 4 là 0110011. Các số còn lại làm tƣơng tự ta sẽ có led hiển thị đƣợc các số từ 0 đến 7. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 44 Hình 2.11. Hình dạng thực tế của Led 7seg 4 số Bảng 2.3.Mã hiện thị led 7 đoạn Anot chung. Số hiển thị trên led 7 seg Mã hiển thị led 7 seg dạng nhị phân Mã hiển thị led 7 seg dạng thập lục phân 0 11000000 C0 1 11111001 F9 2 10100100 A4 3 10110000 B0 4 10011001 99 5 10010010 92 6 11000010 82 7 11111000 F8 8 10000000 80 9 10010000 90 A 10001000 88 B 10000011 83 C 11000110 C6 D 10100001 A1 E 10000110 86 F 10001110 8E - 10111111 BF Phương án 1: sử dụng IC giải mã LED 7 thanh 74LS47 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 45 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 A 7 QA 13 B 1 QB 12 C 2 QC 11 D 6 QD 10 BI/RBO 4 QE 9 RBI 5 QF 15 LT 3 QG 14 U2 74LS47 #include unsigned char LED_array[9] = {1,2,3,4,5,6,7,8,9}; void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh chinh main() { unsigned char i = 1; while(1)// vong lap vo han { for(i=0;i<10;i++) { P2 = LED_array[i]; delay(5000); } } } Phương án 2: Không sử dụng mạch IC giải mã Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 46 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 #include unsigned char LED_array[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh chinh main() { unsigned char i = 1; while(1)// vong lap vo han { for(i=0;i<+10;i++) { P2 = LED_array[i]; delay(5000); } Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 47 } } 3.2.5. Ứng dụng điều khiển LED ma trận Hình 2.9. Cấu tạo và hình dạng thực tế của Led matrix. Dựa trên nguyên tắc nhƣ quét màn hình, có thể thực hiện việc hiển thị ma trận đèn bằng cách quét theo hàng và quét theo cột. Mỗi Led trên ma trận Led có thể coi nhƣ một điểm ảnh. Điểm ảnh này sẽ đƣợc xác định trạng thái nhờ dữ liệu đƣa ra từ bộ vi điều khiển Atmega16. Một ma trận Led 8x8 đơn sắc bao gồm 64 điểm sáng đƣợc bố trí thành 8 hàng x 8 cột. Còn led đa sắc chia thành các loại 3 màu (24 chân) 7 màu (32 chân) trong đó mỗi điểm sáng gồm một Led màu xanh lục + một Led màu đỏ. Điểm sáng hiển thị màu xanh nếu Led đỏ tắt, màu đỏ nếu Led xanh tắt, màu vàng nếu cả hai Led sáng và tắt nếu cả hai Led cùng tắt.Trong cùng một hàng, các catot của các Led màu xanh đƣợc nối với nhau để tạo thành một đƣờng dây hàng thứ nhất và các catot của các Led màu đỏ đƣợc nối với nhau để tạo thành một đƣờng dây thứ hai. Các anot của mƣời sáu Led trong cùng một cột đƣợc nối với nhau để tạo thành một đƣờng dây cột. Nhƣ vậy muốn một Led trong ma trận sáng ta cần cấp nguồn cho Led vào dƣờng dây hàng và đƣờng dây cột tƣơng ứng với Led đó. - Ví du: Lập trình hiển thị số 4 trên LED ma trân 8x8 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 48 C0 C1 C2 C3 C4 H0 H1 H2 H3 H4 H5 H6 H7 C5 C6 C7 C 0 C 1 C 2 C 3 C 4 C 5 C 6 C 7 H 0 H 1 H 2 H 3 H 4 H 5 H 6 H 7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 #include unsigned char LED_array[8] = { 0x30,0x28,0x24,0x22,0x21,0xFF,0x20,0x20 };// so 4 unsigned char control_LED[8]={1,2,4,8,16,32,64,128}; void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh chinh main() { unsigned char i; while(1)// vong lap vo han { for(i=0;i<8;i++) { P2 = control_LED[i]; P3 = LED_array[i]; delay(100); } } } 3.2.6. Ứng dụng sử dụng nút nhấn Bàn phím đƣợc sử dụng trong rất nhiều các thiết bị, để giúp ngƣời sử dụng lựa chọncácchức năng của thiết bị. Có thể nói giao tiếp bàn phím là một ứng dụng khá quan trọng. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 49 Phím bấm thông dụng nhất có cấu tạo gồm 2 đầu tiếp xúc, mỗi khi chúng ta bấm phím, 2 đầu này sẽ chạm vào nhau (xem hình vẽ ở bên dƣới). Ngoài ra còn nhiều loại phím bấm khác, và cấu tạo cũng khác, có thể là phím bấm thƣờng đóng, khi ta bấm phím thì 2 đầu tiếp xúc không thông nhau. Hoặc cũng có loại phím bấm cảm ứng, dựa trên sự thay đổi điện trở của màng điện trở, hoặc dựa trên sự thay đổi điện dung hay điện cảm mỗi khi có tay ngƣời chạm vào. Hình 2.17. Hình dạng thực tế của phím bấm - Ví dụ 1: lập trình đếm số lần nhấn nút và hiển thị ra cổng P2. Nút nhấn nối tới chân P1.0 D0 D1 D2 D3 D4 D5 D6 D7 D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW D2 ED-YELLOW D3 ED-YELLOW D4 ED-YELLOW D5 ED-YELLOW D6 ED-YELLOW D7 ED-YELLOW D8 ED-YELLOW #include unsigned char k,i; // chuong trinh con tao tre void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh con kiem tra phim unsigned char button (void) { if(P1_0 == 0) { delay(200); // khu nhieu Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 50 while(P1_0==0) {};//khong lam gi, doi nha phim i++; } return i; } // Chuong trinh chinh main() { P1 =0xff;// P1 lam cong vao P2 = 0x00; while(1)// vong lap vo han { P2 = button(); } } - Ví dụ 2: Đếm số lần nhấn nút và hiển thị ra cổng P2( Sử dụng cấu trúc Case) XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 #include unsigned char k,i; // chuong trinh con tao tre void delay(long time) { long count; for(count=0;count<time;count++) {}; } // Chuong trinh con kiem tra phim Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 51 unsigned char button (void) { if(P1_0 == 0) { delay(200); // khu nhieu while(P1_0==0) {};//khong lam gi, doi nha phim i++; if(i>8) {i = 0;} } return i; } // Chuong trinh chinh main() { P1 =0xff;// P1 lam cong vao P2 = 0x00; while(1)// vong lap vo han { k = button(); switch (k) { case 1: {P2 = 1; break;} case 2: {P2 = 2; break;} case 3: {P2 = 3; break;} case 4: {P2 = 4; break;} case 5: {P2 = 5; break;} case 6: {P2 = 6; break;} case 7: {P2 = 7; break;} case 8: {P2 = 8; break;} } } } 3.2.7 Ứng dụng sử dụng ngắt ngoài - Ngắt là sự xảy ra của một điều kiện- một sự kiện- làm cho chƣơng trình hiện hành bị tạm ngƣng trong khi điều kiện đƣợc phục vụ bởi một chƣơng trình khác. Các ngắt đóng vai trò quan trọng trong việc thiết kế và hiện thực các ứng dụng của bộ vi điều khiển. Các ngắt cho phép hệ thống đáp ứng mộ sự kiện theo cách không đồng bộ và sử lý sự kiện trong khi 1 chƣơng trình khác đag thực thi. Một hệ thống đƣợc điều khiển bởi ngắt cho ta ảo tƣởng đang làm việc đồng thời. Mỗi ngắt luôn có một trình phục vụ ngắt. Khi một ngắt đƣợc kích hoạt thì bộ vi điều khiển chạy trình phục vụ ngắt. trình phục vụ ngắt của mỗi ngắt có một vị trí cố định trong bộ nhớ địa chỉ ISR. Tập hợp các ô nhơ lƣu giữ địa chỉ của tất cả các ISR đƣợc gọi là bảng vector ngắt: Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 52 Ngắt Địa chỉ ROM ( hexa ) Chân RESET 0000 9 Ngắt phần cứng ngoài ( INT0 ) 0003 12 ( P3.2) Ngắt bộ Timer 0 ( TF0 ) 000B Ngắt phần cứng ngoài 1 ( INT1 ) 0013 13 ( P3.3 ) Ngắt bộ Timer 1 ( TF1 ) 001B Ngắt COM nối tiếp ( RI và TI ) 0023 - Thanh ghi cho phép ngắt IE: có chức năng cho phép hay cấm ngắt thực hiện. Thanh ghi IE là thanh ghi định địa chỉ bít. - Các bước thực hiện ngắt - Bước 1: bít EA = 1. - Bước 2: Muốn thực hiện ngắt nào thì tương ứng cho bít của ngắt đó trong thanh ghi IE lên bằng 1. - Để kích hoạt ngắt ngoài theo sườn xuống của tín hiệu đầu vào, thiết lập IT1 = 1 cho ngắt ngoài 1; IT0 = 1 cho ngắt ngoài 0. - Cấu trúc chƣơng trình ngắt sử dụng trong lập trình C Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 53 Void INT_0 ()interrupt 0 { ; write code here } Void INT_1 ()interrupt 2 { ; write code here } - Ví dụ: đếm số lần nhấn nút và hiển thị ra cổng P2, sử dụng ngắt ngoài 0. D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 D0 D1 D2 D3 D4 D5 D6 D7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW D2 LED-YELLOW D3 ED-YELLOW D4 ED-YELLOW D5 ED-YELLOW D6 LED-YELLOW D7 ED-YELLOW D8 ED-YELLOW #include unsigned char count; // chuong trinh con su dung ngat ngoai 0 void INT_0 (void) interrupt 0 { count++; P2 = count; } // Chuong trinh chinh main() { P2 = 0; P3=0xff;// thiet lap P3 lam cong vao // thiet lap ngat EX0 =1; // cho phep ngat ngoai 0 IT0 = 1; // Ngat ngoai theo suon xuong EA = 1; // Cho phep thuc hien ngat while(1)// vong lap vo han { // cho ngat } } Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 54 - Ví dụ 2: Tạo xung vuông trên chân P1_0, đồng thời sử dụng ngắt ngoài 1 đếm số lần nhấn nút và hiển thị ra cổng P2 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 D0 D1 D2 D3 D4 D5 D6 D7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW D2 LED-YELLOW D3 ED-YELLOW D4 ED-YELLOW D5 ED-YELLOW D6 LED-YELLOW D7 ED-YELLOW D8 ED-YELLOW D9 LED-YELLOW #include unsigned char count; // Chuong trinh con tao tre void delay (long time) { long k; for(k = 0; k < time; k++) {}; //Khong lam gi } // chuong trinh con su dung ngat ngoai 0 void INT_1 (void) interrupt 2 { count++; P2 = count; } //Chuong trinh khai bao su dung ngat ngoai 1 INT1 void init_INT1() { EX1 =1; // cho phep ngat ngoai 1 IT1 = 1; // Ngat ngoai theo suon xuong EA = 1; // Cho phep thuc hien ngat } // Tao xung ra cong P1_0 void pulse () { P1_0 = ~P1_0; delay(5000); } // Chuong trinh chinh main() Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 55 { P2 = 0; P3=0xff;// thiet lap P3 lam cong vao // thiet lap ngat init_INT1(); while(1)// vong lap vo han { pulse(); } } 3.2.8. Lập trình cho Timer 3.2.8.1. Các thanh ghi cơ sở của bộ định thời - Thanh ghi của bộ timer0 , timer 1 Hình Thanh ghi của bộ định thời Timer0, Timer 1 Đây là thanh ghi 16 bít đƣợc chia làm hai byte TLx, THx. Các thanh ghi này đƣợc truy cập và đƣợc đọc độc lập. - Thanh ghi chế độ của bộ định thời TMOD: là thanh ghi dùng để thiết lập chế độ của bộ định thời Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 56 - Bít C/T: dùng để xác định bộ định thời đƣợc sử dụng làm bộ tạo trễ hay bộ đếm sự kiện. Nếu C/T = 0 thì đó là bộ tạo trễ; còn nếu C/T = 1 thì đó là bộ đếm sự kiện. - Bít GATE = 0 cho phép dừng và khởi động bộ định thời bằng phần mềm, với hai câu lệnh SETB TRx ; CLR TRx – (khởi động; dừng bộ định thời). - GATE = 1: Khởi động và dừng bộ định thời từ phần cứng bên ngoài. - Thanh ghi TCON: Ví dụ 1: Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 57 Ví dụ 2: 3.2.8.2. Lập trình cho timer ở chế độ 1 Hình Họat động của Timer ở chế độ 1 - Cách tính thời gian trễ của Timer Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 58 - Ví dụ: Lập trình tạo xung vuông trên chân P1_0, sử dụng T1 chế độ 1 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D9 LED-YELLOW #include //Khai bao su dung timer1 che do 1 void init_T1_M1 () { TMOD = 0x10; //Timer 1 che do 1 } // Delay du dung timer void delay () { TL1 = 0; TH1 = 0; TR1 = 1; // Chay timer 1 while(!TF1) {};// khong lam gi TF1 = 0;// xoa co tran TR1 = 0; // Dung bo dinh thoi } // Chuong trinh chinh main() { init_T1_M1(); while(1)// vong lap vo han { Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 59 P1_0 = ~P1_0; delay(); } } 3.2.8.3. Lập trình cho Timer ở chế độ 2 Đặc chƣng của chế độ 2: - Là bộ định thời 8 bít, do vậy chỉ cho phép các giá trị từ 00h đến FFh đƣợc nạp vào thanh ghi TH của bộ định thời. - Sau khi TH đƣợc nạp thì 8051 sao nội dung đó vào TL. - Sau khi đƣợc khởi động thì bộ định thời bắt đầu đếm tăng bằng cách tăng thanh ghi TL, cho tới khi đạt giá trị FF. Khi quay vòng từ FFh trở về 00h thì cờ bộ định thời TF đƣợc thiết lập (TF0, TF1) tƣơng ứng với bộ định thời Timer0 hoặc Timer1. - Khi cờ TF đƣợc bật lên 1 thì thanh ghi TL đƣợc tự động nạp lại với giá trị ban đầu đƣợc giữ ở thanh ghi TH. Các bƣớc lập trình với chế độ 2: - Ví dụ: tạo xung vuông trên chân P1_0, su dụng timer 0 chế độ 2. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 60 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D9 LED-YELLOW #include //Khai bao su dung timer0 che do 2 void init_T0_M2 () { TMOD = 0x02; //Timer 0 che do 2 TL0 = 0; } // Delay du dung timer void delay () { TR0 = 1; // Chay timer 0 while(!TF0) {};// khong lam gi TF0 = 0;// xoa co tran TR0 = 0; // Dung bo dinh thoi } // Chuong trinh chinh main() { init_T0_M2(); while(1)// vong lap vo han { P1_0 = ~P1_0; delay(); } } 3.2.8.4. Lập trình cho bộ đếm - Nếu bít C/T = 1 thì bộ định thời được sử dụng làm bộ đếm. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 61 Khi bít GATE = 1 trong thanh ghi TMOD thì việc khởi động và dừng bộ định thời đƣợc thực hiện từ bên ngoài qua chân P2.2 và P2.3. Việc chạy và dừng bộ định thời đƣợc thực hiện qua một công tắc chuyển mạch bên ngoài. - Ví dụ: lập trình cho bộ đếm 0 chế độ 2 và hiển thị số đếm ra cổng P2. D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 D0 D1 D2 D3 D4 D5 D6 D7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D1 LED-YELLOW D2 ED-YELLOW D3 ED-YELLOW D4 ED-YELLOW D5 ED-YELLOW D6 ED-YELLOW D7 ED-YELLOW D8 ED-YELLOW #include //Khai bao su dung timer1 che do 1 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 62 void init_C0_M2 () { TMOD = 0x06; //Counter 0 che do 2 TL0 = 0; TR0 = 1; // chay counter 0 } // Delay du dung timer void Dem () { while(!TF1) { P2 = TL0; } TF1 = 0;// xoa co tran } // Chuong trinh chinh main() { P3 = 0xff; //P3 lam cong vao init_C0_M2(); while(1)// vong lap vo han { Dem(); } } 3.2.9. Lập trình ngắt timer - Trong phần trên ta đã biết, cờ bộ định thời TFx đƣợc đặt lên cao khi bộ định thời đạt giá trị cực đại và quay trở về 0. Và để kiểm tra cờ này ta dùng lệnh while(!TFx). Phƣơng pháp này có nhƣợc điểm là trong quá trình kiểm tra cờ TF, bộ vi điều khiển không thể làm đƣợc việc gì khác. Để khắc phục nhƣợc điểm này, ta sử dụng phƣơng pháp ngắt. - Các bƣớc khai báo ngắt cho timer + Bƣớc 1: Thiết lập giá trị thích hợp cho thanh ghi cho phép ngắt IE (ET0 =1; ET1 = 1) + bƣớc 2: Thiết lập cho bộ định thời theo trình tự 7 bƣớc đã nêu ở phần trên. - Cách khai báo, sử dụng ngắt timer Void interrupt_T1 () interrupt 3 { //write code here } Void interrupt_T0 () interrupt 1 { //write code here } - Ví dụ: Tạo xung trên chân P2_0 sử dụng ngắt T0, chế độ 2. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 63 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D8 LED-YELLOW #include //Khai bao su dung timer1 che do 1 void init_interrupt_T0_M2 () { TMOD = 0x02; //T0,M2 TL0 = 0; ET0 = 1; // Cho phep ngat T0 EA = 1; // Cho phep ngat TR0 = 1; // chay counter 0 } //Chuong trinh ngat cho T0 void interrupt_T2 () interrupt 1 { P2_0=~P2_0; } // Chuong trinh chinh main() { init_interrupt_T0_M2 (); while(1)// vong lap vo han { }; // Cho ngat } - Ví dụ 2: Ứng dụng ngắt timer 1 điều chế độ rộng xung PWM Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 64 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 D8 LED-YELLOW A B C D #include // Khai bao bien sbit button = P3^0; sbit pulse = P2^0; unsigned int count,rate; //================================================= // chuong trinh con tao tre //Khai bao su dung timer1 che do 1================== void init_interrupt () { TMOD = 0x20; //T0,M2 TL1 = 0; ET1 = 1; // Cho phep ngat T0 EX0 = 1;// Cho phep ngat ngoai 0 EA = 1; // Cho phep ngat TR1 = 1; // chay counter 0 } //Chuong trinh ngat cho T0========================== void interrupt_T1 () interrupt 3 { count++; if(count == rate) { count = 0; pulse =~pulse; } } //Chuong trinh con dem so lan nhan nut============== void interrupt_INT0 () interrupt 0 { Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 65 rate= rate + 2; if(rate >= 20) rate = 2; } // Chuong trinh chinh================================== main() { P3 = 0xff; count = 0; rate = 2; init_interrupt (); while(1)// vong lap vo han { } ; } 3.2.10. Lập trình với bộ biến đổi A/D - Các bộ biến đổi AD chuẩn thƣờng đƣợc sử dụng trong các ứng dụng đòi hỏi tốc độ ở mức trung bình và mức cao. Ví dụ bộ ACD 0804, thời gian chuyển đổi của bộ biến đổi A/D này là 100uS. - Bộ biến đổi này giao tiếp với vi điều khiển thông qua các chân sau: DB0~DB7 Tám chân dữ liệu RD Lối vào đọc WR Lối vào ghi INTR Lối ra ngắt CLKR/CLKIN Các lối vào điều khiển xung nhịp VIN+ Lối vào Analog dƣơng - Chức năng của các chân đƣợc giải thích chi tiết nhƣ sau: + DB0~DB7: là các lối ra số, dữ liệu đã chuyển đổi xuất hiện trên 8 đƣờng này. Bộ biến đổi 8 bít có 256 khả năng kết hợp ( từ 0 đến 255) các mẫu bít ở lối ra. Với điện áp toàn dải là +5V, bộ biến đổi có độ phân giải là 5/256 = 19,53mV. Ví dụ mẫu bít ở lối ra là “00010000” (nghĩa là 16 trong hệ thập phân) tƣơng ứng với 312,48mV. Tƣơng tự mẫu bít lối ra là “10100000” (nghĩa là 160 trong hệ thập phân) tƣơng ứng 3124,8mV hay 3,124V. + RD: là chân điều khiển đọc dữ liệu và khi RD ở mức thấp dữ liệu xuất hiện trên 8 chân lối ra. Khi RD ở mức cao dữ liệu không tồn tại ở lối ra. + WR: lối vào WR bình thƣờng ở mức logic cao và lối vào này sẽ đƣợc kéo xuống mức logic thấp, sau đó lại trở về mức cao để bắt đầu quá trình chuyển đổi. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 66 + INTR: là lối ra ngắt của bộ biến đổi ADC, một sƣờn xung xuống (từ mức cao xuống mức thấp) đƣợc tạo ra trên chân này khi quá trình chuyển đổi kết thúc. Lối ra này thƣờng đƣợc sử dụng để tạo ra một ngắt trong vi điều khiển sao cho dữ liệu chuyển đổi có thể đƣợc đọc. + ADC0804 chứa một bộ dao động bên trong và cần có một tụ điện và điện trở bên ngoài nối với chân CLKR và CLKIN để khởi động bộ dao động. + VIN+: chân lối vào của điện áp tƣơng tự. - Để thực hiện một quá trình chuyển đổi, hoạt động của bộ A/D có thể tóm tắt theo các bƣớc sau: + Thiết lập WR và RD lên mức HIGH. + Bắt đầu quá trình chuyển đổi bằng cách đặt WR xuống mức LOW. + Đặt WR trở về mức HIGH. + Phát hiện điểm kết thúc của quá trình biến đổi khi INTR xuống mức LOW (thƣờng đƣợc sử dụng bởi ngắt). + Đặt RD xuống mức LOW và đọc dữ liệu từ DB0~DB7. + Đặt RD lên mức cao. + Quá trình xử lý này đƣợc lặp lại khi cần đọc lien tục tín hiệu đƣa vào vi điều khiển. RD WR INTR RD INTR WR D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 D0 D1 D2 D3 D4 D5 D6 D7 XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 VIN+ 6 VIN- 7 VREF/2 9 CLK IN 4 A GND 8 RD 2 WR 3 INTR 5 CS 1 D GND 10 DB7(MSB) 11 DB6 12 DB5 13 DB4 14 DB3 15 DB2 16 DB1 17 DB0(LSB) 18 CLK R 19 VCC 20 U2 ADC0804 C1 150p R1 10k U2(VIN+) 5 0 % RV1 1k D1 LED-YELLOW D2 ED-YELLOW D3 ED-YELLOW D4 ED-YELLOW D5 ED-YELLOW D6 ED-YELLOW D7 ED-YELLOW D8 ED-YELLOW #include // Khai bao bien sbit ADC_RD = P3^2; sbit ADC_WR = P3^4; unsigned char t; // chuong trinh con tao tre void delay (long time) { Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 67 long k; for(k=0;k<time;k++) {}; } // Chuong trinh con thiet lap chuyen doi ADC va ngat ngoai 1 void init () { ADC_RD = 1; ADC_WR = 1; IT1 = 1; // Ngat ngoai theo suon xuong EX1 = 1; // cho phep ngat ngoai 1 EA = 1; // Cho phep ngat } // Chuong trinh con bat dau chuyen doi ADC void start_con () { ADC_WR = 0; ADC_WR = 1; } // Chuong trinh con ngat ngoai 1 void int_EX1 () interrupt 2 { ADC_RD = 0; t = P1; //t = t*19; P2 = t; ADC_RD = 1; delay (5); start_con(); } // Chuong trinh chinh================================== main() { init(); start_con(); while(1)// vong lap vo han { } ; } 3.2.11. Lập trình giao tiếp máy tính 3.2.11.1. Chế độ thu phát - Truyền dữ liệu nối tiếp, song song Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 68 - Các chế độ thu phát dữ liệu 3.2.11.2. Giao thức (protocol) Truyền thông nối tiếp không đồng bộ và định khung dữ liệu: Dữ liệu tới đầu thu của đƣờng truyền nối tiếp là tín hiệu 0 và 1. Việc xác định nội dung của dữ liệu sẽ khó khăn nếu giữa phần đầu phát và đầu thu không có một quy tắc thống nhất còn đƣợc gọi là giao thức (protocol) nhƣ: dữ liệu đƣợc xắp xếp nhƣ thế nào, có bao nhiêu bít tạo thành một ký tự, khi nào bắt đầu và khi nào kết thúc dữ liệu Bít khởi động và bít dừng: Truyền tin nối tiếp không đồng bộ đƣợc sử dụng rộng rãi trong truyền ký tự, còn truyền dữ liệu định hƣớng khối sử dụng phƣơng pháp đồng bộ. Ở phƣơng pháp không đồng bộ, mỗi ký tự đƣợc bố trí vào giữa bít khởi động và bit dừng. Ngƣời ta gọi cách thức này là định khung. Nhƣ vậy, đối với truyền tin không đồng bộ, để định khung, dữ liệu ký tự đƣợc nén giữa bít khởi động và bít dừng. Bit khởi động luôn chỉ có một bít, còn bít dừng có thể có 1 hoặc 2 bit. Bit khởi động luôn có giá trị 0 (mức thấp), còn bít dừng thì có giá trị 1 (cao). Ví dụ, nhƣ hình 3, trong đó ký tự “A” ASCII có mã nhị phân là 0100 0001, đƣợc định khung giữa một bít khởi động và 2 bít dừng. chú ý là bit trọng số thấp LSB đƣợc gửi đi trƣớc. Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 69 Hình 3.1. Định khung ký tự “A” mã ASCII – 41h Ở hình 3, khi không truyền thì tín hiệu là 1, gọi là dấu (mark). Tín hiệu không đƣợc gọi là khoảng trống (space). Lƣu ý là trình tự truyền bắt đầu với bít khởi động, tiếp theo là bít D0, bit LSB, tiếp nữa là các bít còn lại cho đến bít có trọng số lớn nhất MSB là D7, và cuối cùng là bit dừng để báo rằng đã kết thúc ký tự “A”. Trong truyền tin nối tiếp không đồng bộ, các thiết bị ngoại vi và modem đƣợc lập trình để có độ dài dữ liệu là 7 bít hoặc 8 bít, đó là chƣa kể các bít dừng có thể chiếm 1 hoặc 2 bít. Trƣớc đây, ký tự ASCII là 7 bít, hiện nay ký tự ASCII mở rộng có 8 bít. Trong một số hệ thống trƣớc đây, do thiết bị thu không nhanh nên cần sử dụng 2 bít dừng để thiết bị có đủ thời gian cho truyền byte tiếp theo. Tuy nhiên, trong máy tính PC hiện đại phổ biến sử dụng một bit dừng. Nếu chúng ta truyền một tệp văn bản ký tự ASCII sử dụng một bit dừng thì ta có tổng cộng 10 bít cho mỗi ký tự, gồm: 8 bít ký tự ASCII chuẩn, 1 bít khởi động và 1 bít dừng. do đó, cứ 8 bít thì có them 2 bít chiếm 25% tổng phí. Ở một số hệ thống, nhằm tăng khả năng bảo toàn của dữ liệu, ngƣời ta còn thêm vào khung dữ liệu 1 bít chẵn lẻ. Bít này có thể là bít chẵn hoặc bit lẻ. Trong hệ thống cơ bít chẵn lẻ (bít bậc) thì bít này đƣợc gửi đi sau bit MSB và trƣớc bít dừng. 3.2.11.3. Tốc độ truyền Tốc độ truyền tin nối tiếp đƣợc tính bằng bit/giây (bps – bit per second). Một thuật ngữ khác cũng thƣờng đƣợc sử dụng là baud. Tuy nhiên, khái niệm bps và baud không hoàn toàn giống nhau. Baud là đơn vị đo dùng cho modem và đƣợc định nghĩa là số lần thay đổi trong một giây. Đối với modem, mỗi lần thay đổi tín hiệu có thể truyền đƣợc nhiều bit dữ liệu. Còn đối với đƣờng truyền thì tốc độ baud và bps là một. Do đó, trong tài liệu này ta không phân biệt hai thuật ngữ trên. 3.2.11.4. Bố trí chân của RS232 Hình 3.2. Sơ đồ đầu nối DB9 của RS232 Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 70 Ngƣời ta phân biệt thiết bị truyền thông dữ liệu thành thiết bị đầu cuối dữ liệu DTE (Data Terminal Equipment) hoặc thiết bị truyền thông dữ liệu DCE (Data Comunication Equipment). DTE chủ yếu là máy tính và các thiết bị đầu cuối gửi và nhận dữ liệu, còn DCE là thiết bị truyền thông, chẳng hạn nhƣ các modem chịu trách nhiệm về truyền dữ liệu. Lƣu ý rằng tất cả mọi định nghĩa về chức năng các chân RS232 đều nhìn từ góc độ DTE. Kết nối đơn giản nhất giữa một PC và bộ vi điều khiển yêu cần tối thiểu những chân sau: TxD, RxD và đất. Để đảm bảo truyền dữ liệu nhanh và tin cậy, giữa hai thiết bị thì việc truyền dữ liệu phải đƣợc phối hopự tốt. Nhƣ trong trƣờng hợp của máy in, do thực tế là truyền tin nối tiếp, thiết bị thu có thể không đủ chỗ để chứa dữ liệu, khi đó phải có cách để báo cho bên phát dừng gửi dữ liệu. Có một số chân của RS232 đƣợc dùng làm chân tín hiệu bắt tay. - DTR (data terminal ready) thiết bị đầu cuối sẵn sàng, sau khi đƣợc cấp nguồn, và sau khi kết thúc quá trình tự kiểm tra, thiết bị đầu cuối hoặc cổng COM của máy tính gửi tín hiệu DTR để báo rằng thiết bị đã sẵn sàng để truyền tin. Nếu có lỗi ở cổng COM, tín hiệu này sẽ không đựợc kích hoạt. Đây là tín hiệu tích cực thấp và có thể đƣợc dùng để thông báo cho modem biết rằng máy tính đang hoạt động. Đây là chân ra từ DTE (cổng COM máy tính đƣa vào modem). - DSR (data set ready): dữ liệu sẵn sàng, khi thiết bị truyền thông DCE (ví dụ modem) đƣợc cấp nguồn và thực hiện xong quá trình tự kiểm tra, tín hiệu DSR đƣợc sử dụng để xác nhận dữ liệu đã sẵn sàng để truyền tin. Nhƣ vậy DSR là chân ra từ modem (DCE) và vào máy tính (DTE). Tín hiệu này có mức tích cực thấp. Nếu vì một lý do nào đó mà modem không thể kết nối đƣợc vào mạng điện thoại thì tín hiệu này sẽ không đƣợc kích hoạt để báo cho máy tính hoặc thiết bị đầu cuối rằng nó không thể nhận hoặc gửi dữ liệu. - RTS (request to send): Yêu cầu gửi dữ liệu. Tín hiệu RTS đƣợc sử dụng để báo cho modem biết thiết bị DTE (ví dụ máy tính) có một byte cần gửi. RTS là đầu ra tích cực thấp từ thiết bị DTE và vào thiết bị DCE. - CTS (clear to send): Tín hiệu thông: Để trả lời tín hiệu RTS, và khi đã sẵn sàng, modem gửi tín hiệu CTS đến thiết bị DTE (ví dụ máy tính) báo máy tính biết modem đang sẵn sàng nhận dữ liệu. CTS là tín hiệu vào thiết bị DTE và đƣợc DTE sử dụng để bắt đầu truyền dữ liệu. - CD (carrier detect)- dò sóng mang hoặc DCD (data carrier detect)- dò sóng mang dữ liệu. Modem gửi tín hiệu DCD để báo cho thiết bị DTE (PC) rằng đã phát hiện đƣợc sóng Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 71 mang và sự kết nối giữa thiết bị DTE với modem đã đƣợc thiết lập. DCD là tín hiệu ra từ modem và đƣa vào DTE (PC). - RI (ring indicator) chỉ thị chuông- Đây là tín hiệu ra từ modem (DCE) đƣa vào PC (DTE) để báo rằng điện thoại đang réo chuông. Tín hiệu này tắt hoặc mở đồng bộ với tiếng chuông. Trong 6 tín hiệu bắt tay, đây là tín hiệu ít đƣợc sử dụng nhất. - Từ những trình bày trên có thể tóm tắt quá trình truyền tin giữa PC và modem nhƣ sau: khi có các tín hiệu DTR và DSC của PC và modem, chúng báo hiệu là PC và modem làm việc tốt, các tín hiệu RTS và CTS điều khiển luồng dữ liệu. khi PC muốn gửi dữ liệu thì nó gửi tín hiệu RTS cho modem và để trả lời lại nếu modem đã sẵn sàng (có chỗ chứa dữ liệu) để nhận dữ liệu từ PC thì nó gửi lại cho PC tín hiệu CTS. - Nếu modem bận thì nó không phát tín hiệu CTS, PC sẽ hủy tín hiệu DTR và sẽ thử lặp lại quá trình này. Tín hiệu CTS và RTS còn gọi là tín hiệu điều khiển luồng phần cứng. Còn nếu thiếu chỗ chứa dữ liệu thì modem không kích hoạt CTS và PC thôi không yêu cầu DTR và tiến hành thử lại lần nữa. các tín hiệu RTS và CTS cũng đƣợc coi là tín hiệu luồng điều khiển phần cứng. 3.2.11.5. Ghép nối 8051 với RS232 MAX232 dùng điện áp nguồn nuôi 5V cùng với điện áp nguồn của 8051. MAX232 cần 4 tụ điện giá trị từ 1 đến 22uF. Giá trị thƣờng dùng là 22uF. Max232 có hai cặp TxD, RxD (T1, R1; T2, R2) trong nhiều ứng dụng thì chỉ có một cặp đƣợc dùng, ví dụ T1, R1 đƣợc dùng với nhau cho trƣờng hợp TxD và RxD của 8051. 3.2.11.6. Lập trình truyền thông nối tiếp cho 8051 8051 phát và thu dữ liệu nối tiếp theo nhiều tốc độ khác nhau. Tốc độ truyền có thể lập trình đƣợc thông qua bộ định thời timer 1. Bảng Giá trị thanh ghi TH1 của Timer1 với các tốc độ Baud khác nhau Tốc độ Baud Xung nhịp SMOD Giá trị TH1 Sai số 9600 11.0592MHz 0 0xFD 0% 4800 11.0592MHz 0 0xFA 0% 2400 11.0592MHz 0 0xF4 0% 1200 11.0592MHz 0 0xE8 0% 9600 12MHz 1 0xF9 7% 4800 12MHz 0 0xF9 7% Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 72 2400 12MHz 0 0xF3 0.16% 1200 12MHz 0 0xE6 0.16% Thanh ghi SBUF: là thanh ghi 8 bít đƣợc dùng cho truyền nối tiếp của 8051. Để byte dữ liệu đƣợc truyền qua đƣờng TxD thì cần đặt dữ liệu trong thanh ghi SBUF. Tƣơng tự, SBUF lƣu một byte dữ liệu khi nó đƣợc nhận qua đƣờng RxD của 8051. SBUF có thể đƣợc mọi thanh ghi của 8051 truy cập Khi byte dữ liệu đƣợc ghi vào thanh ghi SBUF thì byte sẽ đƣợc định khung với bít Start và Stop và đƣợc truyền nối tiếp qua chân TxD. Tƣơng tự nhƣ vậy, khi các bít đƣợc nhận nối tiếp từ RxD thì 8051 mở khung, tức là loại trừ các bít Start, Stop để lấy ra một byte từ dữ liệu nhận đƣợc và đặt vào thanh ghi SBUF. Thanh ghi điều khiển nối tiếp SCON: là thanh ghi 8 bít đƣợc dùng cho một số công việc, trong đó có lập trình bit khởi động Start, bit dừng Stop và các bít dữ liệu kiểu định khung dữ liệu . - Hai bít SM0, SM1 đây là các bít D6, D7 của thanh ghi SCON. Các bít này đƣợc dùng để xác định chế độ định khung dữ liệu bằng cách xác định số bít của một ký tự và các bít Start, Stop các tổ hợp của chúng là: SM0 SM1 Chế độ 0 0 Chế độ nối tiếp 0 0 1 Chế độ nối tiếp 1, 8 bít dữ liệu, Start, Stop 1 0 Chế độ nối tiếp 2 1 1 Chế độ nối tiếp 3 Trong bốn chế độ trên, ta chỉ quan tâm tới chế độ 1, chế độ này cho phép tốc đọ Baud thay đổi và do timer1 của 8051 thiết lập. Nhƣ vậy, ở chế độ nối tiếp 1, mỗi ký tự gồm có 10 bít đƣợc truyển, trong đó có bít đầu tiên là bít Start, sau đó là 8 bít dữ liệu và cuối cùng là bít Stop. Chú ý: Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 73 - SM2 = 0 vì ta không dùng 8051 cho hệ đa xử lý. - REN = 1 thì 8051 vừa có thể phát và thu dữ liệu (SETB SCON.4) - REN = 0 thì bộ thu bị khóa (CLR SCON.4) - TB8 = 0; RB8 = 0 : vì không sử dụng chế độ nối tiếp 2,3. - TI và RI: Ngắt phát và ngắt thu là các bít D1 và D0 của thanh ghi SCON. Khi 8051 kết thúc phát một ký tự 8 bít thì cờ TI đƣợc bật để báo rằng bộ vi điều khiển đã sẵn sàng phát byte tiếp theo. Bít TI đƣợc bật khi bắt đầu nút Stop Khi 8051 nhận đƣợc dữ liệu nối tiếp qua chân RxD thì tiến hành tách các bít Start và Stop để lấy ra 8 bít dữ liệu và đặt vào thanh ghi SBUF. Sau khi quá trình này hoàn tất, cờ RI đƣợc bật để báo rằng bộ vi điều khiển đã nhận xong một byte và cần phải đƣợc cất đi nếu không sẽ bị mất. Cờ RI đƣợc bất khi đang tách bít Stop 3.2.11.7. Lập trình 8051 truyền dữ liệu nối tiếp 3.2.11.8. Lập trình 8051 nhận dữ liệu nối tiếp Khoa Cơ khí Động lực – Trường ĐHSPKT Hưng Yên 74 3.2.11.9. Truyền dữ liệu bằng ngắt Nhƣ đã nêu ở phần trên, cờ ngắt phát TI đƣợc bật lên 1 khi bít cuối cùng của khung dữ liệu, bít Stop đƣợc phát đi báo rằng thanh ghi SBUF sẵn sàng phát byte tiếp. Trái lại, cờ ngắt thu RI đƣợc bật lên 1 khi toàn bộ khung dữ liệu kể cả bít Stop đã đƣợc nhận. Nói cách khác, thanh ghi SBUF đang lƣu một byte, thì cờ RI bật lên báo rằng byte dữ liệu thu đƣợc cần cất đi vào nơi an toàn trƣớc khi bị mất (bị ghi đè) bởi dữ liệu tiếp theo sẽ đƣợc nhận. Ở 8051 chỉ có một ngắt dành riêng cho truyền thông nối tiếp. Ngắt này đƣợc dùng cho cả phát và thu dữ liệu. Nếu bít ngắt trong thanh ghi IE (là bít IE.4) đƣợc phép khi RI và TI bật lên, thì 8051 nhận đƣợc ngắt và nhảy đến địa chỉ trình phục vụ ngắt dành cho truyền thông nối tiếp 0023H trong bảng vectơ ngắt và thực hiện nó. Lúc đó, chúng ta cần kiểm tra cờ TI và RI để xem cờ nào gây ngắt để có đáp ứng phù hợp. Hình 3.3. Thu và phát dùng một ngắt Ví dụ 1: Gửi dữ liệu từ vi điều khiển lên máy tính

Các file đính kèm theo tài liệu này:

  • pdf03200072_6904_1984550.pdf