e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.E lập trình bằng C18
phần code hiển thị ra led 7 thanh:
Code:
#include "p18f4620.h"
#include "delays.h"
#include "adc.h"
#pragma config OSC=HS, WDT=OFF
const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int a,b,n,doC,dvi,chuc,tram;
void convert(int a)
{
tram=a/100;
a=a%100;
chuc=a/10;
dvi=a%10;
}
void hienthi() // quet led
{
for(n=0;n<10;n++)
{
PORTB=dig[dvi];
PORTD=0x01; //bat led 1
Delay100TCYx(20); // tre 100us
PORTB=dig[chuc];
PORTD=0x02; // bat led 2
Delay100TCYx(20);
PORTB=dig[tram];
PORTD=0x04; // bat led 3
Delay100TCYx(20);
}
}
void main(void)
{
TRISB=0; // chon cong B la cong ra
TRISD=0; // chon cong D la cong ra
TRISAbits.TRISA0=1; // chon cong A la cong vao
ADCON0=0x03; //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
ADCON1=0x0E; //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
ADCON2bits.ACQT2=1; //
ADCON2bits.ACQT1=0; //
ADCON2bits.ACQT0=0; //3 bits lua chon thoi gian thu thap du lieu TAD
ADCON2bits.ADCS2=1; //
ADCON2bits.ADCS1=0; //
ADCON2bits.ADCS0=1; //3 bits lua chon tan so chuyen doi
Delay10TCY();
b = ReadADC();
doC = (b-558.558)/2.048; //tùy ADC 8bit hay 10 bit tính toán giá tri
a = doC;
convert((int)a);
Delay10TCY();
while(1)
{
b = ReadADC();
doC = (b-558.558)/2.048;
convert((int)a);
hienthi();
}
}
và phần ra LCD
Code:
#include "p18f4620.h"
#include "delays.h"
#include "adc.h"
#pragma config OSC=HS, WDT=OFF
char adc;
long s; float doC;
unsigned char li,lj;
#define rs LATDbits.LATD0
#define rw LATDbits.LATD1
#define en LATDbits.LATD2
void delay (unsigned char time ) // ham co tac dung delay thoi gian lon
{
for ( li=0 ; li<80; li++ )
for ( lj=0 ; lj<time; lj++)
{}
}
void lenh_LCD (unsigned char s) // ham dua 1 lenh ra ngoai LCD
{
LATC=s;
rs=0; // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
rw=0;
en=1;
delay(1);
en=0;
delay(1);
}
void data_LCD (unsigned char s) // ham dua 1 lenh ra ngoai LCD
{
LATC=s;
TRISD=0xF8 ; // cho 3 bit thap nhat duoc lam cong ra
rs=1; // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
rw=0;
en=1;
delay(1);
en=0;
}
void main(void)
{
int kq;
INTCON=0x00;
TRISAbits.TRISA0=1; //cong A0 lam dau vao tu cam bien
TRISC=0x00; //cong C lam cong ra du lieu
TRISD=0xF8; //3 bit thap nhat lam cong ra dieu khien
lenh_LCD(0x38); // dua ra LCD gia tri hang cot la 5*7
lenh_LCD(0x0C); // hien con tro
// lenh_LCD(0x01); // xoa man hinh LCD
ADCON0=0x00; //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
ADCON1=0x0E; //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
ADCON2bits.ACQT2=0; //
ADCON2bits.ACQT1=0; //
ADCON2bits.ACQT0=1; //3 bits lua chon thoi gian thu thap du lieu TAD
ADCON2bits.ADCS2=1; //
ADCON2bits.ADCS1=0; //
ADCON2bits.ADCS0=0; //3 bits lua chon tan so chuyen doi
Delay10TCY();
ADCON0bits.ADON=1;
while(1)
{
ADCON0bits.GO=1;
Delay10TCYx(2);
ADCON0bits.GO=0;
adc = ReadADC();
doC=(adc-558.558)/2.048; // ADC 10 bit tính toán giá tri
lenh_LCD(0x01);
delay(100);
kq=(int)doC;
data_LCD((int)doC);
data_LCD('.');
kq=(doC-kq)*100;
data_LCD((unsigned char)kq);
data_LCD('d');
data_LCD('o');
data_LCD('C');
delay(100);
}
}
mạch ở file kèm theo