Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS. Các code mẫu về LẬP TRÌNH PIC 16f877A trong CCS.
Trang 1ETE Group http://k44dvt02.net
Project ví d v l p trình PIC16F877A trong CCS ụ ề ậ
Project1: Hi n th lên LCD dùng lcd_lib_4bit.c ể ị
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c> // Thu vien ham cho LCD
void main()
{
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
LCD_init();
Printf(LCD_putchar," PICVIETNAM tut");
LCD_putcmd(0xC3);
Printf(LCD_putchar," LCD 4bit ");
}
Khi l p trình đ n LCD 4bit s d ng lcd_lib_4bit.c c n l u ý đ n 2 đi u ậ ế ử ụ ầ ư ế ề
• Chân n i đã đố ược fix s n trong hàm lcd_lib_4bit.c, khi thay đ i chân cho phù h pẵ ổ ợ
v i vi c thi t k m ch là coi nh đã thay đ i c v i các chớ ệ ế ế ạ ư ổ ả ớ ương trình mình dùng truóc đó
• Trong chương trình s d ng đ n l nh LCD_putcmd( 0xC3) chính là ch v trí conử ụ ế ệ ỉ ị
tr cho vi c hi n th đo n text 0xC3 là vi tri thu 4 c a dòng th 2ỏ ệ ể ị ạ ủ ứ
Project2: Đ c ADC ọ
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=10000000)
Int8 adc;
Void main()
{
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(1)
{
adc=read_adc();
output_B(adc);
}}
Project3: Đi u khi n Đ ng C dùng Timer2 ề ể ộ ơ
#include <16F877A.h>
Trang 2ETE Group http://k44dvt02.net
#device PIC16F877A*=16 adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
// Dinh nhgia chan va port
#define DIR_DC_L PIN_C3 //Dao DC Trai
#define PWM_DC_L PIN_C2 // PWM trai(CCP2)
#define DIR_DC_R PIN_C0 // Dao DC Phai
#define PWM_DC_R PIN_C1 // PWM phai (CCP1)
// set ADC
#define adc 90 //gia tri nguong so sanh
// Khai bao bien cho toan chuong trinh
int8 adc0,adc1,adc2,adc3,adc4,adc5,adc6,adc7;
int8 cambien=0x00;
int line_st=0; // Trang thai vach
//******************chuong trinh khoi tao************************
void khoi_tao()
{
SET_TRIS_A(0xFF); // NHAN TIN HIEU TU SENDOR DO DUONG
SET_TRIS_C(0x00); // Dieu Khien DC
SET_TRIS_D(0x00); // Hien thi tin hieu sensor
SET_TRIS_E(0b111);
Setup_ADC (ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
}
//****************************** Doc cam bien *******************
void doc_cam_bien()
{
set_adc_channel(0);
delay_us (10);
adc0=read_adc();
Trang 3ETE Group http://k44dvt02.net
if (adc0<=225) bit_clear(cambien,0);
else bit_set(cambien,0);
//************************** Dieu khien motor **********************
void dc_trai_tien (int value)
{
output_bit(DIR_DC_L,0);
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void dc_trai_lui(int value)
{
output_bit(DIR_DC_L,1);
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void dc_trai_dung()
{
setup_ccp2(CCP_OFF);
}
//******* Chuong trinh xu ly toc do 2 dong co************************
void toc_do(signed int toc_do_dc_trai, signed int toc_do_dc_phai)
{
int trai=0,phai=0;
if(toc_do_dc_trai>=0)
{ trai=1.25*(100-toc_do_dc_trai);
dc_trai_tien(trai);
}
Trang 4ETE Group http://k44dvt02.net
else
{toc_do_dc_trai=-toc_do_dc_trai;
trai=1.25*(100-toc_do_dc_trai);
dc_trai_lui(trai);
}
//************Do duong theo vach den************************
void do_duong()
{
doc_cam_bien();
switch (cambien)
{
case 0b00011000: {toc_do(70,70);line_st=0;} break;
case 0b00000000: {dc_dung();kiem_tra_vach();} break;
default: {toc_do(70,70);}
}
}
void main()
{
khoi_tao();
delay_ms(10);
while(1)
{
doc_cam_bien();
output_d(cambien);
delay_ms(50);
do_duong();
}
}
Trang 5ETE Group http://k44dvt02.net
Project 4: I/O + Delay _ Delay 1s RB0
Chương trình này làm nh p nháy con led chân RB0 1s sáng, 1s t t.ấ ở ắ
Code:
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
main()
{
while(true)
{
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
}
}
Trên đây:
Code:
#include<16F877A.h>
Khai báo con PIC b n s d ng, file này chạ ử ụ ương trình vi t s n nh m khai báo các bit, thanh ghiế ẵ ằ quan tr ng trong con pic này.Các b n có th vào th m c cài đ tọ ạ ể ư ụ ặ C:\Program
Files\PICC\Devices\16F877A.h đ xem nó khai báo để ược nh ng gì trong đó!ữ
Code:
#fuses NOWDT,PUT,HS,NOPROTECT
Thi t l p các configế ậ
Code:
#use delay(clock=10000000)
Khai báo:
Code:
"#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
-HS :s d ng th ch anh t n s caoử ụ ạ ầ ố
-NOWDT:t t WDTắ
-NOPROTECT:t t PROTECTắ
-NOLVP:không dùng LVP
-NOBROWNOUT:ko BROWNOUT
Khai báo t n s dao đ ng c p cho PICầ ố ộ ấ
Code:
output_high(PIN_B0)
Trang 6ETE Group http://k44dvt02.net
Xu t ra chân RB0 m c logic 1 (t c 5V), do khi th c hi n hàm này đã bao hàm luôn vi c tácấ ứ ứ ự ệ ệ
đ ng lên thanh ghi TRISB (dùng ch n chân I/O) do v y ta không c n vi t l nh ch n chân I/Oộ ọ ậ ầ ế ệ ọ
n a.ữ
Code:
output_low(PIN_B0)
Ngượ ạc l i
Code:
delay_ms(1000)
T o tr kho ng th i gian theo mili giây là 1000 (t c 1s)ạ ễ ả ờ ứ
Chú ý hàm này ch có tác d ng khi có khai báo t n s dao đ ng c p cho PICỉ ụ ầ ố ộ ấ
Và bây gi th làm cho t t c 8 led n i v i portB ch p t t 1s xem nào!Ph i chăng ta s làmờ ử ấ ả ố ớ ớ ắ ả ẽ
nh sau (Vi t trong vòng l p while):ư ế ặ
Code:
{
output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
output_high(PIN_B4);
output_high(PIN_B5);
output_high(PIN_B6);
output_high(PIN_B7);
delay_ms(1000);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
delay_ms(1000);
}
Vi t nh th này thì quá dài và thi u chính xác n a, có cách nào khác hay h n không ? Sao taế ư ế ế ữ ơ không xu t đ y h n portB lên m c cao,t o tr 1s r i ép cho nó xu ng m c th p,t o tr 1sấ ẩ ẳ ứ ạ ễ ồ ố ứ ấ ạ ễ cùng m t lúc nh !ộ ỉ
Trang 7ETE Group http://k44dvt02.net
Project 5 : Timer
Trong Pic16f877a có 3 timer :
+ Timer0 : 8 bit
+ Timer1 : 16 bit
+ Timer2 : 8 bit
Timer dùng cho nhi u ng d ng : đ nh th i, capture, pwm, ề ứ ụ ị ờ
1.Timer0
Thanh ghi tác đ ng:ộ
Các l nh:ệ
Code:
setup_TIMER_0(mode);
setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT()
set_TIMER0(value); // hay set_RTCC(value) :xác đ nh giá tr ban đ u (8bit) ị ị ầ cho Timer0
get_TIMER0(); // hay get_RTCC() :tr v s nguyên (8bit) c a Timer0 ả ề ố ủ
Trong đó mode là m t ho c hai constant (n u dùng hai thì chèn d u "|" gi a) độ ặ ế ấ ở ữ ược đ nh nghĩaị trong file 16F877A.h g m :ồ
RTCC_INTERNAL : ch n xung clock n iọ ộ
RTCC_EXT_L_TO_H : ch n bit c nh lên trên chân RA4ọ ạ
RTCC_EXT_H_TO_L : ch n bit c nh xu ng trên chân RA4ọ ạ ố
RTCC_DIV_2 :chia prescaler 1:2
RTCC_DIV_4 1:4
RTCC_DIV_8 1:8
RTCC_DIV_16 1:16
RTCC_DIV_32 1:32
RTCC_DIV_64 1:64
RTCC_DIV_128 1:128
RTCC_DIV_256 1:256
rtcc_state là m t trong nh ng constant sau:ộ ữ
RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
ps_state là m t trong nh ng constant sau:ộ ữ
RTCC_DIV_2
Trang 8ETE Group http://k44dvt02.net
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
Mình cũng ch a hi u ý nghĩa c a hàm WDT_ , ko bi t có ph i khai báo nh trên thì sauư ể ủ ế ả ư kho ng th i gian ms bao nhiêu đó đ t sau WDT_ thì s reset l i Pic ?????ả ờ ặ ẽ ạ
2.Timer1
Thanh ghi tác đ ng:ộ
Các l nh:ệ
Code:
setup_TIMER_1(mode);
set_TIMER1(value); // xác đ nh giá tr ban đ u (16bit) cho Timer1 ị ị ầ get_TIMER1(); // tr v s nguyên (16bit) c a Timer1 ả ề ố ủ
mode g m (có th k t h p b ng d u "|"):ồ ể ế ợ ằ ấ
T1_DISABLED : t t Timer1ắ
T1_INTERNAL : xung clock n i (Fosc/4)ộ
T1_EXTERNAL : xung clock ngoài trên chân RC0
T1_EXTERNAL_SYNC : xung clock ngoài đ ng bồ ộ
T1_CLK_OUT
T1_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4
T1_DIV_BY_8
3.Timer2
Thanh ghi tác đ ng:ộ
Trang 9ETE Group http://k44dvt02.net
Các l nh:ệ
Code:
setup_TIMER_2(mode, period, postscale);
set_TIMER2(value); // xác đ nh giá tr ban đ u (8bit) cho Timer2 ị ị ầ get_TIMER2(); // tr v s nguyên 8bit ả ề ố
V i mode g m (co the ket hop bang dau "|"):ớ ồ
T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
T2_DIV_BY_16
period là s nguyên t 0-255, xác đ nh giá tr xung resetố ừ ị ị
postscale là s nguyên 1-16, xác đ nh reset bao nhiêu l n trố ị ầ ước khi ng t.ắ
Project 6: INTERRUPT
Các l nh dùng cho ng t:ệ ắ
Code:
enable_interrupts(level); //cho phép ng t ki u level ắ ể
disable_interrupts(level); //c m ng t ki u level ấ ắ ể
ext_int_edge(edge); // ch n cách l y xung lo i edge ọ ấ ạ level bao g m:ồ
GLOBAL : ng t toàn c cắ ụ
INT_RTCC : tràn TMR0
INT_RB : có thay đ i tr ng thái m t trong các chân RB4 đ n RB7ổ ạ ộ ế
INT_EXT : ng t ngoàiắ
INT_AD : chuy n đ i AD đã hoàn t tể ổ ấ
INT_TBE : b đ m chuy n RS232 tr ngộ ệ ể ố
INT_RDA : data nh n t RS232 s n sàngậ ừ ẵ
INT_TIMER1 : tràn TMR1
INT_TIMER2 : tràn TMR2
INT_CCP1 : có capture hay compare trên CCP1
INT_CCP2 : có capture hay compare trên CCP2
INT_SSP : có ho t đ ng SPI hay I2Cạ ộ
INT_PSP : có data vào c ng parallel slaveổ
INT_BUSCOL : xung đ t busộ
INT_EEPROM : ghi vào eeprom hoàn t tấ
INT_TIMER0 : tràn TMR0
INT_COMP : ki m tra b ng nhau comparatorể ằ
edge bao g m:ồ
L_TO_H : c nh lênạ
H_TO_L : c nh xu ngạ ố
Trang 10ETE Group http://k44dvt02.net
Sau khai báo trên đ vào đo n chể ạ ương trình ng t, khai báo:ắ
#INT_
Ví d vào th c thi ng t ngoài, ta có đo n code:ụ ự ắ ạ
Code:
#INT_EXT
void ngat_ngoai()
{
//Ch ươ ng trình ng t t i đây ắ ạ
}
Đây là chương trình dùng ng t Timer0 đ nh thì 1s.ắ ị
Đ u tiên led chân RB0 sáng, sau 1s s d ch sang trái, nghĩa là led 1 trên chân RB1 sáng , l nầ ở ẽ ị ầ
lượt nh v y cho các led trên portB và l p l i mãi mãi.ư ậ ặ ạ
Code:
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;
while(true)
{
PORTB = a;
}
}
Trích: