1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Interfacing ADC0808 với 8051 vi điều khiển

20 233 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 188,23 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Interfacing ADC0808 v i 8051 Vi đi u khi n ớ ề ểBởi Saddam3 Bình luận ADC0808 interfacing với-8.051 vi điều khiển ADC là bộ chuyển đổi Analog to Digital , chuyển đổi dữ liệu tương tự san

Trang 1

Interfacing ADC0808 v i 8051 Vi đi u khi n ớ ề ể

Bởi Saddam3 Bình luận

ADC0808 interfacing với-8.051 vi điều khiển

ADC là bộ chuyển đổi Analog to Digital , chuyển đổi dữ liệu tương tự sang định dạng số; Thường nó được sử dụng để chuyển đổi điện áp tương tự sang định dạng số Tín hiệu

Analog có vô số các giá trị giống như một làn sóng sin hay lời nói của chúng ta, ADC chuyển chúng thành các mức hoặc trạng thái đặc biệt, có thể được đo bằng các số như là một số lượng vật lý Thay vì chuyển đổi liên tục, ADC chuyển đổi dữ liệu định kỳ, thường được gọi là tỷ lệ

lấy mẫu Modem điện thoại là một trong những ví dụ của ADC, được sử dụng cho internet, nó

chuyển đổi dữ liệu tương tự sang dữ liệu số, do đó máy tính có thể hiểu, bởi vì máy tính chỉ có

thể hiểu dữ liệu số Ưu điểm chính của việc sử dụng ADC là, Chúng tôi tiếng ồn có thể được loại bỏ hiệu quả từ tín hiệu ban đầu và tín hiệu số có thể đi du lịch hiệu quả hơn so với một trong những analog Đó là lý do mà âm thanh số rất rõ ràng, trong khi lắng nghe.

Hiện nay có rất nhiều vi điều khiển trên thị trường có ADC inbuilt với một hoặc nhiều kênh Và bằng cách sử dụng đăng ký ADC của họ chúng tôi có thể giao diện Khi chúng tôi lựa

chọn 8.051 gia đình vi điều khiển để thực hiện bất kỳ dự án, trong đó chúng ta cần một chuyển đổi ADC, sau đó chúng tôi sử dụng ADC bên ngoài Một số chip ADC bên ngoài là

0803,0804,0808,0809 và có nhiều hơn nữa Hôm nay chúng ta sẽ giao tiếp với 8-kênh ADC với AT89s52 Microcontroller ADC0808 / 0809

Trang 2

Các thành ph n: ầ

 Bộ điều khiển 8051 (AT89S52)

 ADC0808 / 0809

 Màn hình LCD 16x2

 Điện trở (1k, 10k)

 POT (10k x 4)

 Capacitor (10uf, 1000uf)

 Đỏ dẫn

 Bánh mì hoặc PCB

 7805

 Tinh thể 11,0592 MHz

 Quyền lực

 Dây kết nối

ADC0808 / 0809:

ADC0808 / 0809 là thiết bị CMOS đơn và logic điều khiển tương thích bộ vi xử lý và có 28 chân mang lại giá trị 8 bit cho đầu vào và chân đầu vào ADC 8 kênh (IN0-IN7) Độ phân giải

của nó là 8 vì vậy nó có thể mã hóa dữ liệu tương tự thành một trong 256 mức (2 8 ) Thiết bị này có ba dòng địa chỉ kênh: ADDA, ADDB và ADDC để chọn kênh Dưới đây là Sơ đồ Pin cho ADC0808:

Trang 3

ADC0808 / 0809 yêu cầu một xung đồng hồ để chuyển đổi Chúng tôi có thể cung cấp nó

bằng cách sử dụng Dao động hoặc bằng cách sử dụng vi điều khiển Trong dự án này chúng tôi

đã áp dụng tần số bằng cách sử dụng vi điều khiển

Chúng ta có thể chọn bất kỳ kênh đầu vào nào bằng cách sử dụng dòng Địa chỉ, như chúng ta

có thể chọn dòng đầu vào IN0 bằng cách giữ cả ba dòng địa chỉ (ADDA, ADDB và ADDC) Thấp Nếu chúng ta muốn chọn kênh đầu vào IN2 thì chúng ta cần giữ ADDA, ADDB thấp và ADDC cao Để chọn tất cả các kênh đầu vào khác, hãy nhìn vào bảng đã cho:

Tên kênh ADC Mã PIN ADDC PIN ADDB Mã ADDA

Trang 4

M ch Mô t : ạ ả

Mạch "Interfacing ADC0808 với 8.051" là phức tạp ít có chứa nhiều dây kết nối để kết nối

thiết bị với nhau Trong mạch này chúng tôi đã chủ yếu sử dụng AT89s52 như 8.051 vi điều khiển, ADC0808, Potentiometer và LCD

Màn hình 16x2 được kết nối với vi điều khiển 89s52 ở chế độ 4-bit Kiểm soát pin RS, RW và

En được kết nối trực tiếp tới pin P2.0, GND và P2.2 Và chân dữ liệu D4-D7 được nối với chân P2.4, P2.5, P2.6 và P2.7 của 89s52 Đầu ra ADC0808 pin được kết nối trực tiếp với cổng P1 của AT89s52 Địa chỉ đường dây ADDA, ADDB, AADC được kết nối tại P3.0, P3.1, và P3.2

ALE (bật chốt địa chỉ), SC (chuyển đổi bắt đầu), EOC (kết thúc chuyển đổi), OE (bật ra) và chân đồng hồ được kết nối tại P3.3, P3.4, P3.5, P3.6 và P3.7

Và ở đây chúng tôi đã sử dụng ba potentiometers kết nối tại pin 26, 27, và 28 của ADC0808 Một pin 9 volt và bộ điều chỉnh điện áp 5 volt là 7805 được sử dụng để cấp nguồn cho mạch

Trang 5

Đang làm vi c: ệ

Trong dự án này chúng tôi đã giao tiếp ba kênh của ADC0808 Và để trình diễn chúng tôi đã sử dụng ba điện trở biến Khi chúng tôi cấp nguồn cho mạch, vi điều khiển khởi tạo LCD bằng cách sử dụng lệnh thích hợp, cho đồng hồ đến ADC chip, chọn kênh ADC bằng cách sử dụng dòng địa chỉ và gửi tín hiệu chuyển đổi bắt đầu đến ADC Sau khi ADC này lần đầu tiên đọc đầu vào kênh ADC được chọn và chuyển đổi đầu ra của nó sang vi điều khiển Sau đó vi điều khiển hiển thị giá trị của nó tại vị trí Ch1 trong LCD Và sau đó thay đổi kênh vi điều khiển kênh ADC bằng cách sử dụng dòng địa chỉ Và sau đó ADC đọc kênh đã chọn và gửi đầu ra cho vi điều khiển Và hiển thị trên màn hình LCD như tên Ch2 Và cũng như khôn ngoan đối với các kênh khác

Trang 6

Làm việc của ADC0808 rất giống với công việc của ADC0804 Trong điều này, vi điều khiển

đầu tiên cung cấp tín hiệu đồng hồ 500 KHz cho ADC0808, sử dụng ngắt Timer 0, vì ADC yêu cầu tín hiệu đồng hồ hoạt động Bây giờ vi điều khiển gửi một tín hiệu LOW đến CAO để pin ALE (pin hoạt động cao của nó) của ADC0808 để cho phép chốt trong địa chỉ Sau đó, bằng cách áp dụng tín hiệu HIGH to LOW Level lên SC (Start Conversion), ADC bắt đầu tương tự như chuyển đổi số Và sau đó đợi cho EOC (Chuyển đổi) để chuyển sang LOW Khi EOC đi LOW, nó có nghĩa là chuyển đổi tương tự sang số đã được hoàn thành và dữ liệu đã sẵn sàng để

sử dụng Sau đó, vi điều khiển cho phép dòng đầu ra bằng cách áp dụng một tín hiệu HIGH to LOW để OE pin của ADC0808

ADC0808 cho phép chuyển đổi số liệu ở đầu ra của nó Và công thức để chuyển đổi bằng phương pháp phóng xạ được cho bởi:

V trong / (V fs -V z ) = D x / (D tối đa -D phút )

Ở đâu

V trong là điện áp đầu vào cho chuyển đổi

D phút là giới hạn dữ liệu tối thiểu

Gi i thích ch ả ươ ng trình:

Trong chương trình, trước hết chúng ta bao gồm các tập tin tiêu đề cát xác định các biến và đầu vào và đầu ra pins cho ADC và LCD

# Include <reg51.h>

Trang 7

#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; / / Ghim địa chỉ để lựa chọn các kênh đầu vào.

Sbit ADDB = P3 ^ 1;

Sbit ADDC = P3 ^ 2;

# Xác định lcdport P2 // lcd

Sbit rs = P2 ^ 0;

Sbit rw = P2 ^ 2;

Sbit en = P2 ^ 1;

# Xác định input_port P1 // ADC

Int kết quả [3], số;

Chức năng tạo ra sự chậm trễ đã được tạo ra (trễ void), cùng với một số chức năng LCD như khởi tạo LCD, in chuỗi, cho các lệnh LCD vv Bạn có thể dễ dàng tìm thấy chúng trong

Mã Kiểm tra bài viết này cho LCD interfacing với 8051 và các chức năng của nó

Sau đó trong chương trình chính chúng ta đã khởi tạo LCD và đặt EOC, ALE, EO, SC pins tương ứng

Void main ()

{

Int i = 0;

Eoc = 1;

Ale = 0;

Oe = 0;

Sc = 0;

TMOD = 0x02;

TH0 = 0xFD;

Lcd_ini ();

Lcdprint ("ADC 0808/0809");

Và sau đó chương trình đọc ADC và lưu trữ đầu ra ADC trong một biến và sau đó gửi nó đến màn hình LCD sau khi thập phân để chuyển đổi ASCII, sử dụng hàm void read_adc () và void adc (int i):

Trang 8

Void read_adc ()

{

Số = 0;

Ale = 1;

Sc = 1;

Chậm trễ (1);

Ale = 0;

Sc = 0;

Trong khi (eoc == 1);

Trong khi (eoc == 0);

Oe = 1;

Số = input_port;

Chậm trễ (1);

Oe = 0;

}

Void adc (int i)

{

Chuyển đổi (i)

{

Trường hợp 0:

ADDC = 0;

ADDB = 0;

ADDA = 0;

Lcdcmd (0xc0);

Read_adc ();

Mã số:

#

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; / / Ghim địa chỉ để lựa chọn các kênh đầu vào Sbit ADDB = P3 ^ 1;

Sbit ADDC = P3 ^ 2;

# Xác định lcdport P2 // lcd

sbit rs = P2 ^ 0;

Trang 9

Sbit rw = P2 ^ 2;

Sbit en = P2 ^ 1;

# Xác định input_port P1 // ADC

int result [3], số;

Void timer0 () ngắt 1 // Chức năng để tạo ra đồng hồ của tần số 500KHZ bằng cách sử dụng Timer 0 ngắt {

Clk = ~ clk;

}

Sự chậm trễ void (đếm int unsigned)

{

int i, j;

Cho (i = 0; i <count; i ++)

cho (j = 0; j <100; j ++);

}

Void daten ()

{

rs = 1;

Rw = 0;

En = 1;

Chậm trễ (1);

Vi = 0;

}

Void lcd_data (unsigned char ch)

{

lcdport = ch & 0xF0;

Daten ();

Lcdport = ch << 4 & 0xF0;

Daten ();

}

Void cmden (void)

{

rs = 0;

En = 1;

Chậm trễ (1);

En = 0;

}

Void lcdcmd (unsigned char ch)

{

Lcdport = ch & 0xf0;

Cmden ();

Lcdport = ch << 4 & 0xF0;

Cmden ();

}

Lcdprint (unsigned char * str) / / Chức năng để gửi dữ liệu chuỗi cho LCD

{

While (* str)

{

lcd_data (* str);

Str ++;

}

}

Void lcd_ini () / / Chức năng để inisialize LCD

{

lcdcmd (0x02);

Lcdcmd (0x28);

Lcdcmd (0x0e);

Trang 10

Lcdcmd (0x01);

}

khoảng trống show ()

{

sprintf (kết quả, "% d", số);

Lcdprint (kết quả);

Lcdprint ("");

}

Void read_adc ()

{

number = 0;

Ale = 1;

Sc = 1;

Chậm trễ (1);

Ale = 0;

Sc = 0;

Trong khi (eoc == 1);

Trong khi (eoc == 0);

Oe = 1;

Số = input_port;

Chậm trễ (1);

Oe = 0;

}

Void adc (int i) / / Chức năng để lái xe ADC

{

switch (i)

{

trường hợp 0:

ADDC = 0; / / Chọn kênh đầu vào IN0 bằng cách sử dụng các dòng địa chỉ ADDB = 0;

ADDA = 0;

Lcdcmd (0xc0);

Read_adc ();

chỉ();

phá vỡ;

Trường hợp 1:

ADDC = 0; / / Chọn kênh đầu vào IN1 sử dụng các dòng địa chỉ

ADDB = 0;

ADDA = 1;

Lcdcmd (0xc6);

Read_adc ();

chỉ();

phá vỡ;

Trường hợp 2:

ADDC = 0; / / Chọn kênh đầu vào IN2 sử dụng các đường địa chỉ

ADDB = 1;

ADDA = 0;

Lcdcmd (0xcc);

Read_adc ();

chỉ();

phá vỡ;

}

}

Void main ()

{

int i = 0;

Eoc = 1;

Trang 11

Ale = 0;

Oe = 0;

Sc = 0;

TMOD = 0x02;

TH0 = 0xFD;

Lcd_ini ();

Lcdprint ("ADC 0808/0809");

Lcdcmd (192);

Lcdprint ("Giao diện");

Chậm trễ (500);

Lcdcmd (1);

Lcdprint ("Circuit Digest");

Lcdcmd (192);

Lcdprint ("Hệ thống sẵn sàng ");

Chậm trễ (500);

Lcdcmd (1);

Lcdprint ("Ch1 Ch2 Ch3");

IE = 0x82;

TR0 = 1;

Trong khi (1)

{

for (i = 0; i <3; i ++)

{

adc (i);

Số = 0;

}

}

}

Video:

CircuitDigest rất khuyến khích EasyEDA cho thiết kế vi mạch và PCB Prototype

Từ vẽ sơ đồ để sản xuất PCB, chỉ cần một công cụ

Nguyên mẫu giá rẻ của PCB: Chỉ có $ 8.21 cho 10pcs, 100x100mm PCBs, 2-3 ngày giao hàng

Bình lu n (3) ậ

Srujani

Trên thực tế mã u đã đăng không phải là làm việc tôi đoán do khởi tôi nghĩ.I đã thay đổi một

số sửa đổi quá nhưng vẫn không phải của nó working.it đang hiển thị một số vấn đề cảnh báo

Trang 12

Mã:

# include <reg51.h>

#include <stdio.h>

# xác định lcdport P2 // lcd

# xác định input_port P0 // ADC

sbit ale = P3 ^ 3;

Sbit oe = P3 ^ 6;

Sbit sc = P3 ^ 4;

Sbit eoc = P3 ^ 5;

Sbit clk = P3 ^ 7;

Sbit ADDA = P3 ^ 0; / / Ghim địa chỉ để lựa chọn các kênh đầu vào

Sbit ADDB = P3 ^ 1;

Sbit ADDC = P3 ^ 2;

Sbit rs = P2 ^ 0;

Sbit rw = P2 ^ 2;

Sbit en = P2 ^ 1;

Int kết quả [3], số;

Void timer0 () ngắt 1 // Chức năng để tạo ra đồng hồ của tần số 500KHZ bằng cách sử dụng Timer 0 ngắt

{

Clk = ~ clk;

}

Void delay (đếm int unsigned)

{

int i, j;

Cho (i = 0; i <count; i ++)

cho (j = 0, j <1000, j ++);

}

Trống Daten ()

{

rs = 1;

Rw = 0;

En = 1;

Chậm trễ (1);

En = 0;

}

Void lcd_data (unsigned char ch)

{

Trang 13

lcdport = ch & 0xF0;

Daten ();

Lcdport = ch << 4 & 0xF0;

Daten ();

}

Void cmden (void)

{

rs = 0;

En = 1;

Chậm trễ (1);

En = 0;

}

Void lcdcmd (unsigned char ch)

{

lcdport = ch & 0xf0;

Cmden ();

Lcdport = ch << 4 & 0xF0;

Cmden ();

}

Void lcdprint (unsigned char * str) / / Chức năng để gửi dữ liệu chuỗi cho LCD {

While (* str)

{

lcd_data (* str);

Str ++;

}

}

Trống lcd_init () // Chức năng để chuẩn bị cho màn hình LCD và làm cho nó sẵn sàng {

lcdcmd (0x38); / / Để sử dụng 2 dòng và ma trận 5X7 LCD

trì hoãn (10);

Lcdcmd (0x0F); / / Bật hiển thị ON, con trỏ nhấp nháy

chậm trễ (10);

Lcdcmd (0x01); // rõ ràng màn hình rõ ràng

(10);

Lcdcmd (0x80); / / Đưa con trỏ đến vị trí 1 của

sự chậm trễ dòng 1 (10);

}

Trang 14

/ *

Void lcd_ini () // Chức năng để inisialize LCD

{

lcdcmd (0x02);

Lcdcmd (0x28);

Lcdcmd (0x0e);

* /

Void show ()

{

sprintf (kết quả, "% d", số);

Lcdprint (kết quả);

Lcdprint ("");

}

Void read_adc ()

{

số = 0;

Ale = 1;

Sc = 1;

Chậm trễ (1);

Ale = 0;

Sc = 0;

Trong khi (eoc == 1);

Trong khi (eoc == 0);

Oe = 1;

Số = input_port;

Chậm trễ (1);

Oe = 0;

}

Void adc (int i) / / Chức năng để lái xe ADC

{

switch (i)

{

trường hợp 0:

ADDC = 0; / / Chọn kênh đầu vào IN0 bằng cách sử dụng các dòng địa chỉ ADDB = 0;

ADDA = 0;

Lcdcmd (0xc0);

Read_adc ();

Trang 15

chỉ();

phá vỡ;

Trường hợp 1:

ADDC = 0; / / Chọn kênh đầu vào IN1 sử dụng các dòng địa chỉ ADDB = 0;

ADDA = 1;

Lcdcmd (0xc6);

Read_adc ();

chỉ();

phá vỡ;

Trường hợp 2:

ADDC = 0; / / Chọn kênh đầu vào IN2 sử dụng các đường địa chỉ ADDB = 1;

ADDA = 0;

Lcdcmd (0xcc);

Read_adc ();

chỉ();

phá vỡ;

}

}

Void main ()

{

int i = 0;

Eoc = 1;

Ale = 0;

Oe = 0;

Sc = 0;

TMOD = 0x02;

TH0 = 0xFD;

Lcd_init ();

Lcdprint ("ADC 0808/0809");

Lcdcmd (192);

Lcdprint ("Giao diện");

Chậm trễ (500);

Lcdcmd (1);

Lcdprint ("Circuit Digest");

Lcdcmd (192);

Lcdprint ("Hệ thống sẵn sàng ");

Trang 16

Chậm trễ (500);

Lcdcmd (1);

Lcdprint ("Ch1 Ch2 Ch3");

IE = 0x82;

TR0 = 1;

Trong khi (1)

{

for (i = 0; i <3;

I ++) {

adc (i);

Số = 0;

}

}

}

Nhưng tôi nhận được 2 cảnh báo như

adc single.c (84): cảnh báo C182: con trỏ đến các đối tượng khác nhau adc single.c (85): cảnh báo C182: con trỏ đến các đối tượng khác nhau tôi không biết tại sao chính xác vấn đề là

Ngày 30 tháng 5 năm 2016

CODE:

#include<reg51.h>

#include<stdio.h>

#define lcdport P2 //lcd

#define input_port P0 //ADC

sbit ale=P3^3;

sbit oe=P3^6;

sbit sc=P3^4;

sbit eoc=P3^5;

sbit clk=P3^7;

sbit ADDA=P3^0; //Address pins for selecting input channels.

sbit ADDB=P3^1;

sbit ADDC=P3^2;

Trang 17

sbit rw=P2^2;

sbit en=P2^1;

int result[3],number;

void timer0() interrupt 1 // Function to generate clock of frequency 500KHZ using Timer 0  interrupt.

{

clk=~clk;

}

void delay(unsigned int count)

{

int i,j;

for(i=0;i<count;i++)

for(j=0;j<1000;j++);

}

void daten()

{

rs=1;

rw=0;

en=1;

delay(1);

en=0;

}

void lcd_data(unsigned char ch)

{

lcdport=ch & 0xF0;

daten();

lcdport=ch<<4 & 0xF0;

daten();

}

void cmden(void)

{

rs=0;

en=1;

delay(1);

en=0;

}

void lcdcmd(unsigned char ch)

{

lcdport=ch & 0xf0;

cmden();

lcdport=ch<<4 & 0xF0;

cmden();

}

void lcdprint(unsigned char *str) //Function to send string data to LCD.

{

Trang 18

{

lcd_data(*str);

str++;

}

}

void lcd_init() //Function to prepare the LCD and get it ready {

lcdcmd(0x38); // for using 2 lines and 5X7 matrix of LCD delay(10);

lcdcmd(0x0F); // turn display ON, cursor blinking

delay(10);

lcdcmd(0x01); //clear screen

delay (10);

lcdcmd(0x80); // bring cursor to position 1 of line 1

delay (10);

}

/*

void lcd_ini() //Function to inisialize the LCD

{

lcdcmd(0x02);

lcdcmd(0x28);

lcdcmd(0x0e);

*/

void show()

{

sprintf(result,"%d",number);

lcdprint(result);

lcdprint(" ");

}

void read_adc()

{

number=0;

ale=1;

sc=1;

delay(1);

ale=0;

sc=0;

while(eoc==1);

while(eoc==0);

oe=1;

number=input_port;

delay(1);

oe=0;

}

void adc(int i) //Function to drive ADC

Ngày đăng: 13/12/2019, 14:27

TỪ KHÓA LIÊN QUAN

w