Ðăng Nhập

View Full Version : chương trình ngắt cho PIC16F877A


thienngoc
03-12-2010, 10:13 PM
em đang làm đề tài cảm biến nhiệt độ dùng pic 16f877a hiển thị lên 3 led 7 đoạn dùng ngôn ngữ C,jờ e muốn khi đến nhiệt độ 80*C thì chuông sẽ reo,nếu như vậy mình có cần sử dụng ngắt ko mấy anh và chương trình như thế nào?xin mấy anh giúp dùm,em cám ơn

thienngoc
03-12-2010, 11:27 PM
có ai júp em với,đang cần lắm..hix

tomato2711
04-12-2010, 12:03 AM
dùng ngắt hay ko thì tùy bạn, theo mình thì nên dùng ngắt, chương trình voi main() thì bạn viết cho nó hiển thị led và đọc ADC, bên trong ngắt thì bạn tạo xung PWM cho chuông nó reo.
trong void main() thì viết khai báo, hiển thị led va đọc ADC bình thường, để ngắt xảy ra thì Set bit GIE, vì ADC là ngoại vi nên Set them bit PEIE, sau đó sét bitADIE, và ngắt xảy ra khi ADIF = 1, việc muốn nó bao nhiêu thì ngắt là bạn quyết định.
cái sườn là vậy, bạn tự viết nhé!

thienngoc
04-12-2010, 08:22 AM
anh có thể nói rõ hơn được ko?em mới học về pic nên ko rành về ngắt lắm...

tomato2711
04-12-2010, 11:33 AM
em down datasheet của nó về xem phần sơ đồ interrupt ấy.
để sử dụng chương trình ngắt thì GIE=1, để ngắt ngoại vi (timer1, timer2, ADC...) thì bít PEIE=1, (nếu dùng ngắt Timer0 thi ko cần), và để ngắt ADC thì set ADIE=1;

stupid11
17-03-2011, 10:42 PM
em đang làm đề tài cảm biến nhiệt độ dùng pic 16f877a hiển thị lên 3 led 7 đoạn dùng ngôn ngữ C,jờ e muốn khi đến nhiệt độ 80*C thì chuông sẽ reo,nếu như vậy mình có cần sử dụng ngắt ko mấy anh và chương trình như thế nào?xin mấy anh giúp dùm,em cám ơn

cái này không cần sử dụng ngắt ADC làm gì cho nó phức tạp....nếu mưốn chuông reO thỉ dung PWM ý tưởng là như thế này:
.....
.
.
x=read_ADC();
x=x*2.049 //nếu ADC ở chế độ 10bit và sử dụng LM35 ,,nếu dùng loại khác thì tính toán lại//


if(x>=80)
{
y=120 ; //giá trị này để cài dặt tần số để chuông reo..thường thì vài kHz
xuatxung(); //đưa giá trị y=120 vào duty của PWM =>XUẤT XUNG
}
else
{
y=0;
xuatxung(); //đưa 0 vào duty =>tắt xung
}
.
.
.
.
void xuatxung()
{
setup_ccp1(CCP_PWM);
set_pwm1_duty(y); //đưa giá trị duty vào đây
set_timer_2(t2_div_by_4,255,1)
}

chắc bạn đã hiểu ý mình rối chứ.chúc bạn thành công.