1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đồ án asembly :thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51

21 3,5K 73

Đ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 21
Dung lượng 541,5 KB

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

Nội dung

Đồ án asembly :thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51

Trang 1

KHOA VÔ TUYẾN-ĐIỆN TỬ

thoại, bộ VXL sử dụng 80c51

Giảng viên hướng dẫn: Nguyễn Hải Dương

Sinh viên thực hiện : Nguyễn Mạnh

Cường-Đktđ10 Nguyễn Văn Thạch – Đktđ

10

Trang 2

Hà Nội 2012

I Phân tích đề tài

Thông qua quá trình tìm hiểu đề tài và hướng dẫn của thầy giáo em có thể mô hình hóa đề tài này như sau: đề tài này tương tự như một chương trình đếm sản phẩm Với mỗi sản phẩm tương ứng là một xung Có 6 băng chuyền và đặt trên đó là 6 cảm biến Cứ mỗi sản phẩm đi qua cảm biến sẽ thông báo về cho VĐK Việc của người quản lý là sử dụng bàn phím điện thoại để kiểm soát xem số sản phẩm trên mỗi băng chuyền là bao nhiêu thông qua thông tin hiển thị trên LCD 16:2 Các kênh sẽ đếm các sản phẩm khi nào đủ 5000 sản phẩm thì sẽ quay về đếm lại từ 0 Qua đây ta có nhận xét:

 Cảm biến sẽ cho đó là một sản phẩm khi có sườn lên của xung, ngược lại đó sẽ không phải là một sản phẩm hoàn chỉnh và bỏ qua.

 Mỗi sản phẩm khi đi qua cảm biến sẽ mất một khoảng thời gian nhất định, điều này phụ thuộc vào tốc độ băng truyền và kích thước sản phẩm (tốc độ băng truyền ta có thể điều chỉnh được)

 2 sản phẩm liên tiếp luôn có 1 khoảng cách nhất định hay nói cách khác, giữa

2 xung liên tiếp tồn tại 1 khoảng thời gian.

 Vì các kênh hoạt động độc lập nên các cảm biến gửi tín hiệu về VĐK trong 1 thời điểm bất kì, không biết trước.

Bằng những phân tích trên ta có thể xây dựng được ý tưởng, từ đó xây dựng lên phần cứng như sau.

Ý tưởng thực hiện bài toán: vì các tín hiệu về VĐK là bất kì nên ta sẽ “bấm thời

gian” Sau 1 khoảng thời gian ta lại dừng và kiểm tra xem trong khoảng thời gian đó có bao nhiêu sản phẩm đi qua.Công việc này sẽ được thực hiện liên tục VĐK sẽ lấy sản phẩm trong khoảng thời gian sau cộng thêm vào với sản phẩm ở những khoảng thời gian trước đó

Ta quy định khi nào có sườn lên của xung thì khi đó là 1 tín hiệu được gửi đến nên ta

sẽ chọn flip- flop D để làm khối thu tin Đầu D được đặt ở mức cao Tín hiệu xung được đưa vào chân Clk Mỗi khi có sườn lên của chân Clk thì đầu ra Q sẽ được set lên 1 và ta sẽ đọc giá trị ở đầu ra Q.

Thời gian sẽ do timer0 quy định, mỗi khi cờ tràn TF0 được set lên 1 thì sẽ báo có ngắt

và sẽ chạy chương trình kiểm tra tín hiệu vào trên từng kênh Kênh nào có tín hiệu thì sẽ tăng biến đếm ở kênh đấy lên 1, sau đó sẽ phát lệnh reset flip flop ở kênh đó để sẵn sàng thu xung tiếp theo.

II Các linh kiện trong mạch.

Trang 3

80c51 là loại IC đóng vỏ DIP Có 40 chân Mỗi chân có kí hiệu và chức năng như sau:

 Chân 40 nối với nguồn nuôi (Vcc)

 Chân 20 nối với đất (GND)

 Chân 29 (PSEN) là tín hiệu điều khiển xuất ra của 8051, nó cho phép chọn bộ nhớ ngoài và được nối với chân OE của EPROM ngoài để cho phép đọc cái byte của chương trình

 Chân 30 (ALE) là tín hiệu điều khiển xuất ra của 8051 cho phép phân kênh bus địa chỉ và bus dữ liệu của cổng P0

 Chân 31 (EA) cho phép chọn bộ nhớ ngoài

 Chân 18,19 nối với thạch anh

 Chân 9 (rst) reset chương trình

 32 chân còn lại chia thành 4 cổng vào ra từ P0 đến P3

2 Flip flop D

Sở dĩ chọn flip-flop làm hệ thu tin vì flip-flop được đồng bộ bằng sườn Do đó việc nhận biết tín hiệu xung vào sẽ chính xác hơn Phương trình hàm ra của flip flop có dạng Q=D Khi đặt D ở mức 1, nếu có sườn lên ở chân Clk thì Q sẽ được set từ 0 lên 1 Và đây chính là thông tin mà ta cần thu.

3 LCD 16:2

Trang 4

LCD có 16 chân chức năng như sau

4 RS I RS=0 chọn thanh ghi lệnh RS=1 chọn thanh ghi dữ

liệu

5 R/W I R/W = 1 đọc dữ liệu, R/W = 0 ghi dữ liệu

Nguyên lý hoạt động của LCD:

 Chân chọn thanh ghi RS: có 2 thanh ghi trong LCD Nếu RS=0 thì thanh ghi lệnh được chọn Cho phép người lập trình gửi 1 lệnh đến LCD như xóa con trỏ, xóa hiển thị v v Nếu RS=1 thì thanh ghi dữ liệu được chọn cho phép người lập trình gửi thông tin cần hiển thị lên LCD

 Chân đọc ghi R/Wcho phép người lập trình đọc dữ liệu từ LCD khi R/W=1 và ghi dữ liệu lên LCD khi R/W=0

Trang 5

 Chân cho phép E chân này được dùng để chốt dữ liệu Khi dữ liệu được gửi đến các chân dữ liệu của LCD thì trên chân E phải có sườn xuống của xung để chốt dữ liệu

 Chân DB0-DB7 là các chân dữ liệu Dùng để gửi thông tin vào LCD hay đọc thông tin từ các thanh ghi bên trong nó

 2 chân cuối cùng là 15 và 16 dùng để sáng LED, giúp người điều khiển nhìn thấy thông tin trên LCD trong bóng tối

Chú ý: chúng ta sử dụng RS =0 để kiểm tra bit cờ bận BD7 Nếu R/W =1 và BD7=0 thì LCD sẽ bận và không nhận bất cứ thông tin gì từ ngoài vào Khi nào DB7= 0 thì LCD mới bắt đầu nhận thông tin.

Dưới đây là sơ đồ phần cứng cho LCD

Sau đây là phần lập trình hiển thị của LCD

#include <REGX51.H>

#include <string.H> //thu vien xau trong C de hien thi ra LCD

sfr LCDdata = 0xA0; //cong 2, 8 bit du lieu

EN=1; //dua chan cho phep len cao

RS=0; //chon thanh ghi lenh

RW=1; //doc du lieu tu LCD

LCDdata=0xFF; //gia tri 0xFF

if (BF==1) //kiem tra co ban

{

Trang 6

delay(200);// neu co BF=1 thi cho 1 luc roi thoat khoi vong if}

EN=0; //dua xung cao xuong thap de chot

RW=0; //ghi du lieu tu bus vao thanh ghi ben trong

}

//*********HAM DIEU KHIEN CLD THUC HIEN 1 LENH*********

void LCDcontrol(unsigned char x)

