![]() |
Giúp mình hiển thị LCD
Mình muốn test thử hiện thị 1 vài kí tự lên LCD dùng pic16f877a. Code mình biên dịch bằng Picc Compiler và mô phỏng trên Proteus đều chạy bình thường. Song khi mình nạp và test trên bo mạch thì không thấy hiện kí tự nào. LCD vẫn sáng. Các bạn có thể chỉ cho mình xem sai ở chỗ nào không. Xin cảm ơn.
Đây là code mình viết: #include "C:\Program Files\PICC\Projects\LCD hien thi.h" #define LCD_ENABLE_PIN PIN_D0 #define LCD_RS_PIN PIN_D1 #define LCD_RW_PIN PIN_D2 #define LCD_DATA4 PIN_D4 #define LCD_DATA5 PIN_D5 #define LCD_DATA6 PIN_D6 #define LCD_DATA7 PIN_D7 #define LCD_TYPE 2 #include <lcd.c> void main() { lcd_init(); setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); // TODO: USER CODE!! lcd_gotoxy(1,1); lcd_putc("dadada"); delay_ms(100); lcd_putc("\f"); lcd_gotoxy(5,2); lcd_putc("okfafakdfa"); delay_ms(100); lcd_putc("\f"); } |
bạn xem chân mclr đã đc nối với điện trở lên vcc chưa,biến trở trên lcd đã điều chỉnh chưa :)
|
chào bạn
nếu bạn đã check lại lỗi như bạn dientu90 nói mà lcd vẫn chưa hiển thị dc thì mình nghĩ bạn nên xem lại chỗ khởi tạo lcd của bạn. vì tần số hoạt động của pic nhanh hơn lcd rất nhiều lên chíp khởi tạo xong rồi mà lcd vẫn chưa khởi tạo xong dc. theo mình lúc khởi taaoj lcd bạn nên để delay một khoảng time khoảng 1s nữa bạn ah. |
Mình đã nối chân mclr với điện trở lên vcc và điều chỉnh biến trở. Kết quả là dòng 2 của lcd hiện đen xì, còn dòng 1 thì không hiện gì. Nó vẫn không hiển thị đúng kết quả bạn a.
|
Ý bạn phamhang là sao. Mình include hàm lcd.c trong thư viện. Tớ nghĩ trong đấy nó đã khởi tạo và delay cho mình rồi chứ. Vậy nếu muốn làm như cách của cậu tớ nên thêm vào chỗ nào, trước chỗ lcd_gotoxy(1,1) à.
|
không. bạn delay_ms(1000) trc lcd_init(); xem sao
|
Tớ làm thử như cậu rồi nhưng dòng 2 lcd vẫn hiện đen xì. Đợi 1 lúc nó mất đi rồi cả 2 dòng hiện mờ mờ. Vấn không thấy kí tự nào cậu ạ.
|
Bạn nên xem lại cả file lcd.c nữa.
|
bạn thiếu vòng lặp while(1),thử bổ xung như thế này xem
while(1) { lcd_gotoxy(1,1); lcd_putc("dadada"); delay_ms(10); lcd_gotoxy(5,2); lcd_putc("okfafakdfa"); delay_ms(10); } nhớ mắc chân mclr như mình nói không là k chạy pic đâu |
Lúc đầu mình cũng để vòng while(1) để hiển thị liên tục. Nhưng không chạy nên mình bỏ đi.
Mình đã nối chân số1 của pic qua điện trở 10k lên dương nguồn. Có cách nào để kiểm tra con pic ko. @bnthang ý bạn là kiểm tra gì thế. Mình tưởng hàm đấy là thư viện chuẩn để sử dụng lcd. |
1 là pic của bạn hỏng,2 là bạn cắm board không chính xác các chân điều khiển và data chứ với code trên mình thử cắm trên board thì chạy hoàn toàn bình thường,việc bạn để delay 100ms là quá ít để bạn kịp nhìn thấy chữ hiện lên vì vậy mình thêm while cho bạn tiện quan sát,bạn nên kiểm tra lại chứ code thì hoàn toàn đúng,mình đã kiểm chứng giúp bạn trên mạch thật rồi
|
Các hàm điều khiển có thể cả chân kết nối nữa đều năm trong file lcd.c. Bạn phải gởi cả file này nữa mới kiểm tra được.
|
@dientu09: Mình nghĩ pic hỏng thì chắc ko phải vì khi nạp code mình vẫn thấy báo nhận device. Còn cắm bo sai thì chắc cũng không vì mạch này đơn giản mà, mình chỉ sợ chân nào đấy cắm chưa chặt thôi.
@bnthang: đây là toàn bộ file lcd.c. Mình đính kèm file mấy lần không được đành cop paste ra đây vậy. Tình hình là cứ cắm nguồn vào thì dòng2 lcd vẫn hiện đen xì. Nếu mình để delay trước lcd_gotoxy thì một lúc sau sẽ mất và hiển thị cả 2 dòng đen nhưng nhạt hơn. Nếu mình không để delay thì dòng2 lcd hiện đen xì mãi. /////////////////////////////////////////////////////////////////////////// //// LCDD.C //// //// Driver for common LCD modules //// //// //// //// lcd_init() Must be called before any other function. //// //// //// //// lcd_putc(c) Will display c on the next position of the LCD. //// //// The following have special meaning: //// //// \f Clear display //// //// \n Go to start of second line //// //// \b Move back one position //// //// //// //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) //// //// //// //// lcd_getc(x,y) Returns character at position x,y on LCD //// //// //// /////////////////////////////////////////////////////////////////////////// //// (C) Copyright 1996,2003 Custom Computer Services //// //// This source code may only be used by licensed users of the CCS C //// //// compiler. This source code may only be distributed to other //// //// licensed users of the CCS C compiler. No other use, reproduction //// //// or distribution is permitted without written permission. //// //// Derivative programs created using this software in object code //// //// form are not restricted in any way. //// /////////////////////////////////////////////////////////////////////////// // As defined in the following structure the pin connection is as follows: // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 // // LCD pins D0-D3 are not used and PIC D3 is not used. // Un-comment the following define to use port B // #define use_portb_lcd TRUE struct lcd_pin_map { // This structure is overlayed BOOLEAN enable; // on to an I/O port to gain BOOLEAN rs; // access to the LCD pins. BOOLEAN rw; // The bits are allocated from BOOLEAN unused; // low order up. ENABLE will int data : 4; // be pin B0. } lcd; #if defined use_portb_lcd #locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port #define set_tris_lcd(x) set_tris_b(x) #else #locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port #define set_tris_lcd(x) set_tris_d(x) #endif #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the second line BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up. // The following are used for setting // the I/O port direction register. struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in BYTE lcd_read_byte() { BYTE low,high; set_tris_lcd(LCD_READ); lcd.rw = 1; delay_cycles(1); lcd.enable = 1; delay_cycles(1); high = lcd.data; lcd.enable = 0; delay_cycles(1); lcd.enable = 1; delay_us(1); low = lcd.data; lcd.enable = 0; set_tris_lcd(LCD_WRITE); return( (high<<4) | low); } void lcd_send_nibble( BYTE n ) { lcd.data = n; delay_cycles(1); lcd.enable = 1; delay_us(2); lcd.enable = 0; } void lcd_send_byte( BYTE address, BYTE n ) { lcd.rs = 0; while ( bit_test(lcd_read_byte(),7) ) ; lcd.rs = address; delay_cycles(1); lcd.rw = 0; delay_cycles(1); lcd.enable = 0; lcd_send_nibble(n >> 4); lcd_send_nibble(n & 0xf); } void lcd_init() { BYTE i; set_tris_lcd(LCD_WRITE); lcd.rs = 0; lcd.rw = 0; lcd.enable = 0; delay_ms(15); for(i=1;i<=3;++i) { lcd_send_nibble(3); delay_ms(5); } lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } void lcd_gotoxy( BYTE x, BYTE y) { BYTE address; if(y!=1) address=lcd_line_two; else address=0; address+=x-1; lcd_send_byte(0,0x80|address); } void lcd_putc( char c) { switch (c) { case '\f' : lcd_send_byte(0,1); delay_ms(2); break; case '\n' : lcd_gotoxy(1,2); break; case '\b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break; } } char lcd_getc( BYTE x, BYTE y) { char value; lcd_gotoxy(x,y); while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low lcd.rs=1; value = lcd_read_byte(); lcd.rs=0; return(value); } |
2 Attachment(s)
Đây là đồ án thầy giao, mong a chị giúp với, nhìn vào em chả biết lập trình trong micro c như thế nào nữa.
Cho em xin code của c nếu có hihi dưới đây là hình nè: [ATTACH=CONFIG]42592[/ATTACH] [ATTACH=CONFIG]42593[/ATTACH] mong từng ngày!!! |
Bạn tăng thời gian Delay lwn đi chứ 100ms nhanh lắm
|
Cuối cùng thì nó cũng chạy. Lỗi chỉ tại mình mắc ngược dây dữ liệu. Nhưng lại có một vấn đề là nó hiển thị chậm quá mình đợi mãi tầm >30 giây nó mới hiển thị dòng đầu tiên và cũng mất lâu như thế để hiện ký tự dòng 2. Có cách nào tăng lên không. Mình để delay_ms(100).
|
Mạch cảm biến nhiệt độ và áp suất bằng pic16f877a
2 Attachment(s)
đây là đồ án thầy giao về làm nhưng đối với em thì khó quá, hi vọng được sự giúp đỡ của các pro trong diễn dàn.
ở đây em lập trình trên micro c nhưng em cũng chỉ mới biết sơ sơ thôi, nếu có code để tham khảo thì hay wa! Mong từng ngày!!! Dưới đây là yêu cầu của bài: |
hepl sao khôn ai giúp hết vậy kia. chỉ mình vs.
|
Mạch cảm biến nhiệt độ và áp suất bằng pic16f877a
2 Attachment(s)
đây là đồ án thầy giao về làm nhưng đối với em thì khó quá, hi vọng được sự giúp đỡ của các pro trong diễn dàn.
ở đây em lập trình trên micro c nhưng em cũng chỉ mới biết sơ sơ thôi, nếu có code để tham khảo thì hay wa! Mong từng ngày!!! Dưới đây là yêu cầu của bài: Hình đính kèm: |
các bác giải thích giùm em đoạn code này với,em mới học pic nên còn ngu quá
#include <16F877a.h>
#include <LCD.C> #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) //==================khai bao ham con============= int quetphim(); int checkphim(b); void pwm(); void ghi_tocdo(); void ghi_thoigian(); void clear(); void read_rom(); //==================khai bao bien================ int8 i,t,a,b,c,d,sttphim,duty,ct,l,m; int16 s_xung,s_vong,setpoint,error,luu,tg,tg1,dem; //================ bien luu eeprom============== int8 e0,e1,e2,e3,j,k; int16 e; //================chuong trinh quet phim========== //quet phim so int quetphim() { output_b(0xe0);// B4=0 a=0; b=1; checkphim(b); if (a!=0) {delay_ms(200); return (sttphim);} output_b(0xd0);// B5=0 a=0; b=2; checkphim(b); if (a!=0) {delay_ms(200); return (sttphim);} output_b(0xb0);// B6=0 a=0; b=3; checkphim(b); if (a!=0) {delay_ms(200); return (sttphim);} output_b(0x70);// B6=0 a=0; b=4; checkphim(b); if (a!=0) {delay_ms(200); return (sttphim);}} //============chuong trinh check phim============= int checkphim(b) { switch (b) { case 1: if(!input(pin_a0)) {sttphim=1; a=1;} else if(!input(pin_a1)) {sttphim=2; a=1;} else if(!input(pin_a2)) {sttphim=3; a=1;} else if(!input(pin_a3)) { sttphim=10;//thuan a=1;} else {} break; case 2: if(!input(pin_a0)) {sttphim=4; a=1;} else if(!input(pin_a1)) {sttphim=5; a=1;} else if(!input(pin_a2)) {sttphim=6; a=1;} else if(!input(pin_a3)) {sttphim=11;//nghich a=1;} else {} break; case 3: if(!input(pin_a0)) {sttphim=7; a=1;} else if(!input(pin_a1)) {sttphim=8; a=1;} else if(!input(pin_a2)) {sttphim=9; a=1;} else if(!input(pin_a3)) {sttphim=12;//stop a=1;} else {} break; case 4: if(!input(pin_a0)) {sttphim=0;//0 a=1;} else if(!input(pin_a1)) {sttphim=15;//save a=1;} else if(!input(pin_a2)) {sttphim=14;//clear a=1;} else if(!input(pin_a3)) {sttphim=13;//set a=1;} else {} break;} return (sttphim); } // chuong trinh nhan xung tu encoder //ngat ngoai, nhan xung tu encoder #int_ext void RB0_isr() { s_xung++;//dem so xung o chan RB0 } //ngat timer1, tinh toan pwm va hien thi #int_timer1 void timer1_isr() { set_timer1(-62500); if (t==5){ S_vong=s_xung*2;//xung tren phut //ht lcd_gotoxy(1,1); printf(lcd_putc," "); if(ct==1) { lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=%lu v/p",luu);} else { lcd_gotoxy(1,1); printf(lcd_putc,"TG_dat=%lu s",tg);} lcd_gotoxy(1,2); printf(lcd_putc," "); if (d==2) {lcd_gotoxy(1,2); printf(lcd_putc,"TD_tt=-%luv/p",s_vong);} if (d==1) {lcd_gotoxy(1,2); printf(lcd_putc,"TD_tt= %luv/p",s_vong);} //========================= //xuat pwm pwm(); //======================== s_xung=0; s_vong=0; t=0; set_timer1(-62500); } else t++; set_timer1(-62500); } //ngat timer0, dat thoi gian #int_timer0 void time0_irs() { set_timer0(-235); if (dem>=tg1) { output_high(pin_e0); delay_us(100); output_low(pin_e0); dem=0; if (d==1) {d=2;} else if (d==2) {d=1;} else{} set_timer0(-235); } else { dem++; set_timer0(-235);} } //chuong trinh chinh void main() { i=0; sttphim=0; setpoint=0;tg=0; duty=0; c=0; d=0; ct=0;l=0;m=0; e0=0;e1=0;e2=0;e3=0;e=0;k=0; //================================================== ========== //1:ngo vao;0: la ngo ra set_tris_b(0b00001111);//4 chan RB4-RB7 xuat du lieu ra ban phim set_tris_a(0b00001111);//4 chan RA0-RA3 nhan du lieu tu ban phim set_tris_c(0b00000000);//2 chan RC0 va RC1 xuat PWM set_tris_D(0b00000000);//port D la port xuat du lieu ra LCD //================================================== ========== setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); /* timer1 la bo dinh thoi su dung xung noi,bo chia 1:8 thay doi moi 1600ns Dung timer1 de ngat moi 0.1s do vay ta dat gia tri cho timer1 la : 0.1s/1600ns=62500(D)=F424(H) =>gia tri nap la FFFF-F424=BDB*/ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); enable_interrupts(int_ext);//khoi dong ngat ngoai ext_int_edge(H_TO_L); // xung tu cao xuong thap enable_interrupts(global);// khoi dong bit ngat GIE setup_timer_2(T2_DIV_BY_4,249,1); /*timer2 dung dinh thoi cho bo PWM mode: bo chia thoi gian (prescale) cua timer2 1:4 period: gia tri nap chi thanh ghi PR2 postscale : bo chi ra,chon 1:1 PWM khong dung Thach anh 20MHz, PWM fre: 10000Hz, thay doi duty cycle(%) de thay doi toc do*/ setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(0); set_pwm2_duty(0); //================================================== ========= lcd_init(); lcd_send_byte(0,0x01); lcd_gotoxy(1,1); printf(lcd_putc,"CHUONG TRINH DK "); lcd_gotoxy(1,2); printf(lcd_putc," TD DONG CO DC "); delay_ms(1000); lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," "); read_rom(); lcd_gotoxy(1,1); printf(lcd_putc,"CHON CHE DO :_ "); while (true) { while (c==0) { quetphim(); if (a!=0) { if (sttphim==1) { ct=1; c=1; lcd_gotoxy(1,1); printf(lcd_putc,"CHON CHE DO :_%u",ct);} if (sttphim==2) { ct=2; c=1; lcd_gotoxy(1,1); printf(lcd_putc,"CHON CHE DO :_%u",ct);} } } if (ct==1) {lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=_ v/p"); lcd_gotoxy(1,2); printf(lcd_putc,"TD_luu=%lu v/p",e);} else { lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=_ v/p"); lcd_gotoxy(1,2); printf(lcd_putc,"TG_dat=_ s");} While (c==1) { quetphim(); if (a!=0) { if (sttphim>=0 && sttphim<=9)//ban phim tu 0--->9 { if (m==0) {ghi_tocdo();} if((ct==2)&&(m==1)) {ghi_thoigian();} } if (sttphim==14) {clear();} if ((sttphim==13)&&(i==0)&&(e==0)) { lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"Phai nhap TD_dat"); delay_ms(1000); lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=_"); } if ((sttphim==15)&&(i!=0)) //luu vao eeprom { write_eeprom(0,e0); delay_ms(100); write_eeprom(1,e1); delay_ms(100); write_eeprom(2,e2); delay_ms(100); write_eeprom(3,e3); delay_ms(100); write_eeprom(4,i); delay_ms(100); lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," LUU THANH CONG "); } if ((sttphim==13)&&((i!=0)||(e!=0))) { if (ct==1) { c=2; if (e!=0 && i==0) luu=e;} if ((ct==2)&&(l>=2)) { c=2;} m=1; }}} while (c==2) { quetphim(); if(a!=0) { if(sttphim==10) { lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," QUAY THUAN "); if (ct==2) {enable_interrupts(int_timer0); set_timer1(-235);} enable_interrupts(int_timer1); enable_interrupts(global); set_timer1(-62500); set_pwm1_duty(duty); d=1; } if (sttphim==11) { lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," QUAY NGHICH "); if (ct==2) {enable_interrupts(int_timer0); set_timer1(-235);} enable_interrupts(int_timer1); enable_interrupts(global); set_timer1(-62500); set_pwm2_duty(duty); d=2; } if (sttphim==12)//stop { disable_interrupts(int_timer0); set_timer0(0); disable_interrupts(int_timer1); set_pwm1_duty(0); set_pwm2_duty(0); lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," STOP "); duty=0; d=0; } if (sttphim==14) { clear(); c=0; lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"CHON CHE DO :_ "); }}}}} void pwm() { if ((luu>s_vong)&& duty<250) {error=luu-s_vong; if (error>1000) duty=duty+50; else if (error>100) duty=duty+20; else if (error>30) {duty=duty+5;} else if (error>20) duty=duty+1.5; else if (error>10) duty=duty+(0.05*error); else {duty=duty+(0.025*error);} } if (luu<(s_vong-2)&& (duty>0)) {error=s_vong-luu; if (error>=10) duty=duty-(0.05*error); else (duty=duty-(0.02*error)); } if(luu==s_vong) duty=duty; if((duty>=250)&&(luu>s_vong)) { lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc," TD_tt=MAX ");} if (d==0) {set_pwm1_duty(0); set_pwm2_duty(0);} else if (d==1) {set_pwm1_duty(duty); set_pwm2_duty(0);} else {set_pwm1_duty(0); set_pwm2_duty(duty);} } //========chuong trinh con nhap toc do======= void ghi_tocdo() { if(i>=0&&i<=3) { // giai thuat luu eeprom if (i==0) e0=sttphim; else if (i==1) e1=sttphim; else if (i==2) e2=sttphim; else {e3=sttphim;} //=============================== setpoint*=10; setpoint+=sttphim; i++; lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=%lu v/p",setpoint); luu=setpoint; } else { lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"0<TD_dat<=9999"); delay_ms(1000); lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=%lu s",setpoint); }} //=========chuong trình con nhap thoi gian========= void ghi_thoigian() { if(l>=0&&l<=3) { tg*=10; tg+=sttphim; l++; lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc,"TG_dat=%lu s",tg); tg1=tg/0.12; } else { lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc," 0<TG_dat<=999 "); delay_ms(1000); lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc,"TG_dat=%lu s",tg); }} //============chuong trinh con clear========= void clear() { setpoint=0; tg=0; i=0;l=0;m=0; e0=0;e1=0;e2=0;e3=0; lcd_gotoxy(1,1); printf(lcd_putc," "); lcd_gotoxy(1,1); printf(lcd_putc,"TD_dat=_"); lcd_gotoxy(1,2); printf(lcd_putc," "); lcd_gotoxy(1,2); printf(lcd_putc,"TG_dat=_"); } //=======chuong trinh con luu toc do vao epprom====== void read_rom() { k=read_eeprom(4); for (j=0;j<k;j++) { e=e*10; e=e+read_eeprom(j); }} |
khi em cho vào CCS dịch thì nó báo lỗi. delay_us();,và delay_ms();
mông mí bác giúp em với. em cảm ơn mí bác nhiều
|
Cảm biến nhiệt độ và áp suất. 16f877a
-------------------------------------------------------------------------------- Phần này là sode của em đang làm, phần em đang gặp rắc rối là làm sao cho: Nếu áp suất đo được nhỏ hơn 50 Pascal thì động cơ máy nén chạy với vận tốc 100%, nếu 50<P<70 Pascal thì động cơ máy nén chạy với vận tốc 70%, nếu 70<P<90 Pascal thì động cơ máy nén chạy với vận tốc 50%. Nếu P>90 Pascal thì động cơ máy nén chạy với vận tốc 30%. Dưới đây là yêu cầu đề bài của em và code mong các pro chữa dùm em. #define chay PORTD.0 //Khai bao chan RB0 la ngo dieu khien quay thuan. #define dung PORTD.1 //Khai bao chan RB1 la ngo dieu khien quay nghich. //sbit chay at RD0_bit; //sbit dung at RD1_bit; void main() //Khai bao chuong trinh chinh. { unsigned long nhietdo; //Khai bao bien nhiet do chua gia tri nhiet do doc duoc. unsigned long apsuat; unsigned char chuoi[12]; //Khai bao bien chuoi dang mang 1 chieu co 12 phan tu. Moi phan tu chinh la mot ky unsigned char chuoi1[12]; unsigned char i,j,ketqua[5]; //Khai bao bien i, j de chay vong lap xu ly chuoi. Bien ketqua la mang 1 chieu co 5 unsigned char k,m,ketqua1[5]; TRISB = 0; trisc=0; portc=0; trisd=0; portd=0; Lcd_Init(&PORTB); // LCD duoc noi voi PORTB theo cac chan mac dinh la ADCON1 = 0x80; // Thiet lap cac ngo vao analog va dien ap tham chieu Vref = Vdd = 5V. ADCON0 = 0xC1;//Chon va cho phep xung clock TRISA = 0xff; PORTA=0; //Gan gia tri ban dau cho cac chan cua PORT A = 0 //Hien thi loi gioi thieu Lcd_Cmd(LCD_CLEAR); //Xoa man hinh LCD Lcd_Cmd(LCD_CURSOR_OFF); //Tat hien thi con tro Lcd_Out(1,1,"nhietdo,apsuat"); //Hien thi dong chu "Chuong trinh do nhiet do" ra LCD tai vi tri 1x1. Delay_ms(1000); //Cho 2000 mili giay Lcd_Cmd(LCD_CLEAR); //Xoa man hinh LCD while(1) //Vong lap vo tan de lap lai chuong trinh { //Doc nhiet do nhietdo=Adc_read(0); // Doc ket qua chuyen doi AD tu kenh 0. Delay_ms(100); //Cho 200 mili giay nhietdo=nhietdo/2; //Tinh gia tri nhiet do = gia tri doc chia cho he so chuyen doi (vi du: 2). LongToStr(nhietdo,chuoi); //Chuyen gia tri cua bien nhiet do sang dang chuoi va luu trong bien chuoi. //Xu ly chuoi de loai bo cac khoang trang va luu ket qua xu ly vao bien ket qua. j=0; //Gan gia tri ban dau bang 0 cho bien j (phan tu cua bien ket qua). for(i=0;i<=11;i++) //Vong lap voi bien i chay 12 lan de quet cac phan tu cua bien chuoi { if(chuoi[i] != ' ') // Neu phan tu thu i cua chuoi khong phai la khoang trang thi { ketqua[j]=chuoi[i]; //Gan phan tu thu i cua chuoi cho phan tu thu j cua ket qua. j++; //Tang gia tri cua bien j len 1 } } //doc ap suat apsuat=Adc_read(1); // Doc ket qua chuyen doi AD tu kenh 0. Delay_ms(100); //Cho 200 mili giay apsuat=apsuat/2; //Tinh gia tri nhiet do = gia tri doc chia cho he so chuyen doi (vi du: 2). LongToStr(apsuat,chuoi1); //Chuyen gia tri cua bien nhiet do sang dang chuoi va luu trong bien chuoi. //Xu ly chuoi de loai bo cac khoang trang va luu ket qua xu ly vao bien ket qua. m=0; //Gan gia tri ban dau bang 0 cho bien j (phan tu cua bien ket qua). for(k=0;k<=11;k++) //Vong lap voi bien i chay 12 lan de quet cac phan tu cua bien chuoi { if(chuoi[k]!=' ') // Neu phan tu thu i cua chuoi khong phai la khoang trang thi { ketqua1[m]=chuoi1[k]; //Gan phan tu thu i cua chuoi cho phan tu thu j cua ket qua. m++; //Tang gia tri cua bien j len 1 } } if(ketqua<30 ) { portc=0b00000001; } if(ketqua>50) { portc=0b00000001; } if(Adc_read(1)<512) { unsigned char duty_cycle; pwm_init(5000); // khoi tao modul pwm voi tan so 5Kz pwm_start(); // khoi dong ham pwm for(duty_cycle=253; duty_cycle<255; duty_cycle++) /* bien duty_cycle tang tu 0 den 51 de tang toc do tu 0 den 20 vong/phut*/ { pwm_change_duty(duty_cycle); // DIEU RONG XUNG VOI DUTY_CYCLE LA BIEN //if(dung==1)goto restart; //NHAN NUT DUNG THI NHAY TOI NHAN RESTART delay_ms(1); // TAO THOI GIAN TRE 0.19S sau } } else if(512<Adc_read(1)<717) { unsigned char duty_cycle; pwm_init(5000); // khoi tao modul pwm voi tan so 5Kz pwm_start(); // khoi dong ham pwm for(duty_cycle=177; duty_cycle<178; duty_cycle++) /* bien duty_cycle tang tu 0 den 51 de tang toc do tu 0 den 20 vong/phut*/ { pwm_change_duty(duty_cycle); // DIEU RONG XUNG VOI DUTY_CYCLE LA BIEN //if(dung==1)goto restart; //NHAN NUT DUNG THI NHAY TOI NHAN RESTART delay_ms(1); // TAO THOI GIAN TRE 0.19S sau } } else if(717<Adc_read(1)<922) { unsigned char duty_cycle; pwm_init(5000); // khoi tao modul pwm voi tan so 5Kz pwm_start(); // khoi dong ham pwm for(duty_cycle=126; duty_cycle<127; duty_cycle++) /* bien duty_cycle tang tu 0 den 51 de tang toc do tu 0 den 20 vong/phut*/ { pwm_change_duty(duty_cycle); // DIEU RONG XUNG VOI DUTY_CYCLE LA BIEN //if(dung==1)goto restart; //NHAN NUT DUNG THI NHAY TOI NHAN RESTART delay_ms(1); // TAO THOI GIAN TRE 0.19S sau } } else if(Adc_read(1)>922) { unsigned char duty_cycle; pwm_init(5000); // khoi tao modul pwm voi tan so 5Kz pwm_start(); // khoi dong ham pwm for(duty_cycle=76; duty_cycle<77; duty_cycle++) /* bien duty_cycle tang tu 0 den 51 de tang toc do tu 0 den 20 vong/phut*/ { //pwm_change_duty(duty_cycle); // DIEU RONG XUNG VOI DUTY_CYCLE LA BIEN //if(dung==1)goto restart; //NHAN NUT DUNG THI NHAY TOI NHAN RESTART delay_ms(1); // TAO THOI GIAN TRE 0.19S sau } } //Hien thi ket qua Lcd_Cmd(LCD_CLEAR); //Xoa man hinh LCD Lcd_Cmd(LCD_CURSOR_OFF); //Tat hien thi con tro Lcd_Out(1,1,"nhietdo:"); //Hien thi dong chu "Nhiet do (0C):" ra LCD tai vi tri 1x1. Lcd_Out(1,9,ketqua); //Hien thi gia tri nhiet do dang chuoi luu trong bien ketqua ra LCD tai dong thu 2. //Lcd_out(1,9,"0C"); //Delay_us(100); //Cho 500 mili giay cho lan doc gia tri tiep theo. //HIEN THI AP SUAT //Lcd_Cmd(LCD_CLEAR); //Xoa man hinh LCD //Lcd_Cmd(LCD_CURSOR_OFF); //Tat hien thi con tro Lcd_Out(2,1,"apsuat:"); //Hien thi dong chu "Nhiet do (0C):" ra LCD tai vi tri 1x1. //Lcd_Cmd(LCD_SECOND_ROW); //Chuyen con tro xuong dong thu 2. Lcd_Out(2,8,ketqua1); //Hien thi gia tri nhiet do dang chuoi luu trong bien ketqua ra LCD tai dong thu 2. //Delay_us(100); //Cho 500 mili giay cho lan doc gia tri tiep theo. } } Hình Ðính Kèm http://www.picvietnam.com/forum/show...6014#post56014 |
Múi giờ GMT. Hiện tại là 03:32 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam