42 1 1MB
[email protected]
Lest’s Share to be Shared
Đo nhiệt độ dùng DS18B20,đo khoảng cách, giao tiếp máy tính, hiển thị LCD.
Lời mở: Mình hy vọng đề tài này sẽ giúp cho bạn hiểu thêm về lập trình cho Avr. Mình đã bước đầu làm quen với Avr và gặp nhiều khó khăn, mất nhiều time (và cả $) cho việc làm quen, mong rằng tài liệu này sẽ giúp bạn tiếp cận Avr nhanh hơn .Tất cả phần cứng và code mình đã làm và chạy OK. Cuối cùng xin cảm ơn diễn đàn dientuvietnam.net đã cho mình học hỏi rất nhiều kiến thức. Đặc biệt là mod Sphinx,( xin cảm ơn nhân sư của Pnlab :D ) CHÚ Ý : Tài liệu này chỉ dành cho newbie ,chứ các bác cao thủ mà đọc thì em lấy làm xấu hổ lắm. Các trang web bổ ích cho vấn đề này : www.dientuvietnam.net http://vagam.dieukhien.net/
LCD: 1. http://dientuvietnam.net/forums/showthread.php?t=281&highlight=L%E1%BA%ADp +tr%C3%ACnh+hi%E1%BB%83n+th%E1%BB%8B+LCD+b%E1%BA%B1ng+Asse mbler+%28+tutorial%29 2. http://www.vagam.dieukhien.net/discuss.php?thid=3121&pagenum=2 3. http://vagam.dieukhien.net/discuss.php?thid=148&pagenum=1 RS232 4. http://www.8051projects.net/serial-communication/introduction.php 5. http://www.vagam.dieukhien.net/discuss.php?thid=3216&pagenum=1 6. http://dientuvietnam.net/forums/forumdisplay.php?f=74
1
[email protected]
Lest’s Share to be Shared
Phần cứng : Dưới đây là cái mạch của mình .
2
[email protected]
Lest’s Share to be Shared
Mạch thật nè (xấu quá :D):
3
[email protected]
Lest’s Share to be Shared
Các linh kiện trong mạch:
Chip AVR Atmega16. IC DS18B20. IC GP2D12. MAX 232. LCD 1602 LM7805. Led, trở, loa tụ.
Có lẽ không phải nói nhiều về mạch này Mình chỉ xin đề cập 1 số phần nhỏ : Kết nối với ds18B20 bạn có thể xem ở datasheet Trong mạch có jump của mạch nạp , có thể bỏ đi vì cho vào mạch sẽ phức tạp hơn. Code mình dùng thạch anh trong 4Mhz nên bạn có thể bỏ thạch anh và tụ 22p nếu dùng thạch anh trong. Mình dùng adc chân adc0 để đo khoảng cách từ con Gp2D12, nếu bạn ko dùng con này thì có thể coi code như là adc bình thường. Về phần cứng chỉ có vậy. Bạn có thể tham khảo thêm file mạch mình gửi kèm.
Phần mềm: Bây giờ lập trình nào, mình chia làm 2 phần : trên AVR (mình dùng CodeVisionAvr)và trên PC (dùng Vb6 :D).
CodeVision AVR: Mình kết hợp adc và ds18B20 bị lỗi (cũng không biết tại sao, bạn giải quyết được nhớ chỉ cho mình nhé) nên mình lập trình 2 code riêng 1 code đo nhiệt độ và 1 code ADC.
Sau đây là code đo nhiệt độ : 4
[email protected]
Lest’s Share to be Shared
Click chọn new Project :
Và
Dĩ nhiên là Yes rồi Sau đó bạn lần lượt cấu hình như sau:
Chọn chip
5
[email protected]
Lest’s Share to be Shared
Nối LCD vào PORT B
6
[email protected]
Lest’s Share to be Shared
Cấu hình ds18B20
7
[email protected]
Lest’s Share to be Shared
Cấu hình USART
8
[email protected]
Lest’s Share to be Shared
Cấu hình cổng OUT cho các PORTA.2 và PORTA.4 để báo hiệu ra LED và Loa
Sau đó vào menu vào như trong hình rồi chọn tên file để save 9
[email protected]
Lest’s Share to be Shared
Bây giờ ta đã có code c/t tự dịch . Đầu tiên là phải thay dòng #include bằng #include (đơn giản vì ta dùng IC 18B20). Cuối cùng đây là code mình đã viết
/***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 6/23/2009 Author : DuongV3 Company : DHBK Comments: Have A Mice Day
Chip type : ATmega16 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include #include // 1 Wire Bus functions #asm .equ __w1_port=0x15 ;PORTC .equ __w1_bit=0 #endasm #include // DS1820 Temperature Sensor functions 10
[email protected]
Lest’s Share to be Shared
#include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include int c,d,tp1,tp2,tp3,tp4; typedef unsigned char byte; flash byte char0[8]={ 0b0000000, 0b0011100, 0b0010100, 0b0011100, 0b0000000, 0b0000000, 0b0000000, 0b0000000}; void define_char(byte flash *pc,byte char_code) { byte i,a; a=(char_code