PDA

View Full Version : ADC12bit giao tiếp với máy tính qua cổng COM


hphong23
30-09-2005, 10:20 AM
Mình mới học PIC và thử làm một mạch biến đổi ADC giao tiếp với máy tính qua cổng Com. Vì vậy còn nhiều thứ mình làm rất củ chuối :D. Mong mọi người đọc và nhận xét giúp mình để có thể hoàn thiện hơn nhé. Con ADC mình dùng là ICL7107 (độ phân giải tương đương 12bit), còn PIC 16F877A thì dùng để giao tiếp nối tiếp.
Nguyên tắc hoạt động của mạch là PIC sẽ nhận giá trị từ máy tính sau đó xuất ra cổng D để thực hiện việc chọn kênh vào (trên 4051) và chọn 74LS245 (dùng để mở rộng cổng). Giá trị vào sẽ được đọc vào từ cổng B và chuyển lại vào máy tính để giải mã và xuất kết quả ra.
Mạch nguyên lý mình post lên có khác so với mạch thực tế nên cách lập trình hơi khác. Mình chỉ nêu cách hoạt động của mạch thôi. Cám ơn mọi người đã đọc nhé. Chúc vui vẻ!

Đây là đoạn code cho PIC (viet bang C):
while(1)
{
while (!kbhit()&&(++timeout<50000)) delay_us(10);
if (kbhit()) i=getc();
output_D(i);
delay_us(10);
o=input_B();
delay_us(10);
putc(o);
delay_us(10);


}

Còn đây là đoạn code viet bang Delphi để chọn kênh vào, điều khiển 74ls245 và giải mã giá trị nhận được

function read(k:byte):integer;
var x,ra,d0,d1,d2,vao,tam:byte;
Input,sign,n:Integer;


function dv(data:byte):byte; { giai ma hang don vi}
begin
case data of
8: dv:=0;
94:dv:=1;
36:dv:=2;
20:dv:=3;
82:dv:=4;
17:dv:=5;
1: dv:=6;
92:dv:=7;
0: dv:=8;
16:dv:=9;

end;

end;


function ch(data:byte):byte; { giai ma hang chuc}
begin
case data of
4: ch:=0;
79:ch:=1;
33: ch:=2;
3: ch:=3;
74: ch:=4;
18: ch:=5;
16: ch:=6;
71: ch:=7;
0: ch:=8;
2: ch:=9;

end;

end;

function tr(data:byte):byte; { giai ma hang tram}
begin
case data of
2: tr:=0;
151:tr:=1;
65: tr:=2;
5: tr:=3;
148:tr:=4;
36: tr:=5;
32: tr:=6;
135:tr:=7;
0: tr:=8;
4: tr:=9;

end;

end;

begin

case k of {chon gia tri de phan kenh cho 4051}
1: x:=226;
2: x:=227;
3: x:=234;
4: x:=235;
5: x:=242;
6: x:=243;
7: x:=250;
8: x:=251;
9: x:=228 ;
10:x:=229 ;
11:x:=236;
12:x:=237;
13:x:=244;
14:x:=245;
15:x:=252;
16:x:=253;
end;

ra:=(223 and x); {ket hop gia tri chon kenh voi gia tri de dieu khien 74ls245}
sendbyte(ra);
vao:=readbyte();
d0:=dv(vao);

ra:=(191 and x); {ket hop gia tri chon kenh voi gia tri de dieu khien 74ls245}
sendbyte(ra);
vao:=readbyte();
tam:=(vao and $7f); {che bit dau cua ICL7107}
d1:=ch(tam);
if (vao and $80)= $80 then sign:=1 else sign:=-1;

ra:=(127 and x); {ket hop gia tri chon kenh voi gia tri de dieu khien 74ls245}
sendbyte(ra);
vao:=readbyte();
tam:=(vao and $f7); {che bit hang nghin cua ICL7107}
d2:=tr(tam);
if (vao and $8)=$8 then n:=0 else n:=1;

read:=sign*(n*1000+d2*100+d1*10+d0); {gia tri dien ap tinh bang mV}


end;

nguoimientrung
16-11-2005, 11:07 AM
Bạn có thể đua lên sơ đồ nguyên lý được không

hphong23
21-11-2005, 11:03 AM
Xin lỗi các bạn vì mình bận quá nên quên mất là chưa đưa sơ đồ nguyên lý. Mong các bạn đóng góp ý kiến cho mình với

cthang
15-06-2017, 04:50 PM
cảm ơn ạ