Bài tập lớn Thiết kế mạch đo nhiệt độ, độ ẩm sử dụng MSP430G253 và kit phát triển MSP430 của TI

 Kết quả thu được sau đề tài này: Do kinh nghiệm còn ít và hạn chế về thời gian cho việc chỉnh sửa nên mạch có phát sinh một số lỗi. • Ưu điểm : - Mạch thực hiện được các chức năng chính theo yêu cầu. - Mạch in đẹp. - Sắp xếp linh kiện đẹp. • Khuyết điểm của mạch: - Mạch chạy chưa được ổn định.  Hướng phát triển của đề tài này: - Cải thiện sự ổn định hệ thống . - Sử dụng led 7 đoạn để tăng khả năng quan sát của khối hiển thị. - Thiết kế khối điều khiển thiết lập mức cảnh báo ngưỡng nhiệt độ, độ ẩm.

docx42 trang | Chia sẻ: hachi492 | Ngày: 07/01/2022 | Lượt xem: 548 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài tập lớn Thiết kế mạch đo nhiệt độ, độ ẩm sử dụng MSP430G253 và kit phát triển MSP430 của TI, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MỤC LỤC LỜI NÓI ĐẦU Bộ vi điều khiển, viết tắt Microcontroller là mạch tích hợp trên 1 chip có thể lập trình được, dùng để điều khiển hoạt động của hệ thống. Theo các tập lệnh của người lập trình, bộ vi điều khiển tiến hành đọc, lưu trữ thông tin, xử lý thông tin, đo thời gian và tiến hành đóng mở 1 cơ cấu nào đó. Có thể nói, hiện nay vi điều khiển đã rất phổ biến ở Việt Nam và được ứng dụng rất nhiều trong các lĩnh vực của đời sống xã hôi. Những sinh viên ngành điện, điện tử, cơ điện tử, tin học, viễn thông.hầu như ai cũng biết cách để làm việc với vi điều khiển, kéo theo đó là nhu cầu sử dụng các bộ kit trong học tập, nghiên cứu cũng như ứng dụng trên thực tế là không nhỏ. Trong số các kit đang có trên thị trường hiện nay, dòng MSP430 của TI được đánh giá cao về sự ổn định, tiết kiệm năng lượng cũng như dễ học tập và nghiên cứu. Nhằm giúp tiếp cận thực tế về dòng vi điều khiển này nhóm chúng em đã tiến hành làm bài tập lớn thiết kế mạch đo nhiệt độ,độ ẩm sử dụng MSP430G253 và kit phát triển MSP430 của TI. Để có thể hoàn thiện được đề tài này, chúng em xin chân thành cám ơn Quý Thầy, Cô đã tận tình hướng dẫn, chỉ dạy cho chúng em suốt thời gian thực hiện và thiết kế đề tài. Mặc dù đã cố gắng hết mình tuy nhiên kết quả của nhóm em cũng không thể tránh khỏi những thiếu sót, chúng em rất mong sẽ nhận được sự góp ý, đánh giá và giúp đỡ của Thầy Cô để có thể hoàn thiện và đạt được kết quả tốt hơn nữa. Em xin chân thành cảm ơn! CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI VÀ TÌM HIỂU VỀ MSP430 CÙNG KÍT PHÁT TRIỂN MSP430 1.1 GIỚI THIỆU VỀ ĐỀ TÀI 1.1.1 Tên đề tài Thiết kế mạch đo nhiệt độ, độ ẩm dùng MSP430 truyền qua NRF. 1.1.2 Khái quát đề tài Trong phạm vi đề tài này, nhóm chúng em tập trung tìm hiểu và nghiên cứu những nội dung chính sau: - Hiển thị nhiệt độ ,độ ẩm trên LCD - Sử dụng NRF24N01 để truyền dữ liệu 1.2 TÌM HIỂU VỀ MSP430 1.2.1 Tổng quan về MSP430 MSP430 là dòng vi điều khiển được phát triển bởi hãng TI(Texas Instruments). MSP430 là sự kết hợp chặt chẽ của một CPU RISC 16 bit,những khối ngoại vi và hệ thống xung linh hoạt được kết nối với nhau theo cấu trúc VON-NEUMANN, có các Bus liên kết như: Bus địa chỉ bộ nhớ (MAB), Bus dữ liệu bộ nhớ ( MDB). Đây là một bộ xử lý hiện đại với các mô đun bộ nhớ tương tự và nhứng kết nối ngoại vi tín hiệu số, MSP430 đã đưa ra được những giải pháp tốt cho những nhu cầu ứng dụng với tín hiệu hỗn tạp.. MSP430 đã đưa ra khá nhiều phiên bản để phù hợp với những nhu cầu ứng dụng khác nhau. MSP430 có một số phiên bản như: MSP430x1xx, MSP430x2xx, MSP430x3xx, MSP430x4xx, MSP430x5xx. Hình 1 Các thế hệ của MSP MSP430 có 5 thế hệ chip, được gọi là 1xx, 2xx, 3xx, 4xx, 5xx. Thường xx càng lớn thì chức năng và số chân càng nhiều. 1.2.1.1 MSP430x1xx Series 1.8–3.6V Tốc độ Flash/ROM: 8 MIPS Feature Fast Wake-Up From Standby Mode in <6 μs Flash Options: 1–60 KB ROM Options: 1–16 KB RAM Options: 512 B –10 KB GPIO Options: 14, 22, 48 pins ADC Options: Slope, 10 & 12-bit SAR Other Integrated peripherals: Analog Comparator, DMA, Hardware Multiplier, SVS, 12-bit DAC 1.2.1.2 MSP430F2xx Series Series 2xx cũng tương tự như 1xx nhưng tiêu thụ năng lượng ít hơn, tốc độ có thể lên tới 16MHz, đồng hồ on-chip có độ chính xác cao hơn (±2%) nên có thể hoạt động mà không cần thạch anh gắn ngoài. 1.8–3.6 V Tốc độ Flash/ROM: 16 MIPS Có tích hợp điện trở kéo lên/kéo xuống (pull-up/pull-down) Ultra-Fast Wake-Up From Standby Mode in <1 μs Device Parameters Flash Options: 1–120 KB RAM Options: 128 B–8 KB GPIO Options: 10, 16, 24, 32, 48, 64 pins ADC Options: Slope, 10 & 12-bit SAR, 16-bit Sigma Delta Other Integrated peripherals: Analog Comparator, Hardware Multiplier, DMA, SVS, 12-bit DAC, Op Amps 1.2.1.3 MSP430G2xx Series Tương tự F2xx, chức năng ít hơn và giá thấp hơn: Flash Options: 0.5–16 KB RAM Options: 128–512 B GPIO Options: 10, 16, 24 pins ADC Options: Slope, 10-bit SAR Other Integrated peripherals: Analog Comparator 1.2.1.4 MSP430x3xx Series Đây là thế hệ lâu đời nhất (già cả nhất) của dòng MSP430, tích hợp LCD controller. Không hỗ trợ EEPROM. Feature Fast Wake-Up From Standby Mode in <6 μs 2.5–5.5 V ROM Options: 2–32 KB RAM Options: 512 B–1 KB GPIO Options: 14, 40 pins ADC Options: Slope, 14-bit SAR Other Integrated peripherals: LCD controller, Hardware Multiplier MSP430x4xx Series Có tích hợp LCD controller, nhiều chức năng hơn 3xx. - 1.8-3.6V - FLL, SVS - Feature Fast Wake-Up From Standby Mode in <6 μs - Tốc độ Flash/ROM 8-16 MIPS. - Flash/ROM Options: 4 kB – 120 KB - RAM Options: 256 B – 8 KB - GPIO Options: 14, 32, 48, 56, 68, 72, 80 pins - ADC Options: Slope, 10 &12-bit SAR, 16-bit Sigma Delta - LCD Controller, Analog Comparator, 12-bit DAC, DMA, Hardware 1.2.1.6 MSP430x5xx Series Tốc độ lên tới 25 MHz. Đây là dòng có mức tiêu thụ năng lượng thấp nhất trong họ MSP430, được tích hợp Module Giám sát Năng lượng (Power Management Module) để tối ưu điện năng tiêu thụ. Một số chip tích hợp USB. Fast Wake-Up From Standby Mode in <5 μs 1.8-3.6V Flash Options: up to 256 KB RAM Options: up to 16 KB ADC Options: 10 & 12-bit SAR USB, Analog Comparator, DMA, Hardware Multiplier, RTC, USCI, 12-bit DAC 1.2.2 Cấu trúc MSP430 Hình 2 Sơ đồ cấu trúc bên trong của MSP430 Cấu trúc bên trong : ADC10/12/16/24-bit : 200 ksps với điện áp tham chiếu nội, lấy mẫu và chốt. Tự động quét kênh, điều khiển chuyển đổi dữ liệu. DAC12-bit : Op Amp, LCD driver RF transceiver AES128 Capacitive touch IO USB2.0, Real Time Clock Bộ nhớ FRAM 1.2.3 Đặc tính của MSP430 MSP 430 là họ vi điều khiển cấu trúc RISC 16-bit được sản xuất bởi công ty Texas Instruments. MSP - MIXED SIGNAL MICROCONTROLLER - là dòng vi điều khiển siêu tiết kiệm năng lượng, sử dụng nguồn thấp, khoảng điện áp nguồn cấp từ 1.8V – 3.6V. MSP 430 kết hợp các đặc tính của một CPU hiện đại và tích hợp sẵn các module ngoại vi. Đặc biệt chip MSP 430 là giải pháp thích hợp cho những ứng dụng yêu cầu trộn tín hiệu. Những đặc tính của dòng MSP 430 bao gồm: Điện áp nguồn: 1.8V – 3.6 V. Mức tiêu thụ năng lượng cực thấp: Chế độ hoạt động: 270 μA tại 1MHz, 2,2 V. Chế độ chờ: 0.7 μA. Chế độ tắt (RAM vẫn được duy trì): 0.1 μA. Thời gian đánh thức từ chế độ Standby nhỏ hơn 1μs. Cấu trúc RISC-16 bit, Thời gian một chu kỳ lệnh là 62.5 ns Cấu hình các module Clock cơ bản: Tần số nội lên tới 16 MHz với 4 hiệu chỉnh tần số +- 1%. Thạch anh 32 KHz. Tần số làm việc lên tới 16 MHz. Bộ cộng hưởng. Nguồn tạo xung nhịp bên ngoài. Điện trở bên ngoài. Timer_A 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit Timer_B 16 bit với 3 thanh ghi hình, 3 thanh ghi so sánh độ rộng 16 bit Giao diện truyền thông nối tiếp: Hỗ trợ truyền thông nối tiếp nâng cao UART, tự động dò tìm tốc độ Baud. Bộ mã hóa và giải mã IrDA (Infrared Data Associatio). Chuẩn giao tiếp động bộ SPI. Chuẩn giao tiếp I2C. Bộ chuyển đổi ADC 10 bit, 200 ksps với điện áp tham chiếu nội, Lấy mẫu và chốt. Tự động quét kênh, điều khiển chuyển đổi dữ liệu. Hai bộ khuếch đại thuật toán (hoạt động) có thể định cấu hình (Đối với MSP 430x22x4). Bảo vệ sụt áp. Bộ nạp chương trình. Module mô phỏng trên chip. MSP430 được sử dụng và biết đến đặc biệt trong những ứng dụng về thiết bị đo có sử dụng hoặc không sử dụng LCD với chế độ nguồn nuôi rất thấp. Với chế độ nguồn nuôi từ khoảng 1,8 đến 3,6v và 5 chế độ bảo vệ nguồn. Với sự tiêu thụ dòng rất thấp trong chế độ tích cực thì dòng tiêu thụ là 200uA, 1Mhz, 2.2v; với chế độ standby thì dòng tiêu thụ là 0.7uA. Và chế độ tắt chỉ duy trì bộ nhớ Ram thì dòng tiêu thụ rất nhỏ 0.1uA. MSP430 có ưu thế về chế độ nguồn nuôi. Thời gian chuyển chế độ từ chế độ standby sang chế độ tích cực rất nhỏ (< 6us). Và có tích hợp 96 kiểu hình cho hiển thị LCD. 16 bit thanh ghi, 16 bit RISC CPU. Có một đặc điểm của họ nhà MSP là khi MCU không có tín hiệu dao động ngoại, thì MSP sẽ tự động chuyển sang hoạt động ở chế độ dao động nội. 1.3 BỘ KÍT MSP430G2 LaunchPad 1.3.1 Các thành phần của bộ kit MSP-EXP430G2 LaunchPad là một dễ sử dụng lập trình flash và công cụ gỡ lỗi giá trị cho dòng vi điều khiển MSP430G2xx. Nó có tất cả mọi tính năng bạn cần để bắt đầu phát triển trên một thiết bị MSP430. Nó có on-board để lập trình và gỡ lỗi và các tính năng 14/20-pin DIP ổ cắm, nút on-board và đèn LED & pinouts BoosterPack tương thích có hỗ trợ một loạt các Plug-in cho tính năng bổ sung như không dây, hiển thị và hơn thế nữa. MSP-EXP430G2 LaunchPad cũng đi kèm với 2 con chip MSP430 lên đến 16KB Flash, 512B RAM, 16MHz tốc độ CPU và thiết bị ngoại vi tích hợp như 8ch 10-bit ADC, giờ, giao tiếp nối tiếp (UART, I2C và SPI) và hơn thế nữa! Miễn phí công cụ phát triển phần mềm cũng có sẵn, chẳng hạn như dựa trên Eclipse của TI Code Composer Studio, IAR Embedded Workbench. Phát triển mã nguồn mở cũng có sẵn nhờ vào các dự án dựa vào cộng đồng như trình biên dịch MSPGCC hoặc Energia, một chi nhánh của khung dây phổ biến. 1.3.2 Tính năng Các LaunchPad phát triển các tính năng bảng: 14-/20-pin DIP (N) ổ cắm Tích hợp đèn flash thi đua để gỡ lỗi và lập trình 2 đèn LED lập trình 1 đèn LED 1 lập trình nút 1 nút thiết lập lại Hỗ trợ MSP430G2xx2, MSP430G2xx3, và các thiết bị MSP430F20xx trong PDIP14 hoặc PDIP20 gói. Giao diện giả lập tích hợp của LaunchPad kết nối đèn flash dựa trên các thiết bị dòng MSP430 giá trị gia tăng với một máy tính cho thời gian thực, lập trình trong hệ thống và sửa lỗi thông qua USB: Bao gồm một cáp mini USB để giao tiếp với máy tính. Bao gồm các tính năng thiết bị MSP430G2xx: MSP430G2553IN20 - 16KB Flash, 512B RAM, ngắt GPIO (capacitive cảm giác có khả năng), giờ 16-bit, 8ch 10-bit ADC, sánh, nối tiếp truyền thông (USCI - I2C, SPI và UART) MSP430G2452IN20 - 8KB Flash, 256B RAM, ngắt GPIO (capacitive cảm giác có khả năng), 16-bit giờ, 8ch 10-bit ADC, sánh, nối tiếp truyền thông (USI - I2C và SPI) và hơn thế nữa Thiết bị MSP430G2xx bao gồm có các chương trình mẫu cài đặt sẵn. Phiên bản tải về miễn phí của IAR Kickstart và Mã Composer Studio Phiên bản 5 môi trường phát triển tích hợp có sẵn và bao gồm lắp ráp, mối liên kết, mô phỏng, nguồn cấp gỡ lỗi, và C-trình biên dịch. Những IDE miễn phí không hạn chế trên các thiết bị dòng MSP430 giá trị. Tuân theo chuẩn RoHS. CHƯƠNG 2: NỘI DUNG ĐỀ TÀI I. Yêu cầu đề tài 1. Yêu cầu phần cứng • Sử dụng chip MSP430 của TI . • Sản phẩm : thiết kế mạch 2. Yêu cầu chức năng • Đo nhiệt độ ,độ ẩm từ cảm biến • Truyền dữ liệu qua NRF24L01 • Có cảnh báo mức nguy hiểm khi nhiệt độ , độ ẩm vượt ngưỡng. • Hiển thị kết quả lên LCD và LED 7 thanh 3. Yêu cầu phi chức năng • Độ ổn định cao • Đo nhiệt độ, độ ẩm dưới 100oC • Sắp xếp linh kiện đẹp, tránh nhiễu và ảnh hưởng nhiệt độ hệ thống đến cảm biến. KHỐI NGUỒN NHẬN KHỐI NHẬN KHỐI PHÁT KHỐI LED- 74HC595 KHỐI LCD KHỐI NGUỒN PHÁT 4.Sơ đồ khối hệ thống. II. Nội dung 1. Cảm biến nhiệt độ, độ ẩm: - Cảm biến SHT11 là cảm biến đo nhiệt độ và độ ẩm. Đây là dòng cảm biến ( SHT10,SHT11, SHT15, SHT75 ) chuyên dùng, có độ chính xác cao. Nó được sử dụng rộng dãi trong công nghiệp và dân dụng. a.Thông số kỹ thuật: Hình 3: Thông số kĩ thuật SHT11 b.Nguyên lý hoạt động - Cảm biến SHT11 đo độ ẩm và nhiệt độ ở 2 chế độ: • Chế độ 1: đo nhiệt độ 12 bít, độ ẩm 8 bít. • Chế độ 2: đo nhiệt độ 14 bít, đo độ ẩm 12 bít. Đây là chế độ thường được sử dụng • Sai số độ ẩm: ±3 • Sai số nhiệt độ: ±0.4 - Điện áp hoạt động: 2.4à5.5 - Cấu hình chân: Hình 4 : Sơ đồ chân SHT11 - Sơ đồ ghép nối Vi Xử Lý: Hình 5: Sơ đồ ghép nối SHT11 với Vi xử lý 2. Giao tiếp với SHT11 Hình 6 : Quá trình truyền dữ liệu SHT11 Quá trình gửi dữ liệu xuống SHT11 gồm 3 bước: • Truyền xung Start: • Chân DATA =1 • SCK có xung( từ thấp lên cao) sau đó VDK kéo chân DATA xuống thấp • SCK có xung tiếp theo, VDK giữ DATA ở thấp. Khi đó chân SHT11 biết là VĐK muốn giáo tiếp với nó. • Ta đưa chân DATA lên 1. Chuẩn bị quá trình gửi lệnh xuống SHT • Gửi lệnh xuống SHT • Gửi 0: cho chân DATA xuống 0, sau đó kích xung SCK từ Thấp lên Cao. Khi đó SHT11 sẽ đọc tín hiệu tại chân DATA và nhận giá trị • Gửi 1: cho chân DATA lên 1, sau đó kích xung SCK từ thấp lên cao. • VĐK gửi lệnh 8 bít xuống SHT11 :Trong đó 3 bit đầu là 0, 5 bit sau xác định yêu cầu của VĐK với SHT11 Hình 7 : Bảng mã lệnh SHT11 • Kiểm tra lỗi: • Sau khi gửi đủ 8 bit lệnh xuống SHT11, thì thực hiện kiểm tra lỗi • Cho chân DATA lên 1, sau đó chuyển chế độ là chân INPUT • Kích 1 xung từ thấp lên cao tại SCK • Đọc lại chân DATA Nếu =0: Gửi lệnh OK Nếu =1 : Gửi lệnh có lỗi. • Nếu gửi lệnh OK, ta chờ 1 thời gian để SHT11 đo nhiệt độ và gửi lại data cho VDK. Lúc này chân DATA vẫn là chân INPUT. SHTT11 sẽ kéo chân DATA lên 1 trong quá trình đo chờ kết quả. 3. Truyền dữ liệu qua NRF24L01: 3.1.Thông số kỹ thuật: Radio • Hoạt động ở giải tần 2.4G • Có 126 kênh • Truyền và nhận dữ liệu • Truyền tốc độ cao 1Mbps hoặc 2Mbps. Công suất phát: • Có thể cài đặt được 4 công suất nguồn phát: 0,-6,-12,-18dBm. Thu: • Có bộ lọc nhiễu tại đầu thu • Kếch đại bị ảnh hưởng bởi nhiễu thấp (LNA) Nguồn cấp: • Hoạt động từ 1.9-3.6V. • Các chân IO chạy được cả 3.3 lẫn 5V. Giao tiếp: • 4 pin SPI • Tốc độ tối đa 8Mbps • 3-32 bytes trên 1 khung truyền nhận Hình 8: Sơ đồ truyền nhận SPI Phân tích: • Modul nRF24L01 hoạt động ở tần số sóng ngắn 2.4G nên Modul này khả năng truyền dữ liệu tốc độ cao và truyền nhận dữ liệu trong điều kiện môi trường có vật cản • Modul nRF24L01 có 126 kênh truyền. Điều này giúp ta có thể truyền nhận dữ liệu trên nhiều kênh khác nhau. • Modul khả năng thay đổi công suất phát bằng chương trình, điều này giúp nó có thể hoạt động trong chế độ tiết kiệm năng lượng. • Chú ý: Điện áp cung cấp cho là 1.9à3.6V. Điện áp thường cung cấp là 3.3V. Nhưng các chân IO tương thích với chuẩn 5V. Điều này giúp nó giao tiếp rộng dãi với các dòng vi điều khiển. CHƯƠNG 3. THIẾT KẾ HỆ THỐNG I.Sơ đồ từng khối chi tiết 1.Khối nguồn Mạch nguồn đầu vào pin 9V được ổn áp qua LM7805 cho đầu ra 5V cấp cho LED 7 THANH và LCD. Đồng thời cho đầu ra 5V trên qua LM117 để có them đầu ra 3.3V cấp cho chip MSP430G2553 và NRF24L01. 2.Khối mạch phát. Lấy dự liệu nhiệt độ, độ ẩm từ SHT11 , truyền dữ liệu qua NRF24L01. 3.Khối mạch nhận. Nhận dữ liệu nhiệt độ, độ ẩm từ mạch phát thông qua NRF24L01. 4.Khối hiển thị . a.Khối LCD Sử dụng LCD 16x2 để hiển thị nhiệt độ, độ ẩm. b.Khối LED Sử dụng LED 7 THANH loại catot và IC 74HC595 để hiển thị nhiệt độ. II.Sơ đồ nguyên lý CHƯƠNG 4. KẾT QUẢ THỰC HIỆN 1.Sơ đồ mạch in a.Sơ đồ mặt trên b.Sơ đồ mặt dưới 2.Một số hình ảnh về sản phẩm Hình 9. Một số hình ảnh kết quả thu được CHƯƠNG 5. KẾT LUẬN Kết quả thu được sau đề tài này: Do kinh nghiệm còn ít và hạn chế về thời gian cho việc chỉnh sửa nên mạch có phát sinh một số lỗi. Ưu điểm : Mạch thực hiện được các chức năng chính theo yêu cầu. Mạch in đẹp. Sắp xếp linh kiện đẹp. Khuyết điểm của mạch: Mạch chạy chưa được ổn định. Hướng phát triển của đề tài này: Cải thiện sự ổn định hệ thống . Sử dụng led 7 đoạn để tăng khả năng quan sát của khối hiển thị. Thiết kế khối điều khiển thiết lập mức cảnh báo ngưỡng nhiệt độ, độ ẩm. TÀI LIỆU THAM KHẢO [1]DatasheetMSP430g2553: [2] MSP430 User’s Guide, Texas Instruments [3] Datasheet LCD 16x2, DS1307 [4] Các trang web trực tuyến khác: PHỤ LỤC Bên phát: #include #include "24L01.h" #include "Basic_config.h" #include "LCD.h" unsigned char RBuf[32]; unsigned char so[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f}; void main() { Config_stop_WDT(); // stop WDT, see description in Basic_config.c Config_Clocks(); P1DIR|=0x7f; P1SEL=0; // P1SEL2=0; P2SEL=0; // P2SEL2=0; init_74(); int k=0,t=0,n=0,a=0,l=0; init_NRF24L01(); RX_Mode(); RBuf[0]='3'; RBuf[1]='1'; RBuf[2]='6'; RBuf[3]='9'; RBuf[4]='8'; lcd_init(0); lcd_clear (); while(1) { a=nRF24L01_RxPacket(RBuf); if(a==1) { if(RBuf[0]>'2') t=1; else t=0; if(t==1) { if(k==0) { lcd_clear(); k=1; } lcd_gotoxy(0,0); lcd_puts("Nguy hiem"); n=0; } else { if(n==0) { lcd_clear(); n=1; } k=0; lcd_delay_ms(10); lcd_gotoxy(0,0); lcd_puts("Do am:"); lcd_gotoxy(9,0); lcd_putc(RBuf[2]); lcd_putc(RBuf[3]); lcd_putc('.'); lcd_putc(RBuf[4]); lcd_gotoxy(0,1); lcd_puts("Nhiet do:"); lcd_putc(RBuf[0]); lcd_putc(RBuf[1]); } truyen(0x39); truyen(0x63); truyen(so[RBuf[1]-0x30]); truyen(so[RBuf[0]-0x30]); lch1(); } delay_ms(8); RX_Mode(); //delay_ms(100); } } Bên nhận: #include #include "24L01.h" #include "Basic_config.h" #include "LCD.h" unsigned char RBuf[32]; unsigned char so[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f}; /* * main.c */ // ham lcd void main() { Config_stop_WDT(); // stop WDT, see description in Basic_config.c Config_Clocks(); P1DIR|=0x7f; P1SEL=0; // P1SEL2=0; P2SEL=0; // P2SEL2=0; init_74(); int k=0,t=0,n=0,a=0,l=0; init_NRF24L01(); RX_Mode(); RBuf[0]='3'; RBuf[1]='1'; RBuf[2]='6'; RBuf[3]='9'; RBuf[4]='8'; lcd_init(0); k=0; lcd_delay_ms(10); lcd_gotoxy(0,0); lcd_puts("Do am:"); lcd_gotoxy(9,0); lcd_putc(RBuf[2]); lcd_putc(RBuf[3]); lcd_putc('.'); lcd_putc(RBuf[4]); lcd_gotoxy(0,1); lcd_puts("Nhiet do:"); lcd_putc(RBuf[0]); lcd_putc(RBuf[1]); } truyen(0x39); truyen(0x63); truyen(so[RBuf[1]-0x30]); truyen(so[RBuf[0]-0x30]); lch1(); } delay_ms(8); RX_Mode(); //delay_ms(100); } } Code : LCD #include #include "LCD.h" #include "cofig.h" /**************************************************************************** #define LCD_RS P2_out -> _bit.b0 #define LCD_RS_DIR P2_dir -> _bit.b0 #define LCD_EN P2_out -> _bit.b1 #define LCD_EN_DIR P2_dir -> _bit.b1 // This driver just help you to "write" LCD, not to read LCD "status". // So that, you must pull your pin LCD_RW to GND (0V). #define LCD_DATA_4 P2_out -> _bit.b2 #define LCD_DATA_4_DIR P2_dir -> _bit.b2 #define LCD_DATA_5 P2_out -> _bit.b3 #define LCD_DATA_5_DIR P2_dir -> _bit.b3 #define LCD_DATA_6 P2_out -> _bit.b4 #define LCD_DATA_6_DIR P2_dir -> _bit.b4 #define LCD_DATA_7 P2_out -> _bit.b5 #define LCD_DATA_7_DIR P2_dir -> _bit.b5 void lcd_delay_us (unsigned long t) { int i; for (i = 0; i<t; i++ ) _delay_cycles(MCLK_F); } void lcd_delay_ms (unsigned long t) { int i; for (i = 0; i<t; i++ ) _delay_cycles(MCLK_F*1000); } //***************************************************************************** // Send a byte of data (rs == 1) or command (rs == 0) to LCD //***************************************************************************** void lcd_put_byte(unsigned char rs, unsigned char data) { LCD_RS = 0; if(rs) LCD_RS = 1; lcd_delay_us(20); LCD_EN = 0; // send the high nibble if (data&BIT4) LCD_DATA_4 = 1; else LCD_DATA_4 = 0; if (data&BIT5) LCD_DATA_5 = 1; else LCD_DATA_5 = 0; if (data&BIT6) LCD_DATA_6 = 1; else LCD_DATA_6 = 0; if (data&BIT7) LCD_DATA_7 = 1; else LCD_DATA_7 = 0; lcd_delay_us(20); LCD_EN = 1; lcd_delay_us(20); LCD_EN = 0; // send the low nibble if (data&BIT0) LCD_DATA_4 = 1; else LCD_DATA_4 = 0; if (data&BIT1) LCD_DATA_5 = 1; else LCD_DATA_5 = 0; if (data&BIT2) LCD_DATA_6 = 1; else LCD_DATA_6 = 0; if (data&BIT3) LCD_DATA_7 = 1; else LCD_DATA_7 = 0; lcd_delay_us(20); LCD_EN = 1; lcd_delay_us(20); LCD_EN = 0; } void lcd_init(unsigned char backlight_controlled) { // Set all signal pins as output LCD_RS_DIR = 1; LCD_EN_DIR = 1; LCD_DATA_4_DIR = 1; LCD_DATA_5_DIR = 1; LCD_DATA_6_DIR = 1; LCD_DATA_7_DIR = 1; LCD_RS = 0; LCD_EN = 0; lcd_delay_ms(200); // delay for power on // reset LCD lcd_put_byte(0,0x30); lcd_delay_ms(50); lcd_put_byte(0,0x30); lcd_delay_ms(50); lcd_put_byte(0,0x32); lcd_delay_ms(200); // delay for LCD reset lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,FOUR_BIT & LINES_5X7); // Set LCD type lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); // display off lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); // display on lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,0x01); // clear display and move cursor to home lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,SHIFT_CUR_LEFT); // cursor shift mode lcd_delay_ms(2); // wait for LCD lcd_put_byte(0,0x01); // clear display and move cursor to home lcd_delay_ms(2); // wait for LCD } void lcd_clear(void) { lcd_put_byte(0,0x01); // display off lcd_delay_ms(2); // wait for LCD } void lcd_gotoxy(unsigned char col, unsigned char row) { unsigned char address; if(row!=0) address=0x40; else address=0; address += col; lcd_put_byte(0,0x80|address); lcd_delay_ms(2); // wait for LCD } //***************************************************************************** // Put a writable character on LCD // If the character is '\f', clear the LCD // If the character is '\n', move cursor to the second line //***************************************************************************** void lcd_putc(char c) { switch(c){ case '\f': lcd_put_byte(0, 0x01); lcd_delay_ms(2); // wait for LCD break; case '\n': lcd_gotoxy(0, 0x01); break; default: lcd_put_byte(1, c); lcd_delay_ms(2); // wait for LCD break; } } //***************************************************************************** // Put a string s[] on LCD. // Please note that the string is ended with '/0' (or 0x00) //***************************************************************************** void lcd_puts(const char* s) { while(*s){ lcd_putc(*s++); } } //***************************************************************************** // Clear LCD. Put string s1[] on line 1 and string s2[] on line 2 //***************************************************************************** void lcd_clr_puts (const char* s1 , const char* s2) { lcd_clear (); lcd_puts (s1); lcd_gotoxy (0,1); lcd_puts (s2); } void lcd_put_num (unsigned long val, char dec, unsigned char neg) { char i, j, digit,k; long total; long temp; for (i = 0, total = val; total > 0;i++) // count number total /= 10; total = i; if (neg !=0 ) lcd_putc ('-'); if ((total - dec) <=0) // if total < dec put 0.xxx lcd_putc('0'); else { for (i=0; i< (total-dec); i++) { temp = 1; for (j=1;j<(total-i);j++) temp *=10; digit = (val/temp)%10; lcd_putc(digit + 0x30); } } if (dec > 0) { lcd_putc('.'); if ( (dec - total)> 0) // ex: val = 55; dec = 3 put 0.055 { for ( i = 0; i < (dec-total);i++) lcd_putc('0'); k = 0; } else k = total - dec; for (i=k; i< total; i++) { temp = 1; for (j=1;j<(total-i);j++) temp *=10; digit = (val/temp)%10; lcd_putc(digit + 0x30); } } } Code NRF: #include #include "24L01.h" #include "Basic_config.h" #define set_CE (P1OUT|=BIT4) #define clear_CE (P1OUT&=~BIT4) #define set_CSN (P1OUT|=BIT3) #define clear_CSN (P1OUT&=~BIT3) #define set_SCK (P1OUT|=BIT5) #define clear_SCK (P1OUT&=~BIT5) #define set_MOSI (P1OUT|=BIT6) #define clear_MOSI (P1OUT&=~BIT6) #define set_MISO (P1OUT|=BIT7) #define clear_MISO (P1OUT&=~BIT7) #define TX_ADR_WIDTH 5 // 5byte CHIEU RONG DIA CHI GUI #define RX_ADR_WIDTH 5 // 5byte CHIEU RONG DIA CHI NHAN #define TX_PLD_WIDTH 32 // 20byte CHIEU RONG GUI #define RX_PLD_WIDTH 32 // 20byte CHIEU RONG NHAN uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; // XAC DINH 1 DIA CHI TX TINH uchar RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; // XAC DINH 1 DIA CHI RX TINH uchar TX_BUF[TX_PLD_WIDTH]; uchar RX_BUF[TX_PLD_WIDTH]; void SpiWrite(uchar byte) { uchar i;//BIEN i clear_SCK;//SCK=0 delay_us(1);//TRI HOAN 1us for(i=0;i<8;i++)//VONG LAP 8 LAN DE VIET DU LIEU 1 BYTE RA CHAN MOSI(P1OUT&BIT6) { if((byte&BIT7)==BIT7)//NEU BIT 7 CUA DU LIEU byte CAN VIET =1 set_MOSI;// CHO MOSI=1 else clear_MOSI;// CON KHONG THI CHO MOSI=0 set_SCK;//SCK=1 delay_us(2);//TRI HOAN 2us byte=byte<<1;//XOAY TRAI DU LIEU byte CAN VIET SANG TRAI 1 BIT DE TRUYEN BIT KE TIEP clear_SCK;//SCK=0 delay_us(2);//TRI HOAN 2us } delay_us(1);//TRI HOAN 1us } uchar SpiRead(void) { uchar i;// BIEN i uchar temp=0; // BIEN temp = 0 clear_SCK; // SCK=0 delay_us(2);// TRI HOAN 2us for(i=0;i<8;i++)// VONG LAP 8 LAN DE DOC DU LIEU 1 BYTE TREN CHAN MISO (P1IN&BIT7) { set_SCK;// SCK=1 delay_us(2);//TRI HOAN 2us temp=temp<<1;//XOAY TRAI BIEN temp 1 BIT if((P1IN&BIT7)==BIT7)//NEU DU LIEU CHAN MISO=1 temp|=0x01;//THI CHO BIT THAP NHAT =1 clear_SCK;//SCK=0 delay_us(2);//TRI HOAN 2us } delay_us(2);//TRI HOAN 2us return temp;// TRA VE GIA TRI temp SAU KHI DOC DU 8 BIT } void SpiWriteReg(uchar SpiCommand,uchar Content)//GHI LENH VA NOI DUNG VAO THANH GHI { set_CSN;//CSN=1 clear_CSN;//CSN=0 SpiWrite(SpiCommand);//VIET 1 BYTE LENH SPI SpiWrite(Content);//VIET 1 BYTE NOI DUNG set_CSN;//CSN=1 } uchar SpiReadReg(uchar REG) //DOC GIA TRI CUA 1 THANH GHI REG { uchar REGValue;//BIEN REGValue set_CSN;//CSN=1 clear_CSN; //CSN=0 SpiWrite(REG);//VIET 1 BYTE DIA CHI VAO THANH GHI "REG" CUA 24L01 REGValue=SpiRead();//DOC 1 BYTE DU LIEU TU 24L01 VE VA LUU VAO REGValue set_CSN;//CSN=1 return REGValue;//TRA VE GIA TRI CHO REGValue } void SPI_READ_BUF(uchar reg,uchar *BUF, uchar bytes) { uchar i;//BIEN i set_CSN;//CSN=1 clear_CSN;//CSN=0 SpiWrite(reg);//VIET GIA TRI reg for(i=0;i<bytes;i++)//VONG LAP bytes LAN, VOI bytes DUOC DINH TRUOC BUF[i]=SpiRead();//LUU GIA TRI VAO MANG BUF set_CSN;//CSN=1 } void SPI_WRITE_BUF(uchar reg,uchar *BUF, uchar bytes) { uchar i;//BIEN i set_CSN;//CSN=1 clear_CSN;//CSN=0 SpiWrite(reg);//VIET GIA TRI reg for(i=0;i<bytes;i++)//VONG LAP bytes LAN, VOI bytes DUOC DINH TRUOC SpiWrite(*BUF++);//VIET GIA TRI BYTE BUF set_CSN;//CSN=1 } void init_NRF24L01() { clear_CE; set_CSN; clear_SCK; SPI_WRITE_BUF(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //GUI DIA CHI TX nRF24L01 SPI_WRITE_BUF(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //THIET LAP KENH 0 SAU DO GIAI QUYET CAC DIA CHI TX SpiWriteReg(WRITE_REG+EN_AA,0x01); //THIET LAP KENH 0 NEN DUOC TU DONG SpiWriteReg(WRITE_REG+EN_RXADDR,0x01); //TRUY CAP KENH 0 CHO PHEP ? SpiWriteReg(WRITE_REG+RF_CH,0); // CHON KENH TAN SO RF 40 SpiWriteReg(WRITE_REG+RX_PW_P0,RX_PLD_WIDTH); //THIET LAP DE CHON CHIEU DAI VA CHIEU DAI LIE? SpiWriteReg(WRITE_REG+RF_SETUP,0x07); // TX_PWR:0dBm, Datarate:1Mbps, KHUECH DAI TIENG ON THAP TANG? SpiWriteReg(WRITE_REG+CONFIG,0x0e); // THIET LAP CONFIG CRC ,DE TAO RA DIEN NANG LUONG PWR_UP VE CHE DO PHAT //SpiWriteReg(WRITE_REG+CONFIG,0x0f); //THIET LAP VOI THANH GHI CRC CHO PHEP PWR_UP delay_us(16000); } void TX_Mode(uchar *BUF) { clear_CE; SPI_WRITE_BUF(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // GUI DIA CHI TX nRF24L01 SPI_WRITE_BUF(WR_TX_PLD,BUF,TX_PLD_WIDTH); //GHI DU LIEU VAO THANH GHI TX_PLD SpiWriteReg(WRITE_REG+CONFIG,0x0e); //THIET LAP VOI THANH GHI CRC DUOC KICH HOAT, PWR_UP QUYEN LUC TRONG CHE DO TRUYEN set_CE; delay_us(8000); set_CE; delay_us(8000); clear_CE; } void RX_Mode() { clear_CE; SpiWriteReg(WRITE_REG+CONFIG,0x0f); // THIET LAP KICH HOAT THANH GHI CRC, PWR_UP, SAU DO CHE DO set_CE; delay_us(16000); } uchar nRF24L01_RxPacket(uchar *BUF) { uchar flag,sta; sta=SpiReadReg(STATUS); //DOC TRANG THAI THANH GHI STATUS if((sta&RX_DR)==RX_DR) //RX_DR==1 CHO BIET { clear_CE; // VAO CHE DO STAND BY SPI_READ_BUF(RD_RX_PLD,BUF,TX_PLD_WIDTH); // DOC TRONG THANH GHI RX_FIFO flag = 1; // SAU DO KET THUC CHO BIET NHAN DUOC } else flag = 0; SpiWriteReg(WRITE_REG+STATUS,sta); //CO NGAT RO RANG return flag; }

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

  • docxbai_tap_lon_thiet_ke_mach_do_nhiet_do_do_am_su_dung_msp430g2.docx