1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Lập trình PIC16f877a ngôn ngữ CCS

10 594 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 567,16 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

ETE 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 2

ETE 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 3

ETE 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 4

ETE 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 5

ETE 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 6

ETE 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 7

ETE 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 8

ETE 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 9

ETE 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 10

ETE 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:

Ngày đăng: 05/10/2015, 10:55

TỪ KHÓA LIÊN QUAN

w