Lâu quá mới lên lại hehe.
Hôm nay Electronics gửi đến các bạn mạch giao tiếp COM với PIC
1. COM (9 chân ):
Ta chỉ chú tâm vào 3 chân dùng thôi nhé, TXD,RXD,GND
Chức năng của các chân như sau ( chuẩn RS232)
+ chân 1 : Data Carrier Detect (DCD) : Phát tín hiệu mang dữ liệu
+ chân 2: Receive Data (RxD) : Nhận dữ liệu
+ chân 3 : Transmit Data (TxD) : Truyền dữ liệu
+ chân 4 : Data Termial Ready (DTR) : Đầu cuối dữ liệu sẵn sàng được kích hoạt bởi bộ phận khi muốn truyền dữ liệu
+ chân 5 : Singal Ground ( SG) : Mass của tín hiệu
+ chân 6 : Data Set Ready (DSR) : Dữ liệu sẵn sàng, được kích hoạt bởi bộ truyền khi nó sẵn sàng nhận dữ liệu
+ chân 7 : Request to Send : yêu cầu gửi,bô truyền đặt đường này lên mức hoạt động khi sẵn sàng truyền dữ liệu
+ chân 8 : Clear To Send (CTS) : Xóa để gửi ,bô nhận đặt đường này lên mức kích hoạt động để thông báo cho bộ truyền là nó sẵn sàng nhận tín hiệu
+ chân 9 : Ring Indicate (RI) : Báo chuông cho biết là bộ nhận đang nhận tín hiệu rung chuông
2.PIC 18F4550
Cái này tương tự như các loại 18f khác thôi, thằng này có thêm chức năng nhiều hơn, ưu việt hơn mấy em khác.
Cụ thể:
Chân 26,27 (RX,TX) giao tiếp cổng COM qua MAX232. (cái này ae search trên google nhé)
Chân 23,24 (D-,D+) nhận kết nối từ USB
Giao tiếp qua UART,I2C,...
Chương trính :Đây là chương trình giao tiếp điều khiển LED qua cổng COM máy tính.
khi ta nhấn SW1,SW2 thì trên màn hình máy tính hiển thị SW tương ứng
Khi nhân SW3 thì hiển thị SW3 + số lần nhấn.
Dùng Terminal mô phỏng giao tiếp.Khi gửi lệnh 1 từ máy tính vào PIC thì LED1 sáng,2 LED1 tắt,3 LED2 sáng, 4 LED2 tắt.
Code: chạy với MPLAB X 3.45
add source vào nữa nhé!!!:
Links tải Full CODE:
/*
* File: main.c
* Author: electronics
*
* Created on 12 Dec 2016, 4:55 PM
*/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "usart.h"
#include "pin_manager.h"
#include "lcd.h"
#include "config.c" // Cau hinh chuc nang cho vi dieu khien
#define _XTAL_FREQ 20000000
#define baud_rate 9600
void main(void)
{
unsigned char ReceiveData;
unsigned char TransmitData[] = "Welcome to COM Port Communication\r\n";
unsigned char SW1[] = "SW1";
unsigned char SW2[] = "SW2";
unsigned char SW[] = "SW3";
unsigned char count = 0; // Chua so lan nhan SW (0-255)
unsigned char buf_val[3]; // Chua so lan nhan SW o dang chuoi so.
unsigned char buf_string[]; // Chua Ma nhan dang SW3 + So lan nhan SW o dang chuoi so.
pin_manager_init(); // Cau hinh chan PIC
lcd_init(); // Cau hinh LCD
printf("\f%s\n%s","Serial Interface","COM - PIC18F4550");
// Cau hinh USART
// USART_TX_INT_OFF: Ngat truyen du lieu bat (ON) / tat (OFF)
// USART_RX_INT_OFF: Ngat nhan du lieu bat (ON) / tat (OFF)
// USART_ASYNCH_MODE: Che do Bat dong bo (ASYNCH) / Dong bo (SYNCH)
// USART_EIGHT_BIT: So bit truyen/nhan 8-bit (EIGHT) / 9-bit(NINE)
// USART_CONT_RX: Nhan du lieu lan luot (SINLGE) / lien tuc (CONT)
// USART_BRGH_HIGH: Toc do baud cao (HIGH) / thap (LOW)
// USART_ADDEN_OFF: Cho phep (ON) / Cam (OFF) do tim dia chi
// spbrg: Gia tri qui dinh toc do truyen du lieu
// Baud rate:
// * High: Baud = Fosc/[16*(spbrg+1)] hoac spbrg = [Fosc/(16*Baud)]-1
// * Low: Baud = Fosc/[64*(spbrg+1)] hoac spbrg = [Fosc/(64*Baud)]-1
unsigned long spbrg = ((_XTAL_FREQ/16/baud_rate)-1); // Xac dinh toc do truyen
OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH & USART_ADDEN_OFF, spbrg);
while(BusyUSART()); // Kiem tra bao ban cua UART
putsUSART(TransmitData); // Truyen du lieu qua UART
while(1)
{
//************************************
ReceiveData = ReadUSART(); // Doc du lieu tu UART
switch(ReceiveData)
{
case '1':
LATEbits.LE0 = 1;
break;
case '2':
LATEbits.LE0 = 0;
break;
case '3':
LATEbits.LE1 = 1;
break;
case '4':
LATEbits.LE1 = 0;
break;
}
//************************************
if(PORTBbits.RB0 == 0)
{
while(PORTBbits.RB0 == 0);
strcpy(buf_string, SW1); // Dat lai ma nhan dang cho SW.
putsUSART(strcat(buf_string,buf_val)); // Truyen thong tin qua PC, SW nhan.
}
if(PORTBbits.RB1 == 0)
{
while(PORTBbits.RB1 == 0);
strcpy(buf_string, SW2); // Dat lai ma nhan dang cho SW.
putsUSART(strcat(buf_string,buf_val)); // Truyen thong tin qua PC, SW nhan.
}
if(PORTBbits.RB2 == 0)
{
while(PORTBbits.RB2 == 0);
count++;
itoa(buf_val, count, 99); // Doi so lan nhan phim thanh chuoi de truyen di.
strcpy(buf_string, SW); // Dat lai ma nhan dang cho SW.
putsUSART(strcat(buf_string,buf_val)); // Truyen thong tin qua PC, SW nhan.
}
}
}