{

EN=1; //dua chan cho phep len cao

RS=0; //chon thanh ghi lenh

LCDcontrol(0x30); //che do 8 bit

LCDcontrol(0x38); //2 dong ma tran 2x7

LCDcontrol(0x01); //xoa man hinh

LCDcontrol(0x0C); //tat con tro

//******** CHO LCD HIEN THI 1 DONG CHU ****************

void LCDputs(char *s,unsigned char row) //'*s' la con tro tro toi bien s

{

unsigned char len,k;

if (row==1) LCDcontrol(0x80);//ep con tro ve dau dong 1

else LCDcontrol(0xC0); //ep con tro ve dau dong 2

for (k=0;k<16;k++)

{LCDcontrol(0x14);} //dich con tro sang tan cung ben phai

len=strlen(s); //lay do dai bien duoc tro boi con tro

while(len!=0) //khi do do dai van con

Sơ đồ phần cứng:

Trang 7

Trong quá trình đọc phím Xung đặt vào các chân không phải là lý tưởng Khi nhấn phím, điện áp sẽ phải mất 1 khoảng thời gian để ổn định và sẽ xuất hiện các xung kim Phần mềm do đó có thể đọc sai phím Đây được gọi là hiện tương rung cơ học của bàn phím Để giải quyết vấn đề này, khi đọc phím ta sẽ cách 1 khoảng thời gian đọc 1 lần Sau đó kiểm tra Nếu ta lấy được n lần thì bắt đầu đưa ra kết quả nhấn phím Cụ thể trong bài em đã kiểm tra

50 lần, nếu được 10 lần giống nhau thì phím được nhấn.

Chú ý: đối với 80c51, do P0 có cấu trúc đặc biệt nên ta phải nối Port này với điện trở băng và nguồn.

if (x==0) {P0_0=0;P0_1=1;P0_2=1;P0_3=1;}

else{

if (x==1) {P0_0=1;P0_1=0;P0_2=1;P0_3=1;}

else{

if (x==2) {P0_0=1;P0_1=1;P0_2=0;P0_3=1;}

else{

Trang 8

}

III Lưu đồ thuật toán

1 Sơ đồ bố trí các khối của toàn hệ thống

Đưa thông tin vào

Reset đầu thu

HệVXLOnchip80c51

MànhìnhLCD16:2

Bànphím

Trang 9

2 Lưu đồ thuật toán

a Thuật toán thu thông tin

Tràn bộ đếm Tràn timer

 Tăng biến đếm ở kênh đó lên 1

 Đưa tín hiệu reset fip-flop ở kênh đó

Trang 10

căn cứ vào sơ đồ trên nên ta có sơ đồ thiết kế phần cứng của khối thu tin như sau:

Trong đó quy ướn mỗi lần nhấn phím là 1 xung Tất cả đầu vào D của flip-flop được đưa lên mức 1 Chân reset của mỗi flip-flop được nối với 1 chân của VĐK

Chương trình đếm xung bằng timer0

//***************CHUONG TRINH NGAT*********************

int ch1=0,ch2=0,ch3=0,ch4=0,ch5=0,ch6=0;

/* - ham khoi tao - */

void init_timer0(void)

{

EA=0;//cam ngat toan cuc

TMOD=0x02; //che do 8 bit

TL0=0X00;//khoi tao gia tri ban dau cho 2 thanh ghi TL0 va TH0

TH0=0x00;

ET0=1; //cho phep ngat timer 0

EA=1; // cho phep ngat toan cuc

Trang 11

TR0=1;//cho timer 0 chay, bat dau dem so chu ki may

//chuong trinh dem

if (P1_0==1) {ch1++; P1_6=1;delay(20);P1_6=0;if(ch1==5001) ch1=0;} /*neu co tin hieu thi tang bien dem len

1 va dua 1 xung ra de reset lai*/

b Thuật toán hiển thị kết quả đếm ra LCD

Tại sao phải xử lý biến đếm? Đó là do LCD chỉ hiển thị được các kí tự chứ không hiển thị được số Chính vì vậy ta cần phải xử lý biến đếm, đưa dạng số về dạng kí tự

Hiển thị lên LCD

Trang 12

int a,b,c,d;

a =(int)(dem/1000);hangnghin=digit[a];//xac dinh chu so hang nghin

b =(int)((dem-1000*a)/100);hangtram=digit[b];//chu so hang tram

c =(int)((dem-1000*a-100*b)/10);hangchuc=digit[c];//chu so hang chuc

d =(int)(dem-1000*a-100*b-10*c);hangdonvi=digit[d];//chu so hang dvi

}

*Chương trình hiển thị thông tin khi nhấn phím

void read_data(unsigned char phim)

Trang 13

Toàn bộ chương trình:

#include <REGX51.H>

#include <string.H> //thu vien xau trong C de hien thi ra LCD

#include <stdio.H> //thu vien chua cac thu tuc vao ra

void LCDwrite(unsigned char c);

void LCDputs(char *s,unsigned char row);

void init_timer0(void);

Trang 14

void xuly(int dem);

unsigned char doc_phim(void);

void read_data(unsigned char phim);

//********* KIEM TRA CLD CO BAN HAY KHONG *************

void wait(void)

{

long n=0;

EN=1; //dua chan cho phep len cao

RS=0; //chon thanh ghi lenh

RW=1; //doc du lieu tu LCD

LCDdata=0xFF; //gia tri 0xFF

if (BF==1) //kiem tra co ban

{

delay(200);// neu co BF=1 thi cho 1 luc roi thoat khoi vong if}

EN=0; //dua xung cao xuong thap de chot

RW=0; //ghi du lieu tu bus vao thanh ghi ben trong

}

//*********HAM DIEU KHIEN CLD THUC HIEN 1 LENH*********

void LCDcontrol(unsigned char x)

{

EN=1; //dua chan cho phep len cao

RS=0; //chon thanh ghi lenh

RW=0; //ghi len LCD

LCDdata = x;//

EN=0;//xung cao xuong thap de chap nhan cho du lieu ghi vao ben trong

wait();//doi LCD san sang

}

//*******************KHOI TAO LCD*********************

void LCDinit(void)

{

LCDcontrol(0x30); //che do 8 bit

LCDcontrol(0x38); //2 dong ma tran 2x7

LCDcontrol(0x01); //xoa man hinh

LCDcontrol(0x0C); //tat con tro

}

//****************LCD HIEN THI 1 KI TU ****************

Trang 15

void LCDwrite(unsigned char c)

//******** CHO LCD HIEN THI 1 DONG CHU ****************

void LCDputs(char *s,unsigned char row) //'*s' la con tro tro toi bien s

{

unsigned char len,k;

if (row==1) LCDcontrol(0x80);//ep con tro ve dau dong 1

else LCDcontrol(0xC0); //ep con tro ve dau dong 2

for (k=0;k<16;k++)

{LCDcontrol(0x14);} //dich con tro sang tan cung ben phai

len=strlen(s); //lay do dai bien duoc tro boi con tro

while(len!=0) //khi do do dai van con

//***************CHUONG TRINH NGAT*********************

/* - ham khoi tao - */

void init_timer0(void)

{

EA=0;//cam ngat toan cuc

TMOD=0x02; //che do 8 bit

TL0=0X00;//khoi tao gia tri ban dau cho 2 thanh ghi TL0 va TH0

TH0=0x00;

ET0=1; //cho phep ngat timer 0

EA=1; // cho phep ngat toan cuc

TR0=1;//cho timer 0 chay, bat dau dem so chu ki may

}

Trang 16

void demxung(void) interrupt 1

a =(int)(dem/1000);hangnghin=digit[a];//xac dinh chu so hang nghin

b =(int)((dem-1000*a)/100);hangtram=digit[b];//xac dinh chu so hang tram

c =(int)((dem-1000*a-100*b)/10);hangchuc=digit[c];//xac dinh chu so hang chuc

d =(int)(dem-1000*a-100*b-10*c);hangdonvi=digit[d];//xac dinh chu so hang don vi

Trang 17

if (x==0) {P0_0=0;P0_1=1;P0_2=1;P0_3=1;}

else{

if (x==1) {P0_0=1;P0_1=0;P0_2=1;P0_3=1;}

else{

if (x==2) {P0_0=1;P0_1=1;P0_2=0;P0_3=1;}

else{

Trang 18

LCDputs("KENH 4: ",1); //noi dung can hien thixuly(ch4);

Trang 19

LCDputs("KENH 5: ",1); //noi dung can hien thixuly(ch5);

Trang 20

if (P3_0==0) {LCDinit();break;}

}}

Proteus ver7.6 SP4 Phần mềm của đề tài được viết bằng ngôn ngữ C, phần mềm Keil C

uVision3 Do kiến thức và tầm hiểu biết cũng như kinh nghiệm còn hạn chế nên dù đã rất cố gắng cũng không thể tránh khỏi thiếu sót Em rất mong được sự đóng góp của thầy để em có thể hoàn thiện sản phẩm này hơn nữa Em xin chân thành cảm ơn!

Ngày đăng: 08/03/2014, 16:24

HÌNH ẢNH LIÊN QUAN

1. Sơ đồ bố trí các khối của toàn hệ thống - Đồ án asembly :thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51
1. Sơ đồ bố trí các khối của toàn hệ thống (Trang 8)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w