ADC เป็นตัวแปลงสัญญาณอนาล็อกเป็นดิจิตอลซึ่งแปลงข้อมูลอนาล็อกเป็นรูปแบบดิจิตอล โดยปกติจะใช้เพื่อแปลงแรงดันไฟฟ้าอะนาล็อกเป็นรูปแบบดิจิตอล สัญญาณอะนาล็อกไม่มีค่าเช่นคลื่นไซน์หรือคำพูดของเราไม่มีที่สิ้นสุด ADC แปลงเป็นระดับหรือสถานะเฉพาะซึ่งสามารถวัดได้ในรูปของปริมาณทางกายภาพ แทนที่จะเป็นการแปลงแบบต่อเนื่อง ADC จะแปลงข้อมูลเป็นระยะซึ่งมักเรียกว่าอัตราการสุ่มตัวอย่าง โมเด็มโทรศัพท์เป็นหนึ่งในตัวอย่างของ ADC ซึ่งใช้สำหรับอินเทอร์เน็ตมันแปลงข้อมูลอะนาล็อกเป็นข้อมูลดิจิทัลเพื่อให้คอมพิวเตอร์สามารถเข้าใจได้เพราะคอมพิวเตอร์สามารถเข้าใจข้อมูลดิจิตอลได้เท่านั้น ข้อได้เปรียบที่สำคัญของการใช้ ADC คือเราสามารถกำจัดสัญญาณรบกวนได้อย่างมีประสิทธิภาพจากสัญญาณดั้งเดิมและสัญญาณดิจิตอลสามารถเดินทางได้อย่างมีประสิทธิภาพมากกว่าแบบอะนาล็อก นั่นคือเหตุผลที่เสียงดิจิตอลมีความชัดเจนมากในขณะที่ฟัง

ในปัจจุบันมีไมโครคอนโทรลเลอร์จำนวนมากในตลาดซึ่งมีADC แบบ inbuilt พร้อมช่องสัญญาณตั้งแต่หนึ่งช่องขึ้นไป และด้วยการใช้การลงทะเบียน ADC ของพวกเขาเราสามารถเชื่อมต่อ เมื่อเราเลือก8051 ไมโครคอนโทรลเลอร์ครอบครัวสำหรับการทำโครงการใด ๆ ในการที่เราจะต้องมาจากการแปลง ADC แล้วเราใช้ADC ภายนอก ชิป ADC ภายนอกบางตัวคือ 0803,0804,0808,0809 และมีอีกมากมาย วันนี้เรากำลังจะเชื่อมต่อ ADC แบบ 8 ช่องสัญญาณกับไมโครคอนโทรลเลอร์ AT89s52 คือ ADC0808 / 0809

ส่วนประกอบ:

  • 8051 ไมโครคอนโทรลเลอร์ (AT89S52)
  • ADC0808 / 0809
  • จอแอลซีดี 16x2
  • ตัวต้านทาน (1k, 10k)
  • หม้อ (10k x4)
  • ตัวเก็บประจุ (10uF, 1000uf)
  • ไฟ LED สีแดง
  • บอร์ดขนมปังหรือ PCB
  • 7805
  • 11.0592 MHz Crystal
  • อำนาจ
  • สายเชื่อมต่อ

ADC0808 / 0809:
ADC0808 / 0809 เป็นอุปกรณ์ CMOS แบบ monolithic และตรรกะการควบคุมที่รองรับไมโครโปรเซสเซอร์และมี 28 พินซึ่งให้ค่า 8 บิตในเอาต์พุตและพินอินพุต ADC 8- ช่อง (IN0-IN7) ความละเอียดของมันคือ 8 ดังนั้นจึงสามารถเข้ารหัสข้อมูลอะนาล็อกเป็นหนึ่งใน256 ระดับ (2 8 ) อุปกรณ์นี้มีที่อยู่ช่องสามบรรทัดคือ: ADDA, ADDB และ ADDC สำหรับการเลือกช่อง ด้านล่างคือ Pin Diagram สำหรับ ADC0808:
ADC0808 Pin Diagram
ADC0808 / 0809  ต้องการอัตราชีพจรนาฬิกา  สำหรับการแปลง เราสามารถให้บริการได้โดยใช้ oscillator หรือโดยใช้ไมโครคอนโทรลเลอร์ ในโครงการนี้เราใช้คลื่นความถี่โดยใช้ไมโครคอนโทรลเลอร์
เราสามารถเลือกช่องสัญญาณเข้าใด ๆ โดยใช้บรรทัดที่อยู่เช่นเดียวกับที่เราสามารถเลือกช่องสัญญาณเข้า IN0 โดยทำให้ที่อยู่ทั้งสามบรรทัด (ADDA, ADDB และ ADDC) ต่ำ หากเราต้องการเลือกช่องสัญญาณเข้า IN2 เราจำเป็นต้องรักษา ADDA, ADDB ต่ำและ ADDC สูง สำหรับการเลือกช่องสัญญาณเข้าอื่น ๆ ทั้งหมดให้ดูที่ตารางที่กำหนด:
ชื่อช่อง ADC
PIN ของ ADDC
PIN ของ ADDB
PIN ของ ADDA
ยัง IN0
ต่ำ
ต่ำ
ต่ำ
IN1
ต่ำ
ต่ำ
สูง
IN2
ต่ำ
สูง
ต่ำ
IN3
ต่ำ
สูง
สูง
IN4
สูง
ต่ำ
ต่ำ
IN5
สูง
ต่ำ
สูง
IN6
สูง
สูง
ต่ำ
IN7
สูง
สูง
สูง
                                                                                            

คำอธิบายวงจร:

วงจรของ"การเชื่อมต่อ ADC0808 กับ 8051"นั้นซับซ้อนเล็กน้อยซึ่งประกอบด้วยสายเชื่อมต่อที่มากขึ้นสำหรับการเชื่อมต่ออุปกรณ์ซึ่งกันและกัน ในวงจรนี้เราใช้ AT89s52 เป็น 8051 ไมโครคอนโทรลเลอร์, ADC0808, โพเทนชิโอมิเตอร์และจอแอลซีดี
หน้าจอ LCD ขนาด 16x2 เชื่อมต่อกับไมโครคอนโทรลเลอร์ 89s52 ในโหมด 4 บิต หมุดควบคุม RS, RW และ En เชื่อมต่อโดยตรงกับพิน P2.0, GND และ P2.2 และ data pin D4-D7 เชื่อมต่อกับพิน P2.4, P2.5, P2.6 และ P2.7 จาก 89s52 ADC0808 ขาออกเชื่อมต่อโดยตรงกับพอร์ต P1 ของ AT89s52 หมุดเส้นที่อยู่ ADDA, ADDB, AADC เชื่อมต่อที่ P3.0, P3.1 และ P3.2

ALE (เปิดใช้งานการสลักที่อยู่), SC (เริ่มการแปลง), EOC (สิ้นสุดการแปลง), OE (เปิดใช้งานเอาต์พุต) และหมุดนาฬิกาเชื่อมต่อที่ P3.3, P3.4, P3.5, P3.6 และ P3.7 .
และที่นี่เราใช้โพเทนชิโอมิเตอร์สามตัวเชื่อมต่อที่พิน 26, 27 และ 28 ของ ADC0808
แบตเตอรี่ขนาด 9 โวลต์และตัวควบคุมแรงดันไฟฟ้า 5 โวลต์คือ 7805 ใช้สำหรับเปิดวงจร
 ADC0808 การเชื่อมต่อกับไดอะแกรมวงจร 8051

การทำงาน:

ในโครงการนี้เราได้เชื่อมสามช่องทางของ ADC0808 และสำหรับการสาธิตเราได้ใช้ตัวต้านทานสามตัวแปร เมื่อเราให้พลังงานวงจรจากนั้นไมโครคอนโทรลเลอร์จะเริ่มต้น LCD โดยใช้คำสั่งที่เหมาะสมส่งสัญญาณนาฬิกาให้กับชิป ADC เลือกช่อง ADC โดยใช้บรรทัดที่อยู่และส่งสัญญาณการแปลงเริ่มต้นไปที่ ADC หลังจาก ADC นี้อ่านช่องสัญญาณ ADC ที่เลือกเป็นครั้งแรกและให้เอาต์พุตที่แปลงเป็นไมโครคอนโทรลเลอร์ จากนั้นไมโครคอนโทรลเลอร์จะแสดงค่าที่ตำแหน่ง Ch1 ใน LCD แล้วไมโครคอนโทรลเลอร์เปลี่ยนช่อง ADC โดยใช้บรรทัดที่อยู่ จากนั้น ADC จะอ่านช่องสัญญาณที่เลือกและส่งสัญญาณออกไปยังไมโครคอนโทรลเลอร์ และแสดงบน LCD เป็นชื่อ Ch2 และชอบฉลาดสำหรับช่องทางอื่น ๆ
ADC0808 การเชื่อมต่อกับไดอะแกรมบล็อก 8051
การทำงานของ ADC0808นั้นคล้ายกับการทำงานของ ADC0804 มาก ในที่นี้ไมโครคอนโทรลเลอร์ตัวแรกให้สัญญาณนาฬิกา 500 KHz ถึง ADC0808 โดยใช้การขัดจังหวะตัวตั้งเวลา 0 เนื่องจาก ADC ต้องใช้สัญญาณนาฬิกาเพื่อทำงาน ตอนนี้ไมโครคอนโทรลเลอร์ส่งสัญญาณระดับต่ำถึงสูงถึงพิน ALE (พินที่แอ็คทีฟสูง) ของ ADC0808 เพื่อเปิดใช้งานสลักในที่อยู่ จากนั้นโดยใช้สัญญาณระดับสูงถึงระดับต่ำถึง SC (เริ่มการแปลง) ADC จะเริ่มต้นการแปลงสัญญาณอนาล็อกเป็นดิจิตอล จากนั้นรอให้พิน EOC (สิ้นสุดการแปลง) เหลือน้อย เมื่อ EOC ไปต่ำหมายถึงการแปลงสัญญาณอนาล็อกเป็นดิจิตอลเสร็จสมบูรณ์และข้อมูลพร้อมใช้งานแล้ว หลังจากนี้ไมโครคอนโทรลเลอร์จะเปิดใช้งานสายสัญญาณออกโดยใช้สัญญาณ HIGH ถึง LOW กับ OE pin ของ ADC0808
ADC0808 ให้เอาต์พุตการแปลงเมทริกอัตราส่วนที่พินเอาต์พุต และสูตรสำหรับการแปลงคลื่นวิทยุนั้นได้รับจาก:
in / (V fs -V z ) = D x / (D สูงสุด -D min )
ที่ไหน 
inคือแรงดันไฟฟ้าขาเข้าสำหรับการแปลง
fsเต็มสเกลแรงดัน
zคือศูนย์แรงดันไฟฟ้า
xคือจุดข้อมูลที่กำลังวัด
maxคือขีด จำกัด ข้อมูลสูงสุด
นาทีคือขีด จำกัด ข้อมูลขั้นต่ำ

คำอธิบายโปรแกรม:

