|
Tài trợ cho PIC Vietnam |
Analog - Bộ nhớ - Bảo mật - Cảm biến nhiệt độ Thảo luận việc sử dụng và thay thế các sản phẩm Analog, Memory, KEELOG và cảm biến nhiệt độ của Microchip cho các thiết kế |
|
Ðiều Chỉnh | Xếp Bài |
|
19-11-2014, 10:33 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Nov 2014
Bài gửi: 3
: |
Ghép nối dsPic30f4011 với cảm biến nhiệt độ LM35
Chào các bạn, mình đang làm 1 đề tài ghép nối dsPic30f4011 với cảm biến LM35, chuyển đổi ADC và hiển thị giá trị nhiệt độ lên LCD. Mình đã viết 1 chương trình nhưng kết quả hiển thị lên LCD bị sai,nó hiển thị 'Nhiet Do: 500", mọi người cho mình ý kiến, mình nghĩ có lẽ do chương trình chuyển đổi ADC mình viết sai.
Đầu ra của cảm biến mình nối vào chân AN0(RB0) #include<p30f4011.h> _FOSC(CSW_FSCM_OFF & HS); // Set up for Crystal _FWDT(WDT_OFF); // Turn off the Watch-Dog Timer _FBORPOR(MCLR_EN & PWRT_OFF); // Enable MCLR reset pin and turn off the power-up timers #define port_lcd4 LATBbits.LATB5 #define port_lcd5 LATBbits.LATB6 #define port_lcd6 LATBbits.LATB7 #define port_lcd7 LATBbits.LATB8 #define rs LATBbits.LATB1 #define rw LATBbits.LATB3 #define e LATBbits.LATB4 unsigned int adc_data,adc_data1; unsigned char adc_tram,adc_chuc,adc_donvi,adc_thapphan; void delay_ms(int delay) { int i,j; for(i=0;i<delay;i++) for(j=0;j<250;j++) {;} } void lcd_send4bits(unsigned char byte) { port_lcd4=(byte>>4)&1; port_lcd5=(byte>>5)&1; port_lcd6=(byte>>6)&1; port_lcd7=(byte>>7)&1; e=1; delay_ms(100); e=0; port_lcd4=byte&1; port_lcd5=(byte>>1)&1; port_lcd6=(byte>>2)&1; port_lcd7=(byte>>3)&1; e=1; delay_ms(100); e=0; } void lcd_init() { rs=0; rw=0; lcd_send4bits(0x28); lcd_send4bits(0x06); lcd_send4bits(0x0c); lcd_send4bits(0x01); lcd_send4bits(0x02); } void lcd_cmd(unsigned char cmd) { rs=0; rw=0; e=1; lcd_send4bits(cmd); } void lcd_data(unsigned char data) { rs=1; rw=0; lcd_send4bits(data); delay_ms(1000); } void khoitao_adc() { ADPCFG=0xFFFF; ADPCFGbits.PCFG0=0;//tao chan RB0 lam cong vao ADCON3bits.ADCS=63;//////////////T =22Tcy ADCON1bits.SSRC=0;// Clearing SAMP bit ends sampling and starts conversion ADCON1bits.ASAM = 0;//no auto-lau mau ADCHSbits.CH0SA=2; ADCON2bits.ALTS=0; ADCON2bits.VCFG=3; ADCON1bits.FORM=0; ADCHS = 0x0000; //ADCHS Register //Set up A/D Channel Select Register to convert AN0 on Mux A //input of CH0 and CH1 S/H amplifiers ADCSSL = 0x0000;//Channel Scanning is disabled. All bits left to their default state ADCON1bits.ADON=1;//start } void start_adc() { ADCON1bits.SAMP=1; delay_ms(10); ADCON1bits.SAMP = 0; // start Converting while(!ADCON1bits.DONE); { adc_data1=ADCBUF0; adc_data=adc_data1/2.046; adc_tram=adc_data/100; adc_data=adc_data-adc_tram*100; adc_chuc=adc_data/10; adc_data=adc_data-adc_chuc*10; adc_donvi=adc_data; } } void main() { TRISBbits.TRISB0=1; TRISBbits.TRISB1=0; TRISBbits.TRISB3=0; TRISBbits.TRISB4=0; TRISBbits.TRISB5=0; TRISBbits.TRISB6=0; TRISBbits.TRISB7=0; TRISBbits.TRISB8=0; lcd_init(); khoitao_adc(); start_adc(); lcd_data('N'); lcd_data('h'); lcd_data('i'); lcd_data('e'); lcd_data('t'); lcd_data(' '); lcd_data('D'); lcd_data('o'); lcd_data(':'); lcd_data(adc_tram+'0'); lcd_data(adc_chuc+'0'); lcd_data(adc_donvi+'0'); } |
03-10-2015, 04:11 PM | #2 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 12
: |
Hình như cái main thiếu vòng lặp while hoặc vòng lặp tương tự để vđk loop.
Bạn xem lại coi đúng không? Chỗ hiển thị nhiệt độ, bạn để trăm+"0" là sao nhỉ? |
03-10-2015, 04:14 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 12
: |
Hình như cái main thiếu vòng lặp while hoặc vòng lặp tương tự để vđk loop.
Bạn xem lại coi đúng không? Chỗ hiển thị nhiệt độ, bạn để trăm+"0" là sao nhỉ? Thêm: chỗ này dấu ";" là sai rồi thì phải while(!ADCON1bits.DONE); |
03-10-2015, 04:23 PM | #4 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 12
: |
Giờ mới coi lại, chủ đề từ năm ngoái tới giờ không ai thèm trả lời. Tội chủ thớt quá không biết đã fix được chưa hay bỏ cuộc.
Diễn đàn picvietnam thành cái chùa bà Đanh rồi à hehe. Thôi em lượn. |