Mình đang làm đề tai đọc nhiệt độ từ LM35DZ vào ADC 0804 và sau đó đưa giá trị qua 89V51 rồii xuất ra giá trị qua 4 LED 7 đoạn Anod Chung.Minh để sơ đồ mạch dưới đây. Trong quá trình làm mạch mình gặp một rắc rối đó là:
-Theo lý thuyết thì cần cấp Vref =1.28V thì chỉ cần lấy dữ liệu và xuất ra LED, mình thi để trống nên nhân thêm dữ liệu với 1.953 rồii mới xuất ra lED.
-Trong quá trình xử lý và xuất LED, nếu mình thử nhập thằng giá trị thập phân cho hàm xuất thì giá trị ra 4 LED 7 đoạn rất tốt.Nhưng khi mình lấy dữ liễu từ ADC vào, xử lý, thì lại gặp rắc rối:
- LED thứ 4 (hàng trăm ) ko sáng đúng, luôn hiện số 8.
- 2 LED còn lại (hàng chục, đơn vị ) thì sáng lúc đầu , sau đó tắt đi, và chỉ còn LED thứ 4 sáng, lúc này thì LED thứ 4 sáng đúng giá trị, nhưng 2 LED kia đã tắt và cứ như vậy luôn cho đến khi reset mạch.
-Mạch xử lý tín hiệu vào và xuất ra chậm lắm, khi tăng nhiệt độ bằng cách đốt nóng LM35 thì 4 LED vẫn ko hiện ra liền, mà cần phải reset vài lần, chập chờn rồi mới ra giá tri nhưng lại bị lỗi ở trên.
Bạn nào biết xin chỉ giúp minh với: Sắp tới ngày nộp mạch rồii mà vậy chắc tieu.Xin cám ơn các bạn rất nhiều.:
đây là code mình viết va so do mach trong file dinhkem:
#include <REG51.H>
#include <intrins.h>
#include <stdio.h>
// P2 : ma hinh ,du lieu LED 7 doan
// P0: ma chon 4 LEd 7 doan de quet led
sbit ADC_RD=P3^2;//bit read va write cua ADC
sbit ADC_WR=P3^4 ;
unsigned int nhietdo;
unsigned char meg_hello[14]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x84
};
void delay_us(unsigned char n) //ham delay de quet led
{
unsigned char i;
for(i=0;i<n;i++);
}
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++) delay_us(255);
}
void temp_display( int r1) //ham hien thi led, 4 led 7 doan
{
unsigned int r3,r4;
int r2,LED1,LED2,LED3,LED4;//led 1,led2,led3,led 4: tram, chuc, don vi, Chu C
LED1= r1/100;
r2=r1-100*LED1;
LED2=r2/10;
LED3=r2-LED2*10;
LED4=10;
r4=300;
while(r4--)
{
r3=4;
while(r3--)
{
P0=0x01;
P2=meg_hello[LED4];
delay_ms(1);
P0=0x02;
P2=meg_hello[LED3];
delay_ms(1);
P0=0x04;
P2=meg_hello[LED2];
delay_ms(1);
P0=0x08;
P2=meg_hello[LED1];
delay_ms(1);
}
}
}
void batdau() // khoi tao cac gia tri cho ADC chay
{
ADC_RD=1;
ADC_WR=1;
IT1=1 ;
EX1=1;
EA=1;
}
void chuyendoi() //cho ADC chuyen doi sang nhi phan 8 bit
{
ADC_WR=0;
ADC_WR=1;
}
int1()interrupt 2
{
ADC_RD=0;
nhietdo= P1; //lay nhiet do tu 8 bit ngo ra ADC noi voi P1
nhietdo=nhietdo*1.953;
ADC_RD=1;
temp_display(nhietdo);
delay_us(33000);
chuyendoi();
}
void main(void)
{
while(1)
{
batdau();
chuyendoi();
}
}
-Theo lý thuyết thì cần cấp Vref =1.28V thì chỉ cần lấy dữ liệu và xuất ra LED, mình thi để trống nên nhân thêm dữ liệu với 1.953 rồii mới xuất ra lED.
-Trong quá trình xử lý và xuất LED, nếu mình thử nhập thằng giá trị thập phân cho hàm xuất thì giá trị ra 4 LED 7 đoạn rất tốt.Nhưng khi mình lấy dữ liễu từ ADC vào, xử lý, thì lại gặp rắc rối:
- LED thứ 4 (hàng trăm ) ko sáng đúng, luôn hiện số 8.
- 2 LED còn lại (hàng chục, đơn vị ) thì sáng lúc đầu , sau đó tắt đi, và chỉ còn LED thứ 4 sáng, lúc này thì LED thứ 4 sáng đúng giá trị, nhưng 2 LED kia đã tắt và cứ như vậy luôn cho đến khi reset mạch.
-Mạch xử lý tín hiệu vào và xuất ra chậm lắm, khi tăng nhiệt độ bằng cách đốt nóng LM35 thì 4 LED vẫn ko hiện ra liền, mà cần phải reset vài lần, chập chờn rồi mới ra giá tri nhưng lại bị lỗi ở trên.
Bạn nào biết xin chỉ giúp minh với: Sắp tới ngày nộp mạch rồii mà vậy chắc tieu.Xin cám ơn các bạn rất nhiều.:
đây là code mình viết va so do mach trong file dinhkem:
#include <REG51.H>
#include <intrins.h>
#include <stdio.h>
// P2 : ma hinh ,du lieu LED 7 doan
// P0: ma chon 4 LEd 7 doan de quet led
sbit ADC_RD=P3^2;//bit read va write cua ADC
sbit ADC_WR=P3^4 ;
unsigned int nhietdo;
unsigned char meg_hello[14]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x84
};
void delay_us(unsigned char n) //ham delay de quet led
{
unsigned char i;
for(i=0;i<n;i++);
}
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++) delay_us(255);
}
void temp_display( int r1) //ham hien thi led, 4 led 7 doan
{
unsigned int r3,r4;
int r2,LED1,LED2,LED3,LED4;//led 1,led2,led3,led 4: tram, chuc, don vi, Chu C
LED1= r1/100;
r2=r1-100*LED1;
LED2=r2/10;
LED3=r2-LED2*10;
LED4=10;
r4=300;
while(r4--)
{
r3=4;
while(r3--)
{
P0=0x01;
P2=meg_hello[LED4];
delay_ms(1);
P0=0x02;
P2=meg_hello[LED3];
delay_ms(1);
P0=0x04;
P2=meg_hello[LED2];
delay_ms(1);
P0=0x08;
P2=meg_hello[LED1];
delay_ms(1);
}
}
}
void batdau() // khoi tao cac gia tri cho ADC chay
{
ADC_RD=1;
ADC_WR=1;
IT1=1 ;
EX1=1;
EA=1;
}
void chuyendoi() //cho ADC chuyen doi sang nhi phan 8 bit
{
ADC_WR=0;
ADC_WR=1;
}
int1()interrupt 2
{
ADC_RD=0;
nhietdo= P1; //lay nhiet do tu 8 bit ngo ra ADC noi voi P1
nhietdo=nhietdo*1.953;
ADC_RD=1;
temp_display(nhietdo);
delay_us(33000);
chuyendoi();
}
void main(void)
{
while(1)
{
batdau();
chuyendoi();
}
}