![]() |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Dec 2006
Bài gửi: 20
: |
Em làm mạch đo nhiệt độ sử dụng LM335Z để hiển thị LCD .
Code:
#include <16F877A.h> #include <DEFS_16F877A.h> #device*=16 adc=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #define RS RB3 #define RW RB4 #define E RB5 #byte lcd_data = PORTD // Dia chi PORTD int8 hight,low,i; float value; void convert_bcd(int8 a){ low=a%10; hight=a/10; low+=0x30;//doi ra ma ASCII de hien thi LCD hight+=0x30; } byte lcd_read_byte() { byte read_byte; set_tris_D(0xFF); // PORTD = input RW = 1; delay_cycles(1); E = 1; delay_cycles(1); read_byte = lcd_data; E = 0; set_tris_D(0x00); // PORTD = output return(read_byte); } /* Goi 1byte den LCD */ void lcd_send_byte( byte address, byte n ) { RS = 0; while ( bit_test(lcd_read_byte(),7) ) ; RS = address; delay_cycles(1); RW = 0; delay_cycles(1); E = 0; lcd_data = n; delay_cycles(1); E = 1; delay_us(2); E = 0; } /* Khoi tao ban dau cho LCD */ void lcd_init() { byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6}; byte i; set_tris_D(0x00); RS = 0; RW = 0; E = 0; delay_ms(15); for(i=1;i<=3;++i) { lcd_data = 3; delay_cycles(1); E = 1; delay_us(2); E = 0; delay_ms(5); } lcd_data = 2; delay_cycles(1); E = 1; delay_us(2); E = 0; delay_ms(5); 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=0x40; 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; } } main() { set_tris_B(0); set_tris_D(0); set_tris_A(0xFF); lcd_init(); delay_ms(100); lcd_gotoxy(3,1); lcd_putc("hello"); lcd_gotoxy(1,2); lcd_putc("Welcom Everybody"); delay_ms(2000); lcd_send_byte(0,1);//xoa LCD lcd_send_byte(0,6); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(100); value=(float)read_adc(); value=(value-558.5)/2.048; convert_bcd((int8)value); delay_us(20); lcd_putc("nhiet do:"); while(1) { value=(float)read_adc(); value=(value-558.5)/2.048; convert_bcd((int8)value); delay_ms(1000); lcd_gotoxy(2,4); lcd_putc(hight); lcd_putc(low); lcd_putc(" do C"); //delay_ms(1000); } } khi chay chương trình thì giá trị nhiệt độ hiển thị chỉ quanh các giá trị 50,52,54,56,48,58 em cũng không biết tại sao .Xin các bậc tiền bối giải đáp hộ .
__________________
Học mà không yêu là phí hoài tuổi trẻ Yêu mà không học là bán rẻ tương lai. thay đổi nội dung bởi: hawinter, 30-05-2007 lúc 01:55 PM. |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |