Nhập môn VĐK PIC với 16F877A

PhamDaoViet

Học sinh phổ thông
#62
Cám ơn anh đã giúp đỡ! Anh cho em hỏi nếu em định dùng 1 lệnh bất kỳ nào đó thì làm sao biết cần phải #include thư viện nào vậy anh? Có cách nào để biết 1 lệnh nằm trong thư viện nào không vậy ạ?
 

mbed

Kỹ sư
#63
Cám ơn anh đã giúp đỡ! Anh cho em hỏi nếu em định dùng 1 lệnh bất kỳ nào đó thì làm sao biết cần phải #include thư viện nào vậy anh? Có cách nào để biết 1 lệnh nằm trong thư viện nào không vậy ạ?
Trải nghiệm nhiều và biết cách hỏi google nhiều !
 

zzduxezz

Học sinh phổ thông
#65
làm sao để quét led 7 đoạn hiển thị 1 2 3 4 5 6 bằng pic16f877a trên ccs ạ.
 

tung2709

Học sinh phổ thông
#66
em dang địng làm macch dung pic de dieu khiển led sáng dần tắt dần theo môi trường dùng quang trở , e k bk viet code ntn để điều khiển đèn sáng dần tắt dần theo môi truong mong mọi ng chỉ giáo :)
 

trongtanh

Học sinh phổ thông
#67
Lệnh Output_d(0xff) va PORTD=0xff khac nhau như thế nào vậy mn.
Lệnh Set_tris_s (0) và TRISD=0x00 khác nhau như thế nào.
Mong mn giúp đỡ.
 

datpo

Học sinh phổ thông
#70
5. Các hàm phục vụ ngắt
- ENABLE_INTERRUPTS( level) // khai báo ngắt
Level: //các dạng ngắt

+GLOBAL : cho phép ngắt toàn cục
+INT_TIMER0 : ngắt do tràn TIMER0
+INT_TIMER1 : ngắt do tràn Timer1
+INT_TIMER2 : ngắt do tràn Timer2
+INT_RB : có thay đổi 1 trong các chân RB4 _ RB7
+INT_EXT : ngắt ngoài trên chân RB0
Chú ý : sau khi khai báo trên thì để vào chương trình ngắt cần khai báo

#INT_.....
ví dụ:
Mã:
#INT_TIMER1
Void ngat_Timer1( )
{
//chương trình ngắt viết ở đây
}
6. Điều chế độ rộng xung PWM

Để giải quyết vấn đề việc điều xung PWM bằng phần mềm chiếm phần lớn thời gian hoạt động của vi điều khiển, PIC16F877A có hỗ trợ 2 kênh điều xung bằng phần cứng ở 2 chân C1(CCP2)C2(CCP1) sử dụng TIMER2. Nghĩa là, khi ta khai báo điều xung PWM ở một tần số và duty cycle nào đó thì vi điều khiển sẽ thực hiện công việc xuất xung một cách liên tục và tự động cho đến khi ta thay đổi các giá trị đã khai báo. Khi đó, ta có thể làm các công việc khác một cách dễ dàng mà không phải mất thời gian cho việc duy trì xung PWM.
Các hàm hỗ trợ việc điều xung bằng phần cứng của CCS:
Ghi chú: Chỉ đề cập đến các đối số của các hàm được phục vụ cho việc điều xung PWM.
+ setup_timer_2 (mode, period, postscale)
mode: T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
period: 0-255
postscale: 1
Tần số điều xung PWM:

f = fosc / [ 4*mode*(period+1) ]


+ setup_ccp1(mode)setup_ccp2(mode)
mode:
CCP_PWM: chọn chế độ PWM.
CCP_OFF: tắt chế độ PWM.


+ set_pwm1_duty(value)set_pwm2_duty(value)
Nếu value là giá trị kiểu int 8bit:
duty_cycle = value / ( period+1 )


Nếu value là giá trị long int 16bit:
duty_cycle = value&1023 / [4*( period+1 )]


Nếu không cần điều xung quá “mịn” thì nên điều xung ở giá trị value 8bit cho đơn giản.
Ví dụ: Ta muốn điều xung PWM với tần số 10kHz với tần số thạch anh (fosc) sử dụng là 20MHz (value 8bit).

f=fosc/[4*mode*(period+1)]


<=> 10000 =20000000/[ 4*mode*(period+1) ] <=> mode(period+1) = 500


Với mode = [1,4,16] và period = 0-255 ta có thể chọn:
mode = 4; period = 124
mode = 16; period = 32
Để cho việc điều xung được “mịn” (chọn được nhiều giá trị duty cycle) ta chọn mode = 4 và period = 124.
Như vậy, để duty_cycle từ 0% đến 100% ta cho value từ 0 đến 125.
value = 30 => duty_cycle = 30 / ( 124+1 ) = 0.32 = 32%
value = 63 => duty_cycle = 63 / ( 124+1 ) = 0.504 = 50.4%
value = 113 => duty_cycle = 113 / ( 124+1 ) = 0.904 = 90.4%

ví dụ:
Code:
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(30);

PHẦN 4: CÁC VÍ DỤ KÈM MÔ PHỎNG PROTEUS
1.Xuất tín hiệu 0/1 ra các chân


anh cho em hỏi là làm thế nào để khi mạch 8 led đang chạy tuần tự thì mình dùng button on thì mạch dừng nguyện hiện trạng đang chạy còn khi bấm tiếp lần nữa thì mạch lại chạy tiếp? anh có thể nói nguyên lý của nó được không? em xin cảm ơn.

Mã:
#INCLUDE<16F877A.h> //KHAI BAO DEVICE CHO PIC
#FUSES XT,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP
/*
XT: SU DUNG THACH ANH TAN SO THAP (=4MHZ)
NOWDT:KHONG SU DUNG CHE DO WATCH DOG TIMER
PUT(POWER UP TIMER): CHON CHE DO LAM VIEC CHO PIC KHI DIEN AP DA ON DINH
NOPROTECT : KHONG CHO PHEP DOC LAI MA CHUONG TRINH TRONG CHIP
NOBROWNOUT : KHONG RESET LAI PIC KHI BI SUT AP
NOLVP(LOW VOLTAGE PROGRAMMING) : ??
*/
#USE DELAY(CLOCK=4000000) //GIA TRI OSC MA BAN DUNG
#USE FAST_IO(B)
VOID MAIN()
{
SET_TRIS_B(0); //THIET LAP CAC CHAN CUA PORTA LA CAC CHAN XUAT DU LIEU
WHILE(TRUE) //TAO VONG LAP VO TAN
{
OUTPUT_HIGH(PIN_B0); //XUAT GIA TRI 1 RA CHAN RB0
DELAY_MS(500); //TAO TRE 0,5s
OUTPUT_LOW(PIN_B0); //XUAT GIA TRI 0 RA CHAN RB0
DELAY_MS(500);
OUTPUT_B(255); //DUA GIA TRI 1 RA CAC CHAN CUA PORTB
DELAY_MS(500);
OUTPUT_B(0); //DUA GIA TRI 0 RA CAC CHAN CUA PORTB
DELAY_MS(500);
}
}
2. Giao tiếp với nút bấm

Mã:
#INCLUDE<16F877A.H>
#FUSES XT,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP
#USE DELAY(CLOCK=4000000)
#USE FAST_IO(B)
#BYTE PORTB=0x06
#BIT BUTTON=PORTB.7
#BIT LED=PORTB.6
VOID MAIN()
{
SET_TRIS_B(0b10111111); //LAP CHE CHO PIN_B6 LA XUAT CON CAC CHAN KHAC LA NHAP
WHILE(TRUE)
{
IF(BUTTON==0) //KIEM TRA NUT BAM
{
LED=1; //BAT DEN
DELAY_MS(1000);
LED=0; //TAT DEN
}
}
}
3. Delay dùng vòng lặp
Mã:
#INCLUDE<16F877A.H>
#FUSES XT,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP
#USE DELAY(CLOCK=4000000)
#BYTE INTCON=0x0B
#BYTE PIR1=0x0C
#BYTE T1CON=0x10
#BIT TMR1ON=T1CON.0 //KHOI DONG TIMER1
#BIT TMR1IF=PIR1.0 //CO TRAN TIMER1
#BIT INTF=INTCON.1 //CO NGAT
VOID DELAY(INT8 TIMER)
{
WHILE(TIMER--)
{
TMR1ON=1;
WHILE(TMR1IF==0);
TMR1ON=0;
TMR1IF=0;
}
}
VOID MAIN()
{
WHILE(TRUE)
{
OUTPUT_HIGH(PIN_C4);
DELAY(100);
OUTPUT_LOW(PIN_C4);
DELAY(100);
}
}
//TUONG TU VOI CAC TIMER0 VA TIMER2 CAC BAN CO THE XEM DATASHEET DE BIET THEM VE DIA
CHI
// CAC THANH GHI CHUC NANG CUA CHUNG
to be continued #3 :49.jpg::49.jpg::49.jpg:
 

Quảng cáo Google