Đồ án asembly :thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51
Trang 1KHOA 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 2Hà 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 380c51 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 4LCD 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 6delay(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 7Trong 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 92 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 10că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 11TR0=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 12int 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 13Toà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 14void 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 15void 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 16void 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 17if (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 18LCDputs("KENH 4: ",1); //noi dung can hien thixuly(ch4);
Trang 19LCDputs("KENH 5: ",1); //noi dung can hien thixuly(ch5);
Trang 20if (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!