1. Tóm tắt ý tưởng thiết kế:
- Gửi lệnh từ PC điều khiển chip
vd: Gửi SET+P0.0=1; -> Vđk sẽ set chân P0.0 lên mức 1, sau đó gửi chuỗi OK lên PC
Gửi GET+P0.0=?; -> Vđk sẽ đọc chân P0.0 và gửi kết quả lên PC, sau đó gửi chuỗi OK lên PC
Nếu lệnh gửi từ PC xuống ko nằm trong tập lệnh hoặc sai cú pháp, vđk sẽ gửi lên chuỗi Error
- Tất cả các lệnh đều kết thúc bằng dấu chấm phẩy ";", và ko dài quá "n" ký tự, "n" sẽ được qui định trước.
- Chỉ thực hiện một lệnh. Lệnh trước đó phải hoàn thành (hoàn tất việc gửi kết quả về PC) mới nhận lệnh tiếp theo.
- Sau khi thực hiện xong lệnh, nếu không nhận được lệnh khác từ PC, vđk sẽ đi vào chế độ nghỉ IDL nhằm tiết kiệm năng lượng.
- Chương trình viết bằng Keil C.
2. Tại sao lại chọn vđk P89V51RD2 và KeilC
- P89V51RD2 có bộ nhớ mở rộng: RAM là 1Kbytes và bộ nhớ code 64KBytes. Vì vậy thoải mái Code, khai báo biến xả láng, và dễ dàng mở rộng chương trình.
- P89V51RD2 còn cho phép nạp chương trình bằng bootloader thông qua RS232 lun, vì vậy phần cứng giao tiếp máy tính của chúng ta vô tình cũng dùng để nạp chương trình lun (2 in 1).
- KeilC là trình biên dịch thân thuộc của FAN 8051. Tối ưu hóa chương trình tốt, ít lỗi, nhưng viết code hơi cực.
3. Phần cứng
a. Nếu bạn nào chưa quen làm phần cứng có thể làm mạch đơn giản sau:
b. Còn đây là phần cứng mình dùng để thực hiện tut này.
*Sơ đồ nguyên lý và Mạch in:
Mạch gồm:
- IC 7085 - Ổn áp nguồn 5V, 1A
- Vi điều khiển 8051 (AT89S52 hoặc P89V51RD2)
- MAX232 - giao tiếp RS232 và nạp đối với P89V51RD2
- Jack nạp nối tiếp SPI đối với AT89S52, và dùng lun để mở rộng ngoại vi, chẳng hạn: Mở rộng ngõ ra bằng IC dịch, và đây là các Pin giao tiêp SPI của P89V51RD2.
- DS1307 - RealTime giao tiếp I2C
- LCD 16x2, giao tiếp 4 bit, điều khiển đèn nền (bật/tắt hoặc độ sáng).
- 1 modul thu phát RF - cái này trên Nhật Tảo bán nhiều lắm (loại 4 nút, khoảng cách chừng 15m, giá khoảng 50÷60 Nghìn VNĐ)
- 6 Relay 5V
- 5 nút nhấn + 1 nút Reset
- Trên board còn có một vị trí điều khiển bằng chạm tay nhưng thiết kế bị lỗi, các bạn tìm cách khắc phục giúp mình, nếu ko thì lúc thi công không cần gắn linh kiện cho khối này (khối có ngõ ra được đặt tên là "touch").
Cuối cùng, các bạn có thể down tại đây: P89V51RD2_RS232.rar
*Mạch sau khi thi công:
4. Phần mềm
Cốt lõi của chương trình gồm:
- Chương trình main: Đầu tiên nó sẽ đi thực hiện các khai báo và lệnh khởi tạo (biến, UART), sau đó sẽ thực hiện một lệnh duy nhất trong vòng lặp while là PCON |= 0x01; để ru vđk ngủ.
- Chương trình phục vụ ngắt Nhận/Phát UART đánh thức vđk nhận lệnh, tìm lệnh, thực hiện và gửi kết quả về PC.
- Một tập lệnh xây dựng sẵn. Mình sẽ demo một số lệnh như sau:
ACK; (Acknowlegement) Nếu nhận được lệnh này vđk sẽ trả lời là ACK.
WRP+Px=0xxx; (WRite Port) Ghi một số dạng Hex ra PORT
RDP+Px=?; (ReaD Port) Đọc Port và gửi kết quả về PC
SET+Px.x=x; (SET pin) Ghi mức logic ra PIN
GET+Px.x=?; (GET pin) Đọc mức logic của PIN
WRA+0xxx=0xxx; (WRite Address) Ghi một giá trị dạng Hex xuống bộ nhớ.
RDA+0xxx=?; (ReaD Address) Đọc một giá trị của ô nhớ.
*Cần chú ý:
-Trong hai lệnh WRA và RDA: Address không phải là địa chỉ của bộ nhớ RAM, mà là chỉ số của một phần tử mảng trên bộ nhớ RAM được sử dụng để lưu các biến dùng chung giữa vđk và PC.
-Nếu dùng lệnh SET để đưa 1 trong 2 PIN của module UART (P3.0 và P3.1) về mức 0 => Không thể giao tiếp với PC được nữa.
-Trong lệnh gửi từ PC xuống phải ko chứa các khoảng trống.
*Một số ví dụ:
Send: ACK;
Nhận: ACKOK
Send: WRP+P0=0x00;
Nhận: OK
Send: RDP+P0=?;
Nhận: 0x00OK
Send: SET+P0.0=1;
Nhận: OK;
Send: GET+P0.0=?;
Nhận: 1OK;
Send: WRA+0x00=0xAA;
Nhận: OK;
Send: RDA+0x00=?;
Nhận: 0xAAOK;
Send: ABC;
Nhận: Error
Code hoàn chỉnh, các bạn có thể down tại đây:
13/04/2012: Code_P89V51RD2_RS232.rar
Chú ý các bạn Down file mới nhất, các thắc mắc mình chỉ trả lời với file mới nhất. Mình sẽ cập nhật thường xuyên để có file Code đơn giản và dễ hiểu nhất.
Mong các bạn đóng góp ý kiến để bài viết hoàn chỉnh hơn!! Cảm ơn các bạn đã đọc.
- Gửi lệnh từ PC điều khiển chip
vd: Gửi SET+P0.0=1; -> Vđk sẽ set chân P0.0 lên mức 1, sau đó gửi chuỗi OK lên PC
Gửi GET+P0.0=?; -> Vđk sẽ đọc chân P0.0 và gửi kết quả lên PC, sau đó gửi chuỗi OK lên PC
Nếu lệnh gửi từ PC xuống ko nằm trong tập lệnh hoặc sai cú pháp, vđk sẽ gửi lên chuỗi Error
- Tất cả các lệnh đều kết thúc bằng dấu chấm phẩy ";", và ko dài quá "n" ký tự, "n" sẽ được qui định trước.
- Chỉ thực hiện một lệnh. Lệnh trước đó phải hoàn thành (hoàn tất việc gửi kết quả về PC) mới nhận lệnh tiếp theo.
- Sau khi thực hiện xong lệnh, nếu không nhận được lệnh khác từ PC, vđk sẽ đi vào chế độ nghỉ IDL nhằm tiết kiệm năng lượng.
- Chương trình viết bằng Keil C.
2. Tại sao lại chọn vđk P89V51RD2 và KeilC
- P89V51RD2 có bộ nhớ mở rộng: RAM là 1Kbytes và bộ nhớ code 64KBytes. Vì vậy thoải mái Code, khai báo biến xả láng, và dễ dàng mở rộng chương trình.
- P89V51RD2 còn cho phép nạp chương trình bằng bootloader thông qua RS232 lun, vì vậy phần cứng giao tiếp máy tính của chúng ta vô tình cũng dùng để nạp chương trình lun (2 in 1).
- KeilC là trình biên dịch thân thuộc của FAN 8051. Tối ưu hóa chương trình tốt, ít lỗi, nhưng viết code hơi cực.
3. Phần cứng
a. Nếu bạn nào chưa quen làm phần cứng có thể làm mạch đơn giản sau:
b. Còn đây là phần cứng mình dùng để thực hiện tut này.
*Sơ đồ nguyên lý và Mạch in:
Mạch gồm:
- IC 7085 - Ổn áp nguồn 5V, 1A
- Vi điều khiển 8051 (AT89S52 hoặc P89V51RD2)
- MAX232 - giao tiếp RS232 và nạp đối với P89V51RD2
- Jack nạp nối tiếp SPI đối với AT89S52, và dùng lun để mở rộng ngoại vi, chẳng hạn: Mở rộng ngõ ra bằng IC dịch, và đây là các Pin giao tiêp SPI của P89V51RD2.
- DS1307 - RealTime giao tiếp I2C
- LCD 16x2, giao tiếp 4 bit, điều khiển đèn nền (bật/tắt hoặc độ sáng).
- 1 modul thu phát RF - cái này trên Nhật Tảo bán nhiều lắm (loại 4 nút, khoảng cách chừng 15m, giá khoảng 50÷60 Nghìn VNĐ)
- 6 Relay 5V
- 5 nút nhấn + 1 nút Reset
- Trên board còn có một vị trí điều khiển bằng chạm tay nhưng thiết kế bị lỗi, các bạn tìm cách khắc phục giúp mình, nếu ko thì lúc thi công không cần gắn linh kiện cho khối này (khối có ngõ ra được đặt tên là "touch").
Cuối cùng, các bạn có thể down tại đây: P89V51RD2_RS232.rar
*Mạch sau khi thi công:
4. Phần mềm
Cốt lõi của chương trình gồm:
- Chương trình main: Đầu tiên nó sẽ đi thực hiện các khai báo và lệnh khởi tạo (biến, UART), sau đó sẽ thực hiện một lệnh duy nhất trong vòng lặp while là PCON |= 0x01; để ru vđk ngủ.
- Chương trình phục vụ ngắt Nhận/Phát UART đánh thức vđk nhận lệnh, tìm lệnh, thực hiện và gửi kết quả về PC.
- Một tập lệnh xây dựng sẵn. Mình sẽ demo một số lệnh như sau:
ACK; (Acknowlegement) Nếu nhận được lệnh này vđk sẽ trả lời là ACK.
WRP+Px=0xxx; (WRite Port) Ghi một số dạng Hex ra PORT
RDP+Px=?; (ReaD Port) Đọc Port và gửi kết quả về PC
SET+Px.x=x; (SET pin) Ghi mức logic ra PIN
GET+Px.x=?; (GET pin) Đọc mức logic của PIN
WRA+0xxx=0xxx; (WRite Address) Ghi một giá trị dạng Hex xuống bộ nhớ.
RDA+0xxx=?; (ReaD Address) Đọc một giá trị của ô nhớ.
*Cần chú ý:
-Trong hai lệnh WRA và RDA: Address không phải là địa chỉ của bộ nhớ RAM, mà là chỉ số của một phần tử mảng trên bộ nhớ RAM được sử dụng để lưu các biến dùng chung giữa vđk và PC.
-Nếu dùng lệnh SET để đưa 1 trong 2 PIN của module UART (P3.0 và P3.1) về mức 0 => Không thể giao tiếp với PC được nữa.
-Trong lệnh gửi từ PC xuống phải ko chứa các khoảng trống.
*Một số ví dụ:
Send: ACK;
Nhận: ACKOK
Send: WRP+P0=0x00;
Nhận: OK
Send: RDP+P0=?;
Nhận: 0x00OK
Send: SET+P0.0=1;
Nhận: OK;
Send: GET+P0.0=?;
Nhận: 1OK;
Send: WRA+0x00=0xAA;
Nhận: OK;
Send: RDA+0x00=?;
Nhận: 0xAAOK;
Send: ABC;
Nhận: Error
Code hoàn chỉnh, các bạn có thể down tại đây:
13/04/2012: Code_P89V51RD2_RS232.rar
Chú ý các bạn Down file mới nhất, các thắc mắc mình chỉ trả lời với file mới nhất. Mình sẽ cập nhật thường xuyên để có file Code đơn giản và dễ hiểu nhất.
Mong các bạn đóng góp ý kiến để bài viết hoàn chỉnh hơn!! Cảm ơn các bạn đã đọc.
Comment