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ết![khóa học lập trình vi điều khiển online](https://huynhnhattung.com/wp-content/uploads/2019/08/Lập-trình-Pic.png)
Table 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 sản phẩm Counter gửi lên máy tính qua UART RS232
Blog Đếm sản phẩm Counter gửi lên máy tính qua UART RS232
Đề bài Random ngẫu nhiên:
![Random-ngau-nhien-uart-led-7doan-dieu-khien-dong-co-ccp-pwm-nut-nhan-lap-trinh-pic-de-bai](https://huynhnhattung.com/wp-content/uploads/2021/07/Random-ngau-nhien-uart-led-7doan-dieu-khien-dong-co-ccp-pwm-nut-nhan-lap-trinh-pic-de-bai.png)
Bài giải Radom ngẫu nhiên:
Phần cứng chương trình random ngẫu nhiên:
- Xét trường hợp bên phát yêu cầu sử dụng 2 nút nhấn để điều khiển Random và dừng ở xung ngõ ra của động cơ bên thu.
- Hiển thị thời gian được quy định ra một Led 7 đoạn anot chung được nối vào Port D. Nếu làm mạch thực tế phải gắn trở cho led, cách tính trở 330 xem trong giáo trình thầy Nguyễn Đình Phú
- Việc sử dụng hai Vi điều khiển giao tiếp với nhau thông qua UART giúp tối ưu được chương trình và phần cứng. Khi giao tiếp UART thì kết nối sẽ chân RC6/TX của VĐK thứ nhất kết nối với chân RC7/RX VĐK thứ hai, ngược lại chân RC7/RX VĐK thứ nhất kết nối với chân RC6/TX của VĐK thứ hai. Chân RX có chức năng nhận dữ liệu, chân TX có chức năng truyền dữ liệu.
- Xét trường hợp bên thu điều khiển động cơ thông qua module L298, đây được xem là IC cách ly giữ 12V của động cơ với 5V của Vi điều khiển thông qua hai chân RC2/CCP1 và RC1/CCP2. Theo yêu cầu hệ thống điều khiển động cơ sử dụng điều chế độ rộng xung CCP PWM. Ở đây nếu không sử dụng PWM từ nhà sản xuất quy định sẵn trong thanh ghi có thể tự tạo PWM bằng cách sử dụng timer0 hoặc timer1, nhưng độ ổn định không cao bằng việc sử dụng đúng chức năng đã được quy định.
- 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 |
Led 7 đoạn | Led 7 đoạn |
Điện trở | Điện trở |
Nút nhấn | Nút nhấn |
Thạch anh | Thạch anh |
Led đơn | Led đơn |
Module L298 | Module L298 |
Phần mềm Random ngẫu nhiên:
Xét Vi điều khiển 1 tức bên phát Random ngẫu nhiên
Khai báo thư viện tiền sử lý của Random ngẫu nhiên:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887.
- Việc sử dụng hàm Random ngẫu nhiên bắt buộc phải trang bị thêm thư viện “#include <stdlib.h>” đây được xem là thư viện thuần C.
- Hiện dùng thạch anh nội và thạch anh nội khai báo 8M bằng lệnh #Fuses intrc_io và #delay(clock=8M).
- Khai báo giao tiếp UART chuẩn rs232 ” #use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)” gồm tốc độ truyền bằng 4800, không kiểm tra tính chắn lẻ, đồng thời dữ liệu truyền đi 8bit trong đó có 1bit STOP. Khi sử dụng UART bắt buộc phải dùng chân RC6/TX, RC7/RX
- Đị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.
- 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 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 chính Random ngẫu nhiên:
- 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 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 C có chân RC7/RX nhận tín hiệu từ máy tính gửi xuống nên đóng vai trò nhận tín hiệu vì vậy phải khởi tạo mức 1 nên khởi tạo là 0x80. Port D sử dụng xuất tiến hiệu cho led 7 đoạn vì vậy khởi tạo là 0x00.
Các giá trị ban đầu bằng 0. Việc gán gtt=gt để khi mới khởi động lên không kích hoạt gửi giá trị sang bên thu khi không có sự thay đổi giá trị, sau đó xuất giá trị ra Port D hiển thị số ban đầu.
- Kiểm tra nếu có nhấn nút Random, nếu có nhấn thì bắt đầu tạo ra giá trị thông qua hàm “gt= 0 + rand()%9;” đây là hàm tạo ra gt nằm trong đoạn từ [0,9]. Việc sử dụng do While giúp kiểm tra nếu giá trị trước đó bằng giá trị mới vừa tạo ra thì tiến hành Random lại đến khi có kết quả khác mới thoát. Điều kiện While(gtt==gt); chỉ sai khi gt được tạo ra khác gtt. Khi khác giá trị điều kiện While sai vòng lặp do While thoát sau đó gtt=gt; chuẩn bị cho chu kỳ mới, đồng thời gửi giá trị sang bên thu, Sử dụng %ld là truyền giá trị vào chuỗi String sau đó mới gửi đi, %ld giá trị là số nguyên từ 16bit trở đi.
- Nếu nhấn Stop thì gửi ký tự “S” sang bên thu. Cuối cùng xuất gt hiển thị ra một led 7 đoạn gán vào Port D.
Xét Vi điều khiển 2 tức bên thu Random ngẫu nhiên
Khai báo thư viện tiền sử lý của truyền nhận 2 Vi điều khiển:
- Vi điều khiển hiện tại mình đan dùng là Pic16F887.
- Hiện dùng thạch anh nội và thạch anh nội khai báo 8M bằng lệnh #Fuses intrc_io và #delay(clock=8M).
- Khai báo giao tiếp UART chuẩn rs232 ” #use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)” gồm tốc độ truyền bằng 4800, không kiểm tra tính chắn lẻ, đồng thời dữ liệu truyền đi 8bit trong đó có 1bit STOP. Khi sử dụng UART bắt buộc phải dùng chân RC6/TX, RC7/RX
- Đị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 chính Random ngẫu nhiên:
- 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 C có chân RC7/RX nhận tín hiệu từ máy tính gửi xuống nên đóng vai trò nhận tín hiệu, chân RC1/CCP2 và RC2/CCP1 là hai chân xuất tín hiệu điều khiển tốc độ của động cơ vì vậy phải khởi tạo mức 1 nên khởi tạo là 0x80.
- Các biến ban đầu gán bằng 0, nếu không gán giá trị ban đầu thì các biến sẽ Random một giá trị nằm trong giới hạn cho phép của biến đó.
- Khi sử dụng điều chế độ rộng xung do vi điều khiển hổ trợ thì sử dụng Timer2. Cách tính: Tần số yêu cầu T=1ms. PR2 = 1ms/((1/8M)*4*16)-1 = 124. Sử dụng bộ chia 16. Không thể sử dụng bộ chia 1 hay 4 vì giá trị tính ra sẽ lớn hơn 255 vượt ngưỡng tràn của timer2. Duty = 1ms/((1/8M)*16) = 500. Tức giá trị cực đại của duty=500. Theo đề yêu cầu giá trị phần trăm duty chạy từ 10% – 100%.
- Tắt động cơ khi mới khởi động.
- Nếu có dữ liệu gửi đến thì kbhit()=1, tiến hành nhận dữ liệu bằng biến data, lưu ý biến nhận phải khai báo là char vì giá trị gửi qua là ký tự.
Theo quy định bên phát nên nếu nhận được
- Giá trị là ký tự “S” thì gán tt=0 tức làm động cơ dừng, ngược lại nếu nhận ký tự từ “[0,9]” thì cho tt=1 tức khi có sự thay đổi giá trị khi Random thì tự động mở động cơ chạy vì theo yêu cầu đưa ra chỉ có nút nhấn Stop bên phát, đồng thời tính giá trị cd=data-0x30; ký tự nhận về thuộc giá trị của bảng mã ASCII vì vậy phải chuyển từ ký tự sang số thì -0x30; Tra bảng để hiểu rõ hơn.
- Theo yêu cầu khi nhận được ký tự “0” thì khởi tạo duty=500 tức cực đại, công thức tính duty ở trên cứ cd tăng một giá trị thì duty tăng 50.
- Kiểm tra nếu tt=0 thì tắt động cơ, ngược lại thì cho phép chạy động cơ tại chân RC2/CCP1 với mức duty được tính dựa vào hàm Random bên phát.
Chúc các bạn có một kỳ thi thành công…!!!