Đây là chương trình khi PC gửi dữ liệu đến PIC thì PIC sẽ phản hồi lại kí tự mà nó đã nhận được. Là một phần trong bài tập lớn của tôi nên tôi sẽ post dần lên cho anh em tham khảo và cho ý kiến về độ tối ưu của chương trình.
Code:
/*========================================================
; Ten chuong trinh : giao tiep USART voi PC, nhan duoc thi hien thi lai
; Nguoi thuc hien : ngohaibac
; Ngay thuc hien :
; Phien ban : 1.0
; Mo ta phan cung : Dung PIC16F877A - thach anh 20MHz
; chan RC7/TX noi voi chan R1OUT cua MAX232
; chan RC6/RX noi voi chan T1IN cua MAX232
;----------------------------------------------------------------
; Ngay hoan thanh :
; Ngay kiem tra :
; Nguoi kiem tra :
;----------------------------------------------------------------
; Chu thich : Chuong trinh dung giao tiep USART
;========================================================*/
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
// ham init - khoi tao
void initUART(void){
// Khoi tao cho USART
TRISC = TRISC | 0b11000000; // Bit 7,6 la RX va TX phai la Input
SPEN = 1 ; // Enable Serial Port communication.
SYNC = 0; // che do khong dong bo Asynchronous
// cho che do truyen
TXEN = 1; //enable truyen
TX9 = 0 ; // chon che do 8 truyen bit du lieu
BRGH = 1; // High - speed
SPBRG = 129; //Baud = 9600; voi HS, Baud Rate = Fosc/(16(X+1))
TXIE = 0; // khong dung ngat Truyen
// Che do nhan du lieu
RCIE = 1; // dung ngat nhan
PEIE = 1; // cho phep ngat ngoai vi
GIE = 1; // cho phep ngat toan cuc
RX9 = 0; // nhan 8 bit
CREN = 1; // lien tuc nhan du lieu; = 0 k lien tuc nhan du lieu
}
// ham truyen du lieu 1 ký tự
void putch(unsigned char byte)
{
/* output one byte */
while(!TXIF); /* set when register is empty */
// continue;
TXREG = byte;
}
void init(void){
initUART();
}
// ham ngat
void interrupt MyInt(void){
unsigned char temp;
if(RCIF){ // Neu co ngat nhan du lieu noi tiep
temp = RCREG;
RCIF = 0; // Xoa co ngat RCIF
putch(temp);
};
}
// ham chinh
void main(void){
//unsigned char a[] =" anh yeu em nhieu lam, em biet k?";
//unsigned char i = 0;
init();
//for(i= 0; i<33; i++) putch(a[i]);
//for(i= 0; i<10; i++) putch(i+48);
while(1);
}
Chương trình này chỉ đơn giản là một ví dụ về truyền nhận dữ liệu còn nếu các bạn muốn truyền, nhận một sâu thì các bạn phải dùng Timeout cho nó để chống mất dữ liệu như sự cố đường dây mà PIC nhà ta vẫn chờ mỏi cả cổ mà vẫn k nhận được hết dữ liệu mà nó cần thì chết

.
Chương trình đã được test và chạy ngon lành.
Chúc các bạn thành công.