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);
}
}
Chương trình có tham khảo từ các bài viết trên Picvietnam và dientuvietnam.
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ộ .