Chương trình sau nhận lệnh từ PC truyền xuống. Các bạn dựa vào cấu trúc chương trình có thể tự lập cho mình chương trình để làm. Đây là một phần nhỏ trong chương trình thiết kế bộ PID điều khiển động cơ một chiều 12V của tôi:
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
}
// Chuyen doi
void Convert(unsigned char *a,unsigned char index, unsigned int number){
unsigned char i;
for(i=0;i< index; i++){
*(a+i) = number%10;
number = number/10;
};
}
// ham truyen du lieu
void putch(unsigned char byte)
{
/* output one byte */
while(!TXIF); /* set when register is empty */
// continue;
TXREG = byte;
}
// ==== Ham ghi len tren mot gia tri cua so co 4 chu so
void puts(unsigned int number){ // truyen 4 so cua number
unsigned char i;
unsigned char a[] = {0,0,0,0};
Convert(a,4,number);
for(i= 0;i<2;i++) putch(a[i]+48);
putch(0x2C);
for(i= 2;i<4;i++) putch(a[i]+48);
putch(0x20);
}
// ======= Ham ghi len tren mot vector gom 4 phan tu
void putsVector(unsigned char *a,unsigned char n){
unsigned char i;
for(i = 0;i<n;i++) putch(a[i]);
}
// Ham khoi tao chung
void init(void){
initUART();
//================ Khoi tao cho Timer0
GIE = 1;
T0IE = 1;
TMR0 = 6;
}
// ham ngat
void interrupt MyInt(void){
unsigned char temp, i,j;
static volatile unsigned char counter4, allow; // temp: bien dem nhan,allow: cho phep nhan du lieu
static volatile unsigned char K[17];
static volatile unsigned char Kp;
static volatile unsigned char Ki;
static volatile unsigned char Kd;
static volatile unsigned char n;
//Kp, Ki, Kd la tham so PID, n la toc do
if(T0IF & T0IE){
TMR0 = 6;
T0IF = 0 ;// xoa co ngat
};
if(RCIF){ // Neu co ngat nhan du lieu noi tiep
temp = RCREG;
RCIF = 0; // Xoa co ngat RCIF
switch(temp){
case 'B': // === Bat dau cho dong co chay
putch('B'); allow = 0;
break;
case 'K': // === Tat dong co
putch('K'); allow = 0;
break;
case 'A': // === Nhap cac gia tri cho Kp,Ki,Kd
putch('A');
allow = 1; // chuyen sang nhap cho cac tham so cua mang.
break;
};
if (allow){
K[counter4++] = temp;
if(counter4 == 17) {
allow = 0;
putsVector(K,17);
};
};
};
}
// 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 và 2 chương trình ở trên đều được test và chạy ngon lành.
Chúc mọi người thành công.