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ở rộng 7447, Đếm xung timer0 hiển thị 4led 7đoạn
Blog Mở rộng 7447, Đếm xung timer0 hiển thị 4led 7đoạn
Đề bài mở rộng 7447:
Bài giải mở rộng 7447:
Phần cứng chương trình mở rộng 7447:
- Đề yêu cầu sử dụng phương pháp mở rộng cho 4led 7đoạn bằng ic chuyển đổi BCD sang mã7 đoạn 7447.
- Sử dụng dao động ngoài thạch anh 4M gắn vào chân OSC1 OSC2. Đây là mô phỏng nên mình lười không gắn vào.
- Led 7 đoạn sử dụng loại anot chung, đồng thời điện trở kèm theo là 330Ω khi làm thực tế các bạn gắn trở vào tránh bị cháy led, cách tính các bạn có thể tham khảo sách giáo trình Vi điều khiển thầy Nguyễn Đình Phú bài led đơn.
Phần mềm mở rộng 7447:
Khai báo thư viện tiền sử lý của ngắt Port B:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887
- Hiện đan dùng thạch anh ngoài và thạch anh ngoài 4M bằng lệnh #Fuses hs và #delay(clock=4M)
- Vì mã 7đoạn theo bảng trạng thái của IC mở rộng 7447 nên chỉ cần khai báo từ 0, đến 9. Thật ra việc này không cần thiết vì khi tách số đã cho ra được mã thập phân. Việc khai báo chỉ cho thấy được rõ cách hoạt động của IC mở rộng 7447.
- Khai báo biến phục vụ đếm Counter và giá trị sau khi tăng. Theo yêu cầu đưa ra khi có một sản phẩm đi qua thì tăng giá trị sản phẩm lên 50 lần.
Chương trình con xuất dữ liệu ra 4led 7đoạn bằng mở rộng 7447:
- Đầu tiên khai báo 4 giá trị tạm thời là so1, so2, so3, so4. Sau đó việc sử dụng được phép truyền tham số vào.
- Khai báo các biến y1, y2, y3, y4, yc, yd là biến cục bộ, chỉ được sử dụng trong chương trình con xuat_dl_4so(unsigned int8 so1,so2,so3,so4);
- Khi mở rộng 7447 số BCD có 16 trạng thái đại diện cho 16 mã 7 đoạn. Mà một Port của vi điều khiển gắn vào 2 IC 7447 nên phải tách 4bit thấp cho IC thứ nhất, và sử dụng 4bit cao cho IC thứ hai.
- Ví dụ giá trị so1 = 0000 1010 khi gán y1=so1 thì giá trị lấy được vẫn là 0000 1010. Nhưng giá trị so2 = 0000 0110 thì muốn lấy được giá trị 0110 gán cho y2 trước hết phải dịch <<4 dữ liệu 0000 0110 ta được 0110 0000 suy ra y2 = 0110 0000;
- Muốn xuất giá trị ra một port và so1 đại diện cho 4bit thấp, so2 đại diện cho 4bit cao chỉ cần lấy yc=y1|y2 => yc = 0110 1010; Khi xuất giá trị yc ra thì 4bit thấp đã được gán giá trị cho IC 7447 thứ nhất, còn 4bit cao gán giá trị cho IC thứ hai theo nguyên lý đã đưa ra. Tương tự cho 2 số còn lại.
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 mở rộng 7447
- 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 B dùng cho nút nhấn để đưa vào Vi điều khiển vì thế khởi tạo giá trị là 0xff, Port D, Port C xuất cho led đơn tức đưa tín hiệu từ Vi điều khiển ra ngoài nên khởi tạo là 0x00.
- Khởi tạo timer0 Counter0 là đếm xung ngoài bằng lệnh t0_ext_h_to_l và sử dụng bộ chia 1, vì mỗi lần xung ngoài đưa vào chỉ có 1 xung nên bộ chia chỉ chọn được chia 1. Việc sử dụng hàm t0_div_1 là không cần thiết vì mặc định không khai báo là chia 1, ở đây khai báo để nói lên nội dung của đếm Counter0.
- Bắt đầu đếm giá trị trả về bằng 0 và chờ tín hiệu từ chân RA4 gửi vào.
- Khi nhận một xung từ chân RA4 thì hàm get_timer0(); tăng lên một giá trị, sau đó gán giá trị đó cho biến dem. Vì vậy biến dem bị phụ thuộc vào giá trị của Counter0.
- Theo yêu cầu đề bài đưa ra, khi nhận được một xung thì giá trị sẽ tăng lên 50 lần.
- Nếu số lượng sp lớn hơn 1000 cho các giá trị về 0 đồng thời phải khởi tạo lại giá trị ban đầu cho Counter0.
- Sau đó xuất các giá trị hàng nghìn, trăm, chục, đơn vị ra cho 4 led 7 đoạn theo chương trình con đã viết ở trên bằng cách giải mã và truyền tham số vào.
Chúc các bạn có một kỳ thi thành công…!!!