PDA

View Full Version : [Hỏi] đọc 6 chân ADC XUẤT RA 9 LED 7


levuphuong
02-10-2011, 07:16 PM
Tình hình mình làm 1 đề tài về ADC lấy điện áp từ 6 kênh nhưng có 1 cái swicth để điều chỉnh nhấn 1 cái thì lấy 3 kenh trên ,nhân thêm 1 cái thì lấy 3 kênh dưới rồi xuất ra 9 con led 7 đoạn.
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=12000000)
#byte portb=0x06
#byte portd=0x08
Int8 ad1,ad2,ad0;
int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x1 0} ;

void doc_ADC()
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;

}

void main()
{
set_tris_d(0) ;
set_tris_b(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);


while(true)
{
doc_ADC() ;

////hien chu so hang tram
delay_ms(10) ;
portb=0x21 ;
c0=ad0/100 ;
portd=digital[c0] ;
delay_us(10) ;

portb=0x22 ;
c1=ad1/100 ;
portd=digital[c1] ;
delay_us(10) ;

portb=0x24 ;
c2=ad2/100 ;
portd=digital[c2];

delay_ms(10) ;

///chu hang chuc
portb=0x11;
b0=ad0/10-10*c0 ;
portd=digital[b0] ;

portb=0x12;
b1=ad1/10-10*c1 ;
portd=digital[b1] ;
delay_us(10) ;

portb=0x14 ;
b2=ad2/10-c2*10 ;
portd=digital[b2] ;

delay_ms(20) ;
////chu hang don vi
portb=0x09 ;
delay_ms(1) ;
a0=ad0%100 ;
portd=digital[a0] ;
delay_us(10) ;

portb=0x0a ;
a1=ad1%100 ;
portd=digital[a1] ;
delay_us(10) ;

portb=0x0c ;
a2=ad2%100 ;
portd=digital[a2];
delay_ms(10) ;

}
}
Mọi người xem giúp xem sơ đồ nguyên lí như vậy ổn chưa.
với lại code mình mới viết cho 3 kênh 1.2.3 thôi mà bị thế nào mà 3 đèn giữa và 3 den cuối hiên số liệu đúng còn 3 đèn đầu hiên ko đúng,và quét led nó chạy không ổn định(lúc sáng lúc chớp :))

tdm
02-10-2011, 09:55 PM
Tình hình mình làm 1 đề tài về ADC lấy điện áp từ 6 kênh nhưng có 1 cái swicth để điều chỉnh nhấn 1 cái thì lấy 3 kenh trên ,nhân thêm 1 cái thì lấy 3 kênh dưới rồi xuất ra 9 con led 7 đoạn.
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=12000000)
#byte portb=0x06
#byte portd=0x08
Int8 ad1,ad2,ad0;
int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x1 0} ;

void doc_ADC()
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;

}

void main()
{
set_tris_d(0) ;
set_tris_b(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);


while(true)
{
doc_ADC() ;

////hien chu so hang tram
delay_ms(10) ;
portb=0x21 ;
c0=ad0/100 ;
portd=digital[c0] ;
delay_us(10) ;

portb=0x22 ;
c1=ad1/100 ;
portd=digital[c1] ;
delay_us(10) ;

portb=0x24 ;
c2=ad2/100 ;
portd=digital[c2];

delay_ms(10) ;

///chu hang chuc
portb=0x11;
b0=ad0/10-10*c0 ;
portd=digital[b0] ;

portb=0x12;
b1=ad1/10-10*c1 ;
portd=digital[b1] ;
delay_us(10) ;

portb=0x14 ;
b2=ad2/10-c2*10 ;
portd=digital[b2] ;

delay_ms(20) ;
////chu hang don vi
portb=0x09 ;
delay_ms(1) ;
a0=ad0%100 ;
portd=digital[a0] ;
delay_us(10) ;

portb=0x0a ;
a1=ad1%100 ;
portd=digital[a1] ;
delay_us(10) ;

portb=0x0c ;
a2=ad2%100 ;
portd=digital[a2];
delay_ms(10) ;

}
}Mọi người xem giúp xem sơ đồ nguyên lí như vậy ổn chưa.
với lại code mình mới viết cho 3 kênh 1.2.3 thôi mà bị thế nào mà 3 đèn giữa và 3 den cuối hiên số liệu đúng còn 3 đèn đầu hiên ko đúng,và quét led nó chạy không ổn định(lúc sáng lúc chớp :))
code sửa lại :

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=8
#use delay(clock=12000000)
#byte portb=0x06
#byte portd=0x08
Int8 ad1,ad2,ad0;
int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0} ;

void doc_ADC()
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;

}

void main()
{
set_tris_d(0) ;
set_tris_b(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);


while(true)
{
doc_ADC() ;
////hien chu so hang tram
// delay_ms(10) ;
portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portb=0x20 ;
delay_ms(2) ;
portb=0x00 ;
///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portb=0x10 ;
delay_ms(2) ;
portb=0x00 ;
////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad1%10)%10 ;
portd=digital[a2];
portb=0x08;
delay_ms(2) ;
portb=0x00 ;
}
}
phần cứng có lỗi nhỏ đã sửa lại xem file đính kèm.

levuphuong
02-10-2011, 10:44 PM
Hay quá.cám ơn anh nhiều lắm. :):)
có lẽ anh gõ nhanh quá nên gõ nhầm cái này "a2=(ad1%10)%10 ;
Anh sửa lại là truyền ra chốt hết rồi mới mở khóa bjt một lần hả anh.hay quá

levuphuong
04-10-2011, 02:13 AM
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x08
#byte portd=0x07
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
#bit RB7=portb.7
Int16 ad1,ad2,ad0;
int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
int8 a=0 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0,0x09} ;
#int_rb
void ngatRB7()
{

a=a+1;


RBIF=0;


}
void doc_ADC()
{
if(a%2)
{
portc=0x01;
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;
}
else
{
portc=0x02;
set_ADC_channel(3);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(4);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(5);
ad2=read_ADC() ;
delay_us(10) ;
}

}
void main()
{
set_tris_b(0b10000000);
set_tris_d(0);
set_tris_c(0);
enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(H_to_L);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);


while(true)
{
doc_ADC() ;
////hien chu so hang tram
// delay_ms(10) ;
portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portb=0x20 ;
delay_ms(2) ;
portb=0x00 ;
///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portb=0x10 ;
delay_ms(2) ;
portb=0x00 ;
////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad2%10)%10 ;
portd=digital[a2];
portb=0x08;
delay_ms(2) ;
portb=0x00 ;
}
}
Mình thêm vào tí ngắt rb trên RB7 khi nhấn vao thi thay đổi từ 3 kênh 1.2.3 sang 4.5.6 và c0 hoăc c1 sẽ sáng để báo hiểu
Hình như mình viết ngắt ngoài có vấn đề led h ko sáng nữa.

tdm
04-10-2011, 11:49 AM
portb đang điều khiển chốt và mở tranzitor, mà em dùng ngắt rb7 coi chừng
nó sẽ xảy ra ngắt liên tục.
giải pháp đơn giản nhất là em chuyển chốt và mở tranzitor sang port khác .
rb7 phải có r=10k kéo lên nguồn +.

levuphuong
04-10-2011, 09:05 PM
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
Int16 ad1,ad2,ad0;
int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0,0x09} ;

#int_rb
void ngatrb7()
{
a=a+1;
RBIF=0 ;
}

void doc_ADC()
{
if(a%2==0)
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;
}
else
{
set_ADC_channel(3);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(4);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(5);
ad2=read_ADC() ;
delay_us(10) ;
}
}
void main()
{
set_tris_d(0) ;
set_tris_b(0b11110000);
set_tris_c(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);

enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(true)
{
doc_ADC() ;
////hien chu so hang tram
// delay_ms(10) ;
portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portc=0x01 ;
delay_ms(2) ;
portc=0x00 ;
///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portc=0x02 ;
delay_ms(2) ;
portc=0x00 ;
////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad2%10)%10 ;
portd=digital[a2];
portc=0x04;
delay_ms(2) ;
portc=0x00 ;
}
}
Mình đã đổi sang c0.c1.c2.
nhưng khi nó đang chạy nhấn rb7 1 cái thì nó dính vào ngắt luôn hay sao ấy(Chỉ còn 1 cột đèn và không có đọc trên ADC) mình đã cho RBIF =0 khi thoát khỏi ngắt mà vẫn không được.
-Với lại lúc mình set_tris_b(0b100000000) thì không phải là chỉ ngắt trên rb7 hay sao mấy chi rb4 đến rb5 mình set là output mà.

tdm
04-10-2011, 10:41 PM
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
Int16 ad1,ad2,ad0;
int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0,0x09} ;

#int_rb
void ngatrb7()
{
a=a+1;
RBIF=0 ;
}

void doc_ADC()
{
if(a%2==0)
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;
}
else
{
set_ADC_channel(3);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(4);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(5);
ad2=read_ADC() ;
delay_us(10) ;
}
}
void main()
{
set_tris_d(0) ;
set_tris_b(0b11110000);
set_tris_c(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);

enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(true)
{
doc_ADC() ;
////hien chu so hang tram
// delay_ms(10) ;
portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portc=0x01 ;
delay_ms(2) ;
portc=0x00 ;
///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portc=0x02 ;
delay_ms(2) ;
portc=0x00 ;
////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad2%10)%10 ;
portd=digital[a2];
portc=0x04;
delay_ms(2) ;
portc=0x00 ;
}
}Mình đã đổi sang c0.c1.c2.
nhưng khi nó đang chạy nhấn rb7 1 cái thì nó dính vào ngắt luôn hay sao ấy(Chỉ còn 1 cột đèn và không có đọc trên ADC) mình đã cho RBIF =0 khi thoát khỏi ngắt mà vẫn không được.
-Với lại lúc mình set_tris_b(0b100000000) thì không phải là chỉ ngắt trên rb7 hay sao mấy chi rb4 đến rb5 mình set là output mà.
sửa lại hàm ngắt như sau:
#int_rb
void ngatrb7()
{
if(! input(PIN_B7) )
a=a+1;
}

levuphuong
12-10-2011, 10:39 PM
hôm bữa mọi chuyện chay bình thường rồi
hôm nay tự do đổi sang dung bjt pnp thì sao nó ko chuyên 1.2.3 sang 4.5.6 nữa anh xem code hay mach em có lỗi lầm j không.
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device 16F877*=16 ADC=10
#use delay(clock=12000000)
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte intcon=0x000B
#bit RBIF=intcon.0
#bit RBIE=intcon.3
Int16 ad1,ad2,ad0;
int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ;
const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x1 0,0x09} ;

#int_rb
void ngatrb7()
{
if(input(PIN_B7)==0 )
a=a+1;
}
void doc_ADC()
{
if(a%2==0)
{
set_ADC_channel(0);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(1);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(2);
ad2=read_ADC() ;
delay_us(10) ;
portd=0x00 ;
}
else
{
set_ADC_channel(3);
ad0=read_ADC();
delay_us(10) ;


set_ADC_channel(4);
ad1=read_ADC();
delay_us(10) ;

set_adc_channel(5);
ad2=read_ADC() ;
delay_us(10) ;
portd=0xff ;
}
}
void main()
{

set_tris_d(0) ;
set_tris_b(0b11110000);
set_tris_c(0);
setup_ADC(ADC_clock_internal);
setup_adc_ports(ALL_ANALOG);

enable_interrupts(global);
enable_interrupts(int_rb);
ext_int_edge(h_to_l);

while(true)
{
doc_ADC() ;

portb=0x01 ;
c0=ad0/100 ;
portd=digital[c0] ;
portb=0x02 ;
c1=ad1/100 ;
portd=digital[c1] ;
portb=0x04 ;
c2=ad2/100 ;
portd=digital[c2];
portc=0x06 ;
delay_ms(2) ;
portc=0x07 ;

///chu hang chuc
portb=0x01;
b0=(ad0%100)/10 ;
portd=digital[b0] ;
portb=0x02;
b1=(ad1%100)/10 ;
portd=digital[b1] ;
portb=0x04 ;
b2=(ad2%100)/10 ;
portd=digital[b2] ;
portc=0x05 ;
delay_ms(2) ;
portc=0x07 ;

////chu hang don vi
portb=0x01 ;
a0=(ad0%10)%10 ;
portd=digital[a0] ;
portb=0x02 ;
a1=(ad1%10)%10 ;
portd=digital[a1] ;
portb=0x04 ;
a2=(ad2%10)%10 ;
portd=digital[a2];
portc=0x03;
delay_ms(2) ;
portc=0x07 ;

}
}

levuphuong
01-11-2011, 01:26 AM
Tự nhiên sửa cái if(input(PIN_B7)==0 ) thành if(input(PIN_B7)) thì nó chạy ngon rồi :)