Mua linh kiện điện tử tại Điện tử Nhật Tùng
Khóa học Vi điều khiển có phí Hình thức học: Video hoặc Kèm trực tiếp ===>>>> Kích vào hình để được biết thêm chi tiếtTable of Contents
Tải File bài giải
Pass giải nén: Huynhnhattung.com
===>>> Nếu bạn chưa có phần mềm giải nén:
Video Tạo tần số Timer0, LM35 + Counter1 + Nút nhấn + LCD1602
Blog Tạo tần số Timer0, LM35 + Counter1 + Nút nhấn + LCD1602
Đề bài tạo tần số Timer0:
Bài giải tạo tần số Timer0:
Phần cứng chương trình tạo tần số Timer0:
- Đầu tiên yêu cầu đưa ra có nhiệt độ LM35 vì vậy bắt buộc phải gắn vào chân ANxx tức chân đọc tín hiệu Analog chuyển sang Digital.
- Hệ thống có chương trình đếm Counter1 vì vậy phải kết nối vào chân RC1/T1CKI . Khi gắn mạch thực tế các bạn nên dùng cảm biến hồng ngoại hoặc cảm biến quang để đếm giá trị.
- Hiển thị LCD1602 dùng giao tiếp 4bit sẽ giúp tối ưu tốc phần cứng hơn, và việc sử dụng thư viện do phần mềm hổ trợ cũng là một cách tối ưu chương trình khá tốt.
- Nút nhấn RUN và STOP dùng để cho phép đếm phát xung từ ngắt timer0 và đếm xung từ Counter1.
- Các linh kiện chính cần sử dụng tham khảo tại.
Thông số kỹ thuật Mua Linh kiện Pic16F887 Pic16F887 LCD1602 LCD1602 Điện trở Điện trở Nút nhấn Nút nhấn Thạch anh Thạch anh Led đơn Led đơn Nhiệt độ LM35 Nhiệt độ LM35
Phần mềm tạo tần số Timer0:
Khai báo thư viện tiền sử lý của tạo tần số Timer0:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887
- Theo yêu cầu hệ thống có đọc giá trị ADC vì vậy phải khai báo ADC bằng lệnh #device adc=10 tức sử dụng bộ ADC 10bit. Ngoài ra có thể chọn ADC 8bit và 16bit.
- Hiện dùng thạch anh ngoài và thạch anh ngoài khai báo 20M bằng lệnh #Fuses hs và #delay(clock=20M).
- Thư viện LCD1602 sử dụng 4bit, thư viện sử dụng do phần mềm hổ trợ. Giúp đơn giản trong quá trình lập trình hơn.
- Định nghĩa chân: tùy theo chức năng của chân mà tên định nghĩa được bám sát vào nội dung đan thực hiện.
- Tên khai báo biến phụ thuộc vào chức năng để khai báo cho phù hợp.
- Khi các biến không biết được giá trị cuối thì nên khai báo signed int32 tức khai báo biến có dấu 32bit, lúc này giá trị rất rộng không sợ bị thiếu.
Chương trình con tạo tần số timer0:
Chương trình ngắt Timer0
- Chương trình ngắt Timer0 sảy ra khi đạt giá trị tràn, theo cách tính thì mỗi lần tràn thì đạt ngưỡng 0.2ms.
- Khi tt=1 tức cho phép chương trình tạo xung hoạt động, khi tràn khởi tạo giá trị ban đầu là 6 cách tính xem dưới phần chương trình chính.
- Khi bdn tăng 1 đơn vị tức tăng được 0.2ms vì vậy với chu kỳ 10ms và 60% thì sẽ có 6ms ở mức cao và 4ms ở mức thấp. Nếu bdn nhỏ hơn hoặc bằng 30 thì xuất ngõ ra mức out là mức cao tính như sau 30 x 0.2ms = 6ms, ngược lại phần còn lại 20 x 0.2ms = 4ms sẽ ở mức thấp, khi vượt ngưỡng 10ms chu kỳ thì cho bdn=0 chuẩn bị cho chu kỳ mới.
- Sử dụng hàm output_toggle(Pin_e0); dùng để đảo trạng thái của chân xuất xung, đây là một hàm đặt biệt do phần mềm hổ trợ, thông thường muốn đảo thì sử dụng biến trạng thái 1bit kiểm tra việc tạo xung 0.2ms có chính xác không.
Chương trình hiển thị lcd1602
- Theo yêu cầu đề bài việc định vị trí hiển thị theo hình của yêu cầu. Khi khởi tạo là lcd_gotoxy(1,1); hoặc lcd_gotoxy(10,1); là cần xuất dữ liệu ra LCD1602 vị trí hàng 1 cột 10. Tương tự cho các vị trí khác chỉ cần xem định vị theo yêu cầu.
- Khi các phép chia t/100, t/10%10, t%10 đây là phương pháp tách số, lý do mỗi ô của LCD1602 chỉ hiển thị một ký tự duy nhất tại một thời điểm nhất định. Ví dụ 123 là một số nhưng có 3 giá trị. Sau khi tách số xong đem +0x30 chuyển giá trị thập phân sang bảng mã ASCII. Mã lệnh 0xdf là dấu độ trong bảng mã ASCII, mọi thông tin các bạn tra bảng sẽ hiểu rõ hơn.
Chương trình chính thực hiện toàn bộ hoạt động của vi điều khiển dùng tạo tần số Timer0
- Bắt đầu chương trình chính phải khởi tạo ngõ vào ra cho vi điều khiển. Một chân của vi điều khiển thì làm nhiệm vụ I/O vì thế phải khỏi tạo. Port A, Port C dùng cho nhiệt độ LM35 và cảm biến đọc xung Counter1 để đưa vào Vi điều khiển vì thế khởi tạo giá trị là 0xff hoặc 0x01 Port D kết nối với màn hình LCD1602 đưa tín hiệu từ Vi điều khiển ra ngoài nên khởi tạo là 0x00. Port E sử dụng để tạo xung của Ngắt Timer0 nên xuất giá trị ra ngoài vì vậy khởi tạo là 0x00;
- Sử dụng ADC khởi tạo bộ chia 32 để số lần đọc ADC trên 1s được xem nhỏ nhất. Yêu cầu sử dụng tín hiệu chân AN0 đọc nhiệt độ LM35 đồng thời khởi tạo kênh 0.
- Sử dụng timer1 để đếm xung Counter1 nên khai báo t1_external tức là lấy xung đếm từ bên ngoài cụ thể từ chân RC0/T1CKI, và bắt đầu giá trị bằng 0.
- Sử dụng timer0 để đếm chu kỳ tạo xung 10ms nên khai báo t0_internal và sử dụng bộ chia timer0 là 2. từ đó suy ra cách tính: 20M/4=5M sử dụng bộ chia 4 là chia của phần cứng do nhà sản xuất quy định. 5M/4=1.25M sử dụng bộ chia 2 của timer0, từ đó suy ra f = 1.25M => T = 0.8uS. Timer0 đếm 8bit => 2^8 = 256 xung => t0 max = 0.8uS x 256 = 0.2048ms. Chọn thời gian tràn timer0 là 0.2ms => bắt đầu đếm từ 6.
Khai báo ngắt timer0 gồm mã lệnh Global là cho phép toàn bộ chương trình ngắt hoạt động thường được gọi là ngắt toàn cục, khởi tạo ngắt timer0 dùng mã lệnh INT_TIMER0 cho phép ngắt timer0 hoạt động.
- Tiến hành đọc nhiệt độ về, vì không yêu cầu đọc trung bình nên chỉ cần đọc trực tiếp giá trị, sau khi đọc xong chia 2.046 đây là độ lệch độ phân giải của Vi điều khiển với độ phân giải của nhiệt độ LM35, các bạn có thể tham khảo cách tính tại giáo trình của thầy Nguyễn Đình Phú.
- Kiểm tra nếu có nhấn RUN thì cho tt=1 tức cho phép hệ thống hoạt động, khi nhấn STOP thì cho tt=0 tức dừng hệ thống phát xung từ ngắt timer0 đồng thời dừng hệ thống nhận xung từ Counter1.
- Nếu tt=1 thì báo màn hình LCD1602 hiển thị RUN đồng thời kiểm tra nếu nhiệt độ lớn hơn 50 độ thì cho phép đếm xung COUNTER1 từ chân RC0/T1CKI, khi giá trị vượt ngưỡng 100 thì khởi tạo timer1 về 1 đồng thời tăng box lên 1 đơn vị vì theo yêu cầu đưa ra cứ 100 sản phẩm thì được một thùng.
- Cuối cùng hiển thị toàn bộ thông tin ra màn hình LCD1602 thông qua hàm hienthi(); và tạo trễ 200ms sau mỗi lần thực hiện hết một chương trình.
Chúc các bạn có một kỳ thi thành công…!!!