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 Đếm thời gian Timer0, Dùng timer0 + Xử lý quét led 7 đoạn
Blog Đếm thời gian Timer0, Dùng timer0 + Xử lý quét led 7 đoạn
Đề bài đếm thời gian Timer0:
Bài giải đếm thời gian Timer0:
Phần cứng chương trình đếm thời gian Timer0:
- Đề yêu cầu đếm thời gian bằng timer0 vì vậy phải sử dụng và tính toán timer0 để tạo ra thời gian chính xác nhất.
- Quét 4 led 7 đoạn Anot chung sẽ giúp tối ưu được phần cứng nhưng phầm mềm phải hiểu rõ thì mới có thể hoạt động ổn định. Các chân Anot chung phải sử dụng tranzitor pnp và tùy theo dòng cung cấp cho led mà chọn pnp cho phù hợp, thường được sử dụng chân A1015.
- Led đơn được sử dụng nhấp nháy 1Hz, khi sử dụng lưu ý phải tính toán giá trị trở 330 hạn dòng cho led.
- Sử dụng dao động ngoài thạch anh 20M gắn vào chân OSC1 OSC2.
- 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 Pic16F877 Led đơn Led đơn Điện trở Điện trở Nút nhấn Nút nhấn Thạch anh Thạch anh Led 7 đoạn Anot Led 7 đoạn Anot Tranzitor A1015 Tranzitor A1015
Ủng hộ mình bằng cách Donate qua momo: 0967551477.
Phần mềm đếm thời gian Timer0:
Khai báo thư viện tiền sử lý của đếm thời gian Timer0:
- Vi điều khiển hiện tại mình đan dùng là Pic16F877A
- Hiện đan dùng thạch anh ngoài và thạch anh ngoài 20M bằng lệnh #Fuses hs và #delay(clock=20M).
- Khi sử dụng timer0 phải biết được địa chỉ thanh ghi của biến cờ tràn. Với timer0 thì địa chỉ là 0x0b.2 tên thanh ghi vị trí tương ứng là TMR0IF, ở đây khai báo trước để dễ nhớ nếu các bạn ngại định nghĩa thì có thể sử dụng trực tiếp hoặc đặt một tên khác để dễ 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.
- Vì đây là bài thi nên việc định nghĩa chân phụ thuộc rất lớn vào nội dung đề bài.
- Mã 7 đoạn là đoạn mã Anot: Cấu trúc lệnh cho bạn nào cần copy : ” unsigned int8 ma7doan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8.0x80,0x90,0xff} “.
- Tên khai báo biến thì cái này tùy thuộc vào chức năng để khai báo cho phù hợp.
- Khi không biết giá trị cụ thể là bao nhiêu thì chỉ cần khai báo signed int32 đây là biến 32bit có dấu vì vậy giá trị rất rộng không sợ sai yêu cầu của đề bài đưa ra.
Chương trình con đếm thời gian timer0:
- Chương trình con đầu tiên là hiển thị, vì ở đây là quét led 7 đoạn nên chỉ cần mỗi thời điểm chỉ cho một led 7 đoạn sáng đồng thời kích chân tương ứng, với tần số quét từ 50Hz trở lên thì hiệu ứng lưu ảnh trên mắt sẽ được ứng dụng tốt vì vậy sẽ không thấy được led bị nhấp nháy. Ở đây không hướng dẫn chi tiết về quét led chỉ nói khái quát sơ qua.
- Đây là một chương trình quét led đặt biệt hơn các chương trình khác, nếu sử dụng tạo trễ bằng delay như thông thường thì sẽ bị ảnh hưởng đến chương trình timer0 rất lớn, kéo theo sai số do timer0 đếm ra, vì vậy tận dụng đếm giây bằng timer0 để quét led. Mỗi lần timer0 tràn tạo được 0.2ms, cách tính phần chương trình chính, vì vậy khi tq nhỏ hơn 5 tức 1ms đầu thì quét led chân quét hàng chục của phút, tương tự khi tq nhỏ hơn 10 tức 1ms tiếp theo sẽ quét hàng đơn vị của phút, tương tự cho hai trường hợp còn lại, như vậy tần số quét led sẽ là 250Hz theo điều kiện lý tưởng, ở đây bỏ qua sai số của các chương trình khác.
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 đồng hồ timer Delay
- Bắt đầu chương trình chính phải khỏi rạ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 D, Port C, Port B kết nối vào led 7 đoạn và Led đơn nhấp nháy nên xuất dữ liệu nên khởi tạo là 0x00.
- Sử dụng timer0 để đếm chu kỳ tạo xung 0.2ms nên khai báo t0_internal và sử dụng bộ chia timer0 là 4. 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.
Gán giá trị ban đầu bằng 0 chuẩn bị cho chu kỳ đếm, nếu không gán giá trị sẽ Random trong dãy khai báo của các biến.
- Gọi hàm hiển thị để hiển thị quét led 7 đoạn với tần số 250Hz. Sau đó kiểm tra nếu biến cờ tràn TMR0IF=1 tức timer0 đã đếm đến ngưỡng 255 thì xóa cờ tràn cho TMR0IF=0 chuẩn bị cho chu kỳ mới, đồng thời khởi tạo giá trị ban đầu là 6 để đếm chu kỳ tiếp theo bằng 0.2ms. Sau 0.2ms thì biến tran và tq tăng lên một đơn vị, khi giá trị tràn đạt ngưỡng 2500 tức được 500ms thì bật led nhấp nháy sáng, ngược lại nếu đạt ngưỡng 4999 tức đếm được 2499 tức 499ms tiếp theo tắt led, và một lần tràn tiếp theo cũng tắt led sẽ tạo đủ 1Hz nhấp nháy led đơn, cho tran=0 chuẩn bị cho chu kỳ mới, sau đó tăng giá trị giay lên một đơn vị, kiểm tra nếu giây vượt 59 tức đủ một phút thì cho giay=0 chuẩn bị cho chu mới đếm giây và tăng phut lên một đơn vị, khi phut vượt ngưỡng 59 thì khởi tạo lại thời gian ban đầu.
Chúc các bạn có một kỳ thi thành công…!!!