17-12-2007, 11:24 AM
|
#11
|
Đệ tử 6 túi
Tham gia ngày: Oct 2006
Bài gửi: 147
:
|
help về Lm335+16F877A+LCD1602
lâu rùi không động chạm PIC nên quên mứt..!!!
mọi người cho em hỏi :::
Trích:
Mach do nhiet do
- MCU = PIC16F877A
- Sensor = LM335 (co the thay the bang LM35D)
- MAX232 giao tiep may tinh
- LCD1602A de hien thi gia tri nhiet do
Mo ta phan cung:
- Mach cho sensor mac nhu trong Datasheet cua LM335
Chan V_out noi qua dien tro 1K voi +5V. Chan nay cung duoc noi voi kenh AN0 cua PIC
Chan Adj noi voi dien tro 10K de tinh chinh
Chan GND noi dat
- Mach VDK gom co LCD va max232
LCD noi voi PORTD cua PIC
RS -> RD2, RW -> GND, E -> RD3
D4-D7 -> RD4-RD7
Max232:
chan10 -> RC6, chan9 -> RC7
chan8 -> chan3 DB9, chan7 -> chan2 DB9, chan5 DB9 -> GND
Kenh AN0 cua PIC noi den chan V_out LM335
Nut bam noi tai chan RB0 -> nhan ngat ngoai
Thach anh loai 20MHz, tu 22pF
#include <16F877A.h>
#include <def_877a.h>
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7, bits=9)
#include <lcd_lib_4bit.c>
int8 low,high,key,mode,min,max,mode1,i;
int1 blink,on_off,blink_min,blink_max;
int1 do_F;
void convert_bcd(int8 x);
void set_blink();
void bao_dong();
void test();
//-----------------------------------------------------------------
void main()
{
float value;
on_off =1;
min =15; //nhiet do min default
max =35; //nhiet do max default
do_F =0 ;
i = 0 ;
mode =0 ;
mode1 = 0 ;
blink=0 ;
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
LCD_init();
Printf(LCD_putchar,"Lop DT8 - BKHN");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Khoi tao...");
// Khoi tao cho ngat ngoai
enable_interrupts (INT_EXT);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
// Lay mau nhiet do lan dau tien
value=(float)read_adc();
value = (value - 558.5)/2.048; // For 5V supply
// value = (value - 754.8)/2.048; // For 3.7V Supply
// value = (value - 698.2)/2.048; // For 4V supply
convert_bcd((int8)value); // Chuyen doi tach so tram, chuc, donvi de hien thi len LED 7
delay_ms(1000);
LCD_putcmd(0xC0);
Printf(LCD_putchar," Init OK");
while(1)
{
if (i==25)
{
value = read_adc();
value=(value-558.5)/2.048;
if (do_F==1) value=1.8*value+32;
convert_bcd((int8)value);
printf("\n\rNhiet do phong: %u",value);
LCD_putcmd(0xC0);
printf(LCD_putchar," T = ");
LCD_putchar(high); LCD_putchar(low);
if (do_F==0) printf(LCD_putchar," C");
else printf(LCD_putchar," F");
i=0;
}
i++;
if(((int8)value > 40) || ((int8)value < 15)) on_off=1;
else
{
on_off = 0;
LCD_Putcmd(0xCF);
LCD_putchar(" ");
blink=0;
}
if (on_off==1)
{
if (blink==0) { LCD_Putcmd(0xCF);LCD_putchar("!");blink=1;delay_ms (250);}
else {LCD_Putcmd(0xCF);LCD_putchar(" ");blink=0;delay_ms(250);}
}
}
}
//end main-----------------------------------------------------------
#INT_EXT
void test()
{
if (do_F == 1) do_F=0;
else do_F=1;
}
void set_blink()
{
switch(mode)
{
case 1: blink_min=1; break;
case 2: {blink_max=1; blink_min=0;} break;
case 3: {mode=0; blink=0; blink_min=0; blink_max=0;} break;
}
}
void convert_bcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
}
void bao_dong(){
int8 i;
if (blink == 0) blink = 1;
else blink=0;
for(i=0;i<50;i++)
{
LCD_Putcmd(0xCF);
if (blink==0) LCD_putchar("!");
else LCD_putchar(" ");
}
}
|
cho em hỏi chương trình này của anh linh ạ.nhưng sao nó cứ báo lỗi ở :
Trích:
trisa = 0xFF;
trisb = 0x01;
trisd = 0x00;
|
cám ơn..!
|
|
|