|
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'); } |