View Single Post
Old 05-01-2007, 04:04 PM   #11
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Tối ưu các chương trình,chương trình giao tiếp USART

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 .
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn