HỌC VIỆN KĨ THUẬT QUÂN SỰ
KHOA VÔ TUYẾN-ĐIỆN TỬ
ĐỒ ÁN MÔN HỌC
Kỹ thuật vi xử lý và lập trình assembly cho hệ VXL
Đề tài:
Thiết kế đếm sản phẩm sáu kênh với số lượng xung tích lũy tối đa trên một
kênh là 5000 xung, hệ thống hiển thị sử dụng LCD 16:2 với thông tin hiển
thị lên màn hình gồm số hiệu kênh và số lượng xung tích lũy được trên
kênh. Việc lựa chọn kênh hiển thị qua bàn phím, sử dụng bàn phím điện
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
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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 độ
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
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
4
LCD có 16 chân chức năng như sau
chân Kí hiệu I/O Mô tả
1 V
SS
- Đất
2 V
CC
- Nguồn
3 V
EE
- Nguồn điều khiển tương phản
4 RS I RS=0 chọn thanh ghi lệnh. RS=1 chọn thanh ghi dữ
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
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^7;
sbit BF = 0xA7;
//********* 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
{
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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)
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
{
LCDwrite(*s); //ghi ra LCD gia tri dc tro boi con tro
s++; //tang con tro
len ; //giam do dai
LCDcontrol(0x1C);
}
}
4. Bàn phím
Nguyên lý quét ma trận phim 3x4 theo hàng là ra sẽ đưa mức thấp đến từng hàng.
Bình thường các cột sẽ có mức cao. Nếu 1 nút được nhấn thì cột của nút đấy sẽ có mức thấp.
Vậy ta sẽ kiểm tra xem hàng nào và cột nào cùng có mức thấp thì nút giao nhau giữa hàng và
cột đó sẽ được nhấn.
Sơ đồ phần cứng:
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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 (dem3==10) {giatribanphim = 3+3*x;break;}}
}
}
return(giatribanphim);
}
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
6
kênh
thông
tin
vào
6
đầu
thu
tin
cho
6
kênh
(bẫy
xung
)
Hệ
VXL
Onchi
p
80c51
Màn
TL0=0,TH0=0
EA=1,ET0=1
TR0=1 (cho timer chạy)
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
11
TR0=1;//cho timer 0 chay, bat dau dem so chu ki may
}
void demxung(void) interrupt 1
{
TR0=0;//dung chay timer0
TF0=0;//xoa co tran
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)
{
if (phim==1)
{
LCDputs("KENH 1: ",1); //noi dung can hien thi
xuly(ch1);
LCDcontrol(0x1C);//dich trai
LCDwrite(hangnghin);
LCDcontrol(0x1C);
LCDwrite(hangtram);
LCDcontrol(0x1C);
LCDwrite(hangchuc);
LCDcontrol(0x1C);
LCDwrite(hangdonvi);
delay(30000);
LCDinit();//khoi tao cho LCD
}
if (phim==2)
{
LCDputs("KENH 2: ",1); //noi dung can hien thi
xuly(ch2);
v v
IV. Sơ đồ thiết kế tổng thể và chương trình
Đồ án Kĩ thuật vi xử lý
//********* 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(0x1C);
}
}
//***************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
}
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
16
void demxung(void) interrupt 1
{
TR0=0;//dung chay timer0
TF0=0;//xoa co tran
//chuong trinh dem
if (P1_0==1) {ch1++; P1_6=1;delay(20);P1_6=0;if(ch1==5001) ch1=0;}
if (P1_1==1) {ch2++; P1_7=1;delay(20);P1_7=0;if(ch2==5001) ch2=0;}
if (P1_2==1) {ch3++; P3_1=1;delay(20);P3_1=0;if(ch3==5001) ch3=0;}
if (P1_3==1) {ch4++; P3_2=1;delay(20);P3_2=0;if(ch4==5001) ch4=0;}
if (P1_4==1) {ch5++; P3_3=1;delay(20);P3_3=0;if(ch5==5001) ch5=0;}
if (P1_5==1) {ch6++; P3_4=1;delay(20);P3_4=0;if(ch6==5001) ch6=0;}
TH0=0x00;
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
{
if (x==3) {P0_0=1;P0_1=1;P0_2=1;P0_3=0;}}}}
for(y=0;y<50;y++) //chong rung phim
{
if(P0_4==0) {dem1++;
if (dem1==10) {giatribanphim = 1+3*x;break;}}
if(P0_5==0) {dem2++;
if (dem2==10) {giatribanphim = 2+3*x;break;}}
if(P0_6==0) {dem3++;
if (dem3==10) {giatribanphim = 3+3*x;break;}}
}
}
return(giatribanphim);
}
//******************** CHON KENH **********************
void read_data(unsigned char phim)
{
if (phim==1)
{
LCDputs("KENH 1: ",1); //noi dung can hien thi
xuly(ch1);
LCDcontrol(0x1C);
LCDwrite(hangnghin);
xuly(ch3);
LCDcontrol(0x1C);
LCDwrite(hangnghin);
LCDcontrol(0x1C);
LCDwrite(hangtram);
LCDcontrol(0x1C);
LCDwrite(hangchuc);
LCDcontrol(0x1C);
LCDwrite(hangdonvi);
delay(30000);
LCDinit();//khoi tao cho LCD
}
if (phim==4)
{
LCDputs("KENH 4: ",1); //noi dung can hien thi
xuly(ch4);
LCDcontrol(0x1C);
LCDwrite(hangnghin);
LCDcontrol(0x1C);
LCDwrite(hangtram);
LCDcontrol(0x1C);
LCDwrite(hangchuc);
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
19
LCDcontrol(0x1C);
LCDwrite(hangdonvi);
delay(30000);
LCDinit();//khoi tao cho LCD
}
}
//*************** CHUONG TRINH CHINH ******************
void main()
{
unsigned char i;
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
20
P1_6=0;P1_7=0;P3_1=0;P3_2=0;P3_3=0;P3_4=0;
LCDinit();//khoi tao cho LCD
init_timer0();
while(1)
{
i=doc_phim();
if((((((i==1)||(i==2))||(i==3))||(i==4))||(i==5))||(i==6))
{
while(1)
{
read_data(i);
if (P3_0==0) {LCDinit();break;}
}
}
}
}
V. Tổng kết
Trên đây là phần trình bày của em về quá trình xây dựng cũng như cách thực hiện đề
tài đồ án vi xử lý. Phần cứng của đề tài được thiết kế và chạy mô phỏng trên phần mềm
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ó