em làm 1 ví dụ nhỏ để xem chức năng adc của PIC, mạch chạy trên Proteus ngon lành nhưng khi lắp ra ngoài thì gặp 1 số vấn đề.
Mạch thật của em gồm 1 mạch chạy của PIC riêng, 1 nguồn dùng để đưa ra điện áp tham chiếu và điện áp cần đo ra(1 cái chia thế thôi)
ko hiểu sao lắp ra ngoài thì PIC luôn chỉ hiển thị giá trị 255 (thực ra là 25 thôi vì e dùng có 2 led 7segs)là sao? khi động tay hay đưa điện áp cần đo vào chân ra3 thì nó nhấp nháy giữa 2 giá trị 25 và 00?????
thứ 2 là khi dùng chế độ Vref ở chân r3(vref+), nối ra3 vào dương nguồn tham chiếu thì có phải nối ra2(vref-) vào đất của nguồn tham chiếu ko và GND của nguồn tham chiếu, GND của PIC, GND của tín hiệu để đo có phải nối chung với nhau ko vì em thấy khi chỉ nối dương nguồn tham chiếu vào ra3 xong và GND của nó nối chung với GND của PIC thì led sáng luôn mặc dù chưa bật công tắc nối VDD của PIC vào nguồn PIC
Code:
#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#device adc=8
#include <math.h>
#use delay(clock=4000000)
int8 hundredstens,value,hundreds,tens,units,const a[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
void display(int x,int y){
trisb=11111001;portb=0;
trisc=0x00;portc=0;
//rb1 controls led tens
//rb2 controls led units
portc=a[x];
rb1=1;delay_ms(10);
rb1=0;
portc=a[y];
rb2=1;delay_ms(10);
rb2=0;
}
void main(){
//thiet lap che do cho ports
trisa=0xff;
trisb=11111001;portb=0;
trisc=0x00;portc=0;
//adc intiate
setup_adc(adc_clock_internal);
setup_adc_ports(ANALOG_RA3_REF);
delay_us(20);
//bat dau doc dien ap o ngo vao adc
while (1){ //lap vo tan
value=read_adc();
hundredstens=(int)value/10;
hundreds=(int)hundredstens/10;
tens=(int)hundredstens%10;
display(hundreds,tens);
}
}