ในโปรแกรมแรกของทั้งหมดที่เรามีทรายไฟล์ส่วนหัวกำหนดตัวแปรและขาอินพุตและเอาต์พุตสำหรับ ADC และ LCD
# include <reg51.h>
#include <stdio.h>
sbit ale = P3 ^ 3;  
sbit oe = P3 ^ 6; 
sbit sc = P3 ^ 4; 
sbit eoc = P3 ^ 5;  
sbit clk = P3 ^ 7;  
sbit ADDA = P3 ^ 0; // ที่อยู่พินสำหรับเลือกช่องสัญญาณเข้า
sbit ADDB = P3 ^ 1;
sbit ADDC = P3 ^ 2;
#define lcdport P2 // lcd 
sbit rs = P2 ^ 0;
sbit rw = P2 ^ 2;
sbit en = P2 ^ 1;
#define input_port P1 // ADC
int ผลลัพธ์ [3], ตัวเลข;
ฟังก์ชั่นสำหรับการสร้างความล่าช้านั้นถูกสร้างขึ้น (โมฆะความล่าช้า) พร้อมกับฟังก์ชั่น LCD บางอย่างเช่นการเริ่มต้น LCD, การพิมพ์สตริง, สำหรับคำสั่ง LCD เป็นต้นคุณสามารถค้นหาได้ใน Code ตรวจสอบบทความนี้สำหรับการ  เชื่อมต่อ LCD กับ 8051  และฟังก์ชั่น
หลังจากนี้ในโปรแกรมหลักเราได้เริ่มต้น LCD และตั้งค่า EOC, ALE, EO, SC ตามลำดับ 
โมฆะหลัก ()
{
 int i = 0;
 EOC = 1;
 เบียร์ = 0;
 OE = 0;
 SC = 0;
 TMOD = 0x02;
 TH0 = 0xFD;
lcd_ini ();
lcdprint ("ADC 0808/0809");
จากนั้นโปรแกรมจะอ่าน ADC และเก็บเอาท์พุท ADC ในตัวแปรแล้วส่งไปที่ LCD หลังการแปลงทศนิยมเป็น ASCII โดยใช้ฟังก์ชัน void read_adc () และ void adc (int i):
ถือเป็นโมฆะ read_adc ()
{
   จำนวน = 0;
   เบียร์ = 1;
   SC = 1;
   ล่าช้า (1);
   เบียร์ = 0;
   SC = 0;
   ในขณะที่ (EOC == 1);
   ในขณะที่ (EOC == 0);
   OE = 1;
   จำนวน = input_port;
   ล่าช้า (1);
   OE = 0;
}

โมฆะ adc (int ฉัน)  
{
สวิทช์ (i)
  {
   กรณีที่ 0:
    ADDC = 0;  
    ADDB = 0;
    ADDA = 0;
    lcdcmd (0xc0);
    read_adc ();
รหัส
# include <reg51.h> 
#include <stdio.h> 
sbit ale = P3 ^ 3;  
sbit oe = P3 ^ 6; 
sbit sc = P3 ^ 4; 
sbit eoc = P3 ^ 5;  
sbit clk = P3 ^ 7;  
sbit ADDA = P3 ^ 0; // ที่อยู่พินสำหรับเลือกช่องสัญญาณเข้า 
sbit ADDB = P3 ^ 1; 
sbit ADDC = P3 ^ 2; 
#define lcdport P2 // lcd  
sbit rs = P2 ^ 0; 
sbit rw = P2 ^ 2; 
sbit en = P2 ^ 1; 
#define input_port P1 // ADC 
int ผลลัพธ์ [3], ตัวเลข;
เป็นโมฆะ timer0 () ขัดจังหวะ 1 // ฟังก์ชั่นเพื่อสร้างนาฬิกาของความถี่ 500KHZ โดยใช้จับเวลา 0 ขัดจังหวะ 

clk = ~ clk; 
}
ความล่าช้าเป็นโมฆะ (นับ int ไม่ได้ลงนาม)   

int i, j; 
สำหรับ (i = 0; i <count; i ++) 
  สำหรับ (j = 0; j <100; j ++); 
}
เป็นโมฆะ daten () 

    rs = 1; 
    RW = 0; 
    en = 1; 
    ล่าช้า (1); 
    en = 0; 
}
โมฆะ lcd_data (ถ่าน ch ไม่ได้ลงนาม) 

    lcdport = ch & 0xF0; 
    Daten (); 
    lcdport = ch << 4 & 0xF0; 
    Daten (); 
}
เป็นโมฆะ cmden (เป็นโมฆะ) 

    rs = 0; 
    en = 1; 
    ล่าช้า (1); 
    en = 0; 
}
เป็นโมฆะ lcdcmd (ถ่าน ch ไม่ได้ลงนาม) 
{
    lcdport = ch & 0xf0; 
    cmden (); 
    lcdport = ch << 4 & 0xF0; 
    cmden (); 
}
lcdprint (char * str ที่ไม่ได้ลงชื่อ) // ฟังก์ชันเพื่อส่งข้อมูลสตริงไปยัง LCD 

    while (* str) 
    { 
        lcd_data (* str); 
        STR ++; 
    } 
}
ถือเป็นโมฆะ lcd_ini () // ฟังก์ชั่นเพื่อยกเลิกการเริ่มจอแอลซีดี

    lcdcmd (0x02); 
    lcdcmd (0x28); 
    lcdcmd (0x0e); 
    lcdcmd (0x01); 
}
โมฆะ show () 
{  
   sprintf (ผลลัพธ์, "% d", ตัวเลข); 
   lcdprint (ผล); 
   lcdprint (""); 
}
เป็นโมฆะ read_adc () 

   จำนวน = 0; 
   เบียร์ = 1; 
   SC = 1; 
   ล่าช้า (1); 
   เบียร์ = 0; 
   SC = 0; 
   ในขณะที่ (EOC == 1); 
   ในขณะที่ (EOC == 0); 
   OE = 1; 
   จำนวน = input_port; 
   ล่าช้า (1); 
   OE = 0; 
}
void adc (int i) // ฟังก์ชั่นในการขับ ADC 

switch (i) 
  { 
   กรณี 0: 
    ADDC = 0; // การเลือกช่องสัญญาณเข้า IN0 โดยใช้บรรทัดที่อยู่
    ADDB = 0; 
    ADDA = 0; 
    lcdcmd (0xc0); 
    read_adc (); 
    แสดง(); 
    ทำลาย;
   กรณีที่ 1: 
    ADDC = 0; // การเลือกช่องสัญญาณเข้า IN1 โดยใช้บรรทัดที่อยู่
    ADDB = 0; 
    ADDA = 1; 
    lcdcmd (0xc6); 
    read_adc (); 
    แสดง(); 
   ทำลาย;
   กรณีที่ 2: 
    ADDC = 0; // การเลือกช่องสัญญาณเข้า IN2 โดยใช้บรรทัดที่อยู่
    ADDB = 1; 
    ADDA = 0; 
    lcdcmd (0xcc); 
    read_adc (); 
    แสดง(); 
    ทำลาย; 
  } 
}
ถือเป็นโมฆะ main () 

 int i = 0; 
 EOC = 1; 
 เบียร์ = 0; 
 OE = 0; 
 SC = 0; 
 TMOD = 0x02; 
 TH0 = 0xFD; 
lcd_ini (); 
lcdprint ("ADC 0808/0809"); 
lcdcmd (192); 
lcdprint ("การเชื่อมต่อ"); 
ล่าช้า (500); 
lcdcmd (1); 
lcdprint ("Circuit Digest"); 
lcdcmd (192); 
lcdprint ("พร้อมระบบ ... "); 
ล่าช้า (500); 
lcdcmd (1); 
lcdprint ("Ch1 Ch2 Ch3"); 
 IE = 0x82; 
 TR0 = 1; 
ในขณะที่ (1) 

   สำหรับ (i = 0; i <3; i ++) 
   { 
     adc (i); 
     จำนวน = 0; 
   } 

}