http://dientuvietnam.net/forums/show...?t=1406&page=5
Bài số 45.
Giờ mình xin đưa ra các chương trình mà mình tối ưu dần dần và cảm thấy nó dễ hiểu. Mình xin đưa ra cho các bạn xem và cho ý kiến. Mình sẽ tối ưu từng chương trình một.
Đầu tiên là chương trình dùng giao tiếp USART, trong chương trình này mình dùng thư viện stdio.h có hàm printf(). Tuy nhiên bạn phải định nghĩa hàm putch(..) thì mới sử dụng được hàm này.
Hàm printf( ) sẽ truyền xâu dữ liệu theo định dạng C ra cổng nối tiếp USART.
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>
# include "stdio.h"
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
// ham init - khoi tao
void init(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
void putch(unsigned char byte)
{
/* output one byte */
while(!TXIF); /* set when register is empty */
// continue;
TXREG = byte;
}
// 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
printf(" da nhan duoc du lieu: %c", temp);
};
}
// ham chinh
void main(void){
init();
while(1);
}
Chương trình này rất có ích khi muốn test chương trình giao tiếp qua USART.
Chúc các bạn thành công. Ngủ cái đã. Mai còn phải ôn thi

.