|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
|
03-05-2011, 11:13 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
giúp em với:Lập trình nút bấm cho pic 16f877a voi???
em đang làm đồ án phần đo nhiệt độ thi em làm được rùi,còn phần nút ấn để tăng giảm nhiệt độ đặt thì chưa làm đươc. Mong các anh, chị giúp em với:
thầy em bắt làm thêm 3 nút bấm: + 1 nút để ấn định thay đổi nhiệt độ + 1 nút để tăng nhiệt độ + 1 nút để giảm nhiệt độ giả sử có 3 nút: A B C: khi ấn nút A thi màn hình LCD hiển thị dòng chữ '' nhập nhiệt độ'' khi ấn nút B thì tăng nhiệt độ khi ấn nút c thì giảm nhiệt độ sau đó khi ấn tiếp nút A thì kết thúc quá trình thay đổi nhiệt độ e mong mọi người giúp đỡ e với !!!!!!!! e thank nhiều |
04-05-2011, 12:11 AM | #2 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Bài tập của bạn đã rất rõ ràng, nhưng vấn đề của bạn là thế nào nhỉ, bạn cứ viết đi, vướng phần nào thì hỏi phần ấy, đoạn nào chạy ko đúng, hay không chạy thì post lên để mọi người giúp.
|
04-05-2011, 09:06 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
uhm, em đã post cả chương trình rùi mà!!! nhưng chương trình đó chưa có phần nút bấm! em đã làm nhưng phần chương trình đó của e ko chạy.em post lại chương trình này:
#include <16F877A.h> #include <def_877a.h> #device *=16 adc=10 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #include <lcd_lib_4bit.c> // Thu vien ham cho LCD int8 low,high,min,max,i; int1 do_F; void convert_bcd(int8 x); #INT_EXT #define nut1 PIN_C2 #define nut2 PIN_C3 #define nut3 PIN_C4 void test() { if (do_F == 1) do_F=0; else do_F=1; } void banphim() { max =40; if (nut1 == 0) LCD_putcmd(0x01); LCD_putchar("nhap nhiet do:"); {if (nut2==0) max = max + 1; if (nut3 == 0) max = max - 1;} } //----------------------------------------------------------------- void main() { float value; min =0; //nhiet do mim // max =40; //nhiet do max do_F =0 ; i = 10 ; trisa = 0xFF; trisb = 0x01; output_low(pin_C0); output_low(pin_C1); LCD_init(); LCD_putcmd(0x01); LCD_putchar("do_nhiet_do:"); LCD_putcmd(0xC0); LCD_putchar("cho ty nhe ..."); //==== Khoi tao cho ngat ngoai============================================= == enable_interrupts (INT_EXT); ext_int_edge(H_TO_L); enable_interrupts (GLOBAL); //=========== Khoi tao che do cho bo ADC===================================== setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); delay_us(10);// Lay mau nhiet do lan dau tien value=(float)read_adc(); value = (value - 558.5)/2.048; // For 5V supply // value = (value - 754.8)/2.048; // For 3.7V Supply // value = (value - 698.2)/2.048; // For 4V supply convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7 delay_ms(100); LCD_putcmd(0xC0); LCD_putchar("Ok "); delay_ms(100); while(1) { if (i==10) { value = read_adc(); value=(value-558.5)/2.048; if (do_F==1) value=1.8*value+32; convert_bcd((int8)value); LCD_putcmd(0xC0); printf(LCD_putchar,"Nhiet do la:"); LCD_putchar(high); LCD_putchar(low); if (do_F==0) printf(LCD_putchar," C"); else printf(LCD_putchar," F"); i=0; } if ( (int8)value <= max & min <=(int8)value) output_high(pin_C1); else output_low(pin_C1); if( ( (int8)value > max )|| ( (int8)value < min)) output_high(pin_C0); else output_low(pin_C0); i++; } } //The End=============================================== ======================== void convert_bcd(int8 x) { low=x%10; //chia lay phan du, so hang don vi high=x/10; //tach hang tram va hang chuc low = low + 0x30; high = high + 0x30; } phần chương trình con void ban_phim() ấy nó ko chạy mong mọi người giúp đỡ |
04-05-2011, 10:18 AM | #4 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Bạn phải đưa hàm banphim() vào trong vòng lặp while thì nó mới chạy được chứ
Với lại việc khai báo hàm void convert_bcd(int8 x) phải đặt trước hàm main() chứ bạn |
26-05-2012, 12:23 PM | #5 |
Nhập môn đệ tử
Tham gia ngày: May 2010
Bài gửi: 3
: |
|
04-05-2011, 10:44 AM | #6 | |
Đệ tử 4 túi
|
Trích:
trong hàm main() nên dùng set_tris_x() cấu hình cho các chân có nối nút nhấn là input! Hàm banphim() phải để lặp trong while(true)
__________________
My blog: http://autumnneverreturn.blogspot.com/ Đối thủ khó chiến thắng nhất là bản thân !!! |
|
04-05-2011, 11:32 AM | #7 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
anh ơi xem hộ em với: chương trình em đã sửa như a nói nhưng mà vẫn ko chạy được a ơi
chương trình e sửa đây này a xem hộ em với nhé: #include <16F877A.h> #include <def_877a.h> #device *=16 adc=10 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #include <lcd_lib_4bit.c> // Thu vien ham cho LCD int8 low,high,min,max,i; int1 do_F; void convert_bcd(int8 x); #INT_EXT //#define nut1 PIN_C2 //#define nut2 PIN_C3 //#define nut3 PIN_C4 void test() { if (do_F == 1) do_F=0; else do_F=1; } void convert_bcd(int8 x) { low=x%10; //chia lay phan du, so hang don vi high=x/10; //tach hang tram va hang chuc low = low + 0x30; high = high + 0x30; } void banphim() { max =40; set_tris_C(3); set_tris_C(4); set_tris_C(5); while(1) {if (pin_C2 == 0) LCD_putcmd(0x01); LCD_putchar("nhap nhiet do:"); {if (pin_C3==0) max = max + 1; if (pin_C4 == 0) max = max - 1;} }} //----------------------------------------------------------------- void main() { float value; min =0; //nhiet do mim // max =40; //nhiet do max do_F =0 ; i = 10 ; trisa = 0xFF; trisb = 0x01; output_low(pin_C0); output_low(pin_C1); LCD_init(); LCD_putcmd(0x01); LCD_putchar("do_nhiet_do:"); LCD_putcmd(0xC0); LCD_putchar("cho ty nhe ..."); //==== Khoi tao cho ngat ngoai============================================= == enable_interrupts (INT_EXT); ext_int_edge(H_TO_L); enable_interrupts (GLOBAL); //=========== Khoi tao che do cho bo ADC===================================== setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); delay_us(10);// Lay mau nhiet do lan dau tien value=(float)read_adc(); value = (value - 558.5)/2.048; // For 5V supply // value = (value - 754.8)/2.048; // For 3.7V Supply // value = (value - 698.2)/2.048; // For 4V supply convert_bcd((int8)value); // Tach so tram, chuc, donvi de hien thi len LED 7 delay_ms(100); LCD_putcmd(0xC0); LCD_putchar("Ok "); delay_ms(100); while(1) { if (i==10) { value = read_adc(); value=(value-558.5)/2.048; if (do_F==1) value=1.8*value+32; convert_bcd((int8)value); LCD_putcmd(0xC0); printf(LCD_putchar,"Nhiet do la:"); LCD_putchar(high); LCD_putchar(low); if (do_F==0) printf(LCD_putchar," C"); else printf(LCD_putchar," F"); i=0; } if ( (int8)value <= max & min <=(int8)value) output_high(pin_C1); else output_low(pin_C1); if( ( (int8)value > max )|| ( (int8)value < min)) output_high(pin_C0); else output_low(pin_C0); i++; } } //The End=============================================== ======================== |
04-05-2011, 04:03 PM | #8 |
Đệ tử 5 túi
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
: |
Trong hàm bàn phím bàn khởi tạo 3 lần
set_tris_C(3); set_tris_C(4); set_tris_C(5); như thế 3 PIN C2,C3,C4 đâu có đồng thời là đầu vào Bạn chỉ cần 1 lệnh thôi set_tris_C(24); là cấu hình C2,3,4 là đầu vào, còn lại đầu ra. Với lại cấu hình cổng vào ra bạn chỉ cần thực hiện 1 lần trước vòng lặp while, không cần để trong hàm quét phím, như thế PIC sẽ phải cấu hình cổng liên tục ở mỗi vòng quét. |
04-05-2011, 06:37 PM | #9 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
thank các a nhieu!!! nhung e sủa rùi mà chẳng thay đổi được gì ca!!!
hay là cái hàm đó của em có vấn đề gì nhi?? chỉ giáo cho e với?? |
04-05-2011, 11:22 PM | #10 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
ko có ai giúp vậy?
|
05-05-2011, 11:40 AM | #11 |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
thôi thì để tôi chèn giúp bạn vài dòng lệnh để code hoàn chỉnh vậy.
Code:
#include <16F877A.h> #include <def_877a.h> #device *=16 adc=10 #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #include <lcd_lib_4bit.c> // Thu vien ham cho LCD int8 low,high,min,max,i,sida=0xaa; int1 do_F; float value; #define nut1 RC2 #define nut2 RC3 #define nut3 RC4 #INT_EXT void test() { if (do_F == 1) do_F=0; else do_F=1; } void banphim(void); void convert_bcd(int8 x); //----------------------------------------------------------------- void main() { min =0; //nhiet do mim max =40; //nhiet do max do_F =0 ; i = 10 ; trisa = 0xFF; trisb = 0x01; trisc = 0b00011100; output_low(pin_C0); output_low(pin_C1); //==== Khoi tao cho ngat ngoai=============================================== enable_interrupts (INT_EXT); ext_int_edge(H_TO_L); enable_interrupts (GLOBAL); //=========== Khoi tao che do cho bo ADC===================================== setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); LCD_init(); LCD_putcmd(0x01); LCD_putchar("do_nhiet_do:"); LCD_putcmd(0xC0); LCD_putchar("cho ty nhe ..."); delay_us(10);// Lay mau nhiet do lan dau tien value=(float)read_adc(); value = (value - 558.5)/2.048; // For 5V supply // value = (value - 754.8)/2.048; // For 3.7V Supply // value = (value - 698.2)/2.048; // For 4V supply convert_bcd(value); // Tach so tram, chuc, donvi de hien thi len LED 7 delay_ms(100); LCD_putcmd(0xC0); LCD_putchar("Ok "); delay_ms(100); while(1) { banphim(); if (i==10) { if(sida==0xaa) { value = read_adc(); value=(value-558.5)/2.048; if (do_F==1) value=1.8*value+32; convert_bcd(value); LCD_putcmd(0xC0); printf(LCD_putchar,"Nhiet do la:"); LCD_putchar(high); LCD_putchar(low); if (do_F==0) printf(LCD_putchar," C"); else printf(LCD_putchar," F"); i=0; } else { } }// if (value <= max & min <=value) { output_high(pin_C1); } else output_low(pin_C1); if(value > max ||value < min) output_high(pin_C0); else output_low(pin_C0); i++; } } //The End======================================================================= void convert_bcd(int8 x) { low=x%10; //chia lay phan du, so hang don vi high=x/10; //tach hang tram va hang chuc low = low + 0x30; high = high + 0x30; } void banphim() { if (nut1 == 0) { sida=~sida; if(sida!=0xaa) { LCD_putcmd(0x01); LCD_putchar("nhap nhiet do:"); LCD_putcmd(0xC0); printf(LCD_putchar,"gia tri MAX:%d",max); } else { LCD_putcmd(0x01); LCD_putchar("do_nhiet_do:"); value = read_adc(); value=(value-558.5)/2.048; if (do_F==1) value=1.8*value+32; convert_bcd(value); LCD_putcmd(0xC0); printf(LCD_putchar,"Nhiet do la:"); LCD_putchar(high); LCD_putchar(low); if (do_F==0) printf(LCD_putchar," C"); else printf(LCD_putchar," F"); } while(nut1 == 0) { } } else if (nut3 == 0) { if(sida!=0xaa) { max = max - 1; LCD_putcmd(0xC0); printf(LCD_putchar,"gia tri MAX:%d",max); } else { } while(nut3 == 0)//cho nha phim { } delay_ms(10);//chong nay phim } else if (nut2 == 0) { if(sida!=0xaa) { max = max +1; LCD_putcmd(0xC0); printf(LCD_putchar,"gia tri MAX:%d",max); } else { } while(nut2 == 0)//cho nha phim { } delay_ms(10);//chong nay phim } else { } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. thay đổi nội dung bởi: tdm, 05-05-2011 lúc 11:53 AM. |
26-05-2012, 12:30 PM | #12 | |
Nhập môn đệ tử
Tham gia ngày: May 2010
Bài gửi: 3
: |
Trích:
Mong nhận được những bài hay từ anh! |
|
05-05-2011, 12:38 PM | #13 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
anh TDM ơi : Em cảm ơn anh nhiều lắm! mạch của em chạy được rồi anh ạ!
em vui lắm! em mới học nên kiến thức còn ít lắm may mà có anh giúp đỡ ko thì em ko biết làm thế nào hết a có thể cho em số điện thoại hoặc nick chát ko ạ? em muốn cảm ơn anh!! em chúc anh và gia đình luôn vui vẻ và hạnh phúc!! |
05-05-2011, 12:45 PM | #14 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
em biết tên anh rồi : chúc anh MINH và gia đình hạnh phúc
cho em số điện thoại của anh nhé?cảm ơn a MINH |
06-05-2011, 12:05 AM | #15 |
Nhập môn đệ tử
Tham gia ngày: May 2011
Bài gửi: 8
: |
a ơi cho e biết là tại sao phải khai báo ''sida=0xaa'' trong dòng khai báo: int8 low,high,min,max,i,sida=0xaa; ?
no có tác dụng gì vậy a?? |
|
|