Tải bản đầy đủ (.doc) (21 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (411.14 KB, 21 trang )

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 độ


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.
1. Onchip 80c51
80c51 là bộ vi xử lý có 8 bit. Tức là nó chỉ có thể làm việc tối đa được với 8 bit dữ
liệu ở cùng 1 thời điểm. 80c51 có 4 cồng vào ra . Mỗi cổng rộng 8 bit.
Cấu trúc của vi điều khiển 80c51
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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
Đồ á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ữ

liệu
5 R/W I R/W = 1 đọc dữ liệu, R/W = 0 ghi dữ liệu
6 E I/O Cho phép đọc ghi
7 DB0 I/O Bit dữ liệu
8 DB1 I/O Nt
9 DB2 I/O Nt
10 DB3 I/O Nt
11 DB4 I/O Nt
12 DB5 I/O Nt
13 DB6 I/O Nt
14 DB7 I/O Nt
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
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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
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)

{
EN=1; //dua chan cho phep len cao
RS=0; //chon thanh ghi lenh
RW=0; //ghi len LCD
LCDdata = x;//gan gia tri hex cho PORT2, khac voi khai bao chon PORT2 lam bus du lieu vao ra
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 ****************
void LCDwrite(unsigned char c)
{
EN=1;//cho phep
RS=1;//ghi du lieu
RW=0;//ghi len LCD
LCDdata = c;
EN=0;//xung cao xuong thap
wait();
}
//******** 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
{
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.

Chương trình đọc bàn phím
//******************** DOC PHIM ***********************
unsigned char doc_phim(void)
{
unsigned char giatribanphim;
unsigned char x;
unsigned char y;
char dem1=0,dem2=0,dem3=0;
for (x=0;x<4;x++)
{
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
{
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
8
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);
}
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

hình
LCD
16:2
Bàn
phím
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
9
2. Lưu đồ thuật toán
a. Thuật toán thu thông tin
Tràn bộ đếm
Tràn timer
N
Y
N
Y
• Dừng chạy timer0 TR0=0
• Xóa cờ tràn TF0=0
Kiểm tra từ P1.0 đến P1.5.
Có xung?
• Tăng biến đếm ở kênh đó lên 1
• Đưa tín hiệu reset fip-flop ở kênh đó
Biến đếm = 5001
?
Đặt lại biến đếm về 0
Reset flip flop tương ứng
Tiếp tục cho chạy timer 0
START:
Cài đặt mode2,8bit auto reload cho
timer0

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

//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*/
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;
TR0=1;//cho chay timer0
}
như vậy trong phần thiết kế, ta đã đặt timer 0 ở chế độ 8 bít. Nên sau 255us chương trình đếm
xung sẽ được gọi.
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ự
*Hàm xử lý biến đếm
/*************** XU LI BIEN DEM **********************
char hangnghin,hangtram,hangchuc,hangdonvi;
char digit[10]={'0','1','2','3','4','5','6','7','8','9'};
void xuly(int dem)
{
Biến đếm
Xử lý biến đếm, chuyển số
thành kí tự
Hiển thị lên LCD
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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)
{
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ý

GVHD:Nguyễn Hải Dương
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
//******************** KHAI BAO ***********************
sfr LCDdata = 0xA0; //cong 2, 8 bit du lieu
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^7;
sbit BF = 0xA7;
// cac bien toan cuc
int ch1=0,ch2=0,ch3=0,ch4=0,ch5=0,ch6=0;
char hangnghin,hangtram,hangchuc,hangdonvi;
char digit[10]={'0','1','2','3','4','5','6','7','8','9'};
// khai bao chuong trinh con
void delay(int t);
void wait(void);
void LCDcontrol(unsigned char x);
void LCDinit(void);
void LCDwrite(unsigned char c);
void LCDputs(char *s,unsigned char row);
void init_timer0(void);
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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 ****************
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
15
void LCDwrite(unsigned char c)
{
EN=1;//cho phep
RS=1;//ghi du lieu
RW=0;//ghi len LCD
LCDdata = c;
EN=0;//xung cao xuong thap
wait();
}
//******** 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
{
LCDwrite(*s); //ghi ra LCD gia tri dc tro boi con tro
s++; //tang con tro
len ; //giam do dai

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;

TR0=1;//cho chay timer0
}
//*************** XU LI BIEN DEM **********************
void xuly(int dem)
{
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];//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
}
//********************* HAM TRE ***********************
void delay(int t)
{
int i;
for (i=0;i<=t;i++) {;}
}
//******************** DOC PHIM ***********************
unsigned char doc_phim(void)
{
unsigned char giatribanphim;
unsigned char x;
unsigned char y;
char dem1=0,dem2=0,dem3=0;
for (x=0;x<4;x++)
{
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
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
{
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);

LCDcontrol(0x1C);
LCDwrite(hangtram);
LCDcontrol(0x1C);
LCDwrite(hangchuc);
LCDcontrol(0x1C);
LCDwrite(hangdonvi);
delay(30000);
LCDinit();//khoi tao cho LCD
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
18
}
if (phim==2)
{
LCDputs("KENH 2: ",1); //noi dung can hien thi
xuly(ch2);
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==3)
{
LCDputs("KENH 3: ",1); //noi dung can hien thi

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
}

if (phim==5)
{
LCDputs("KENH 5: ",1); //noi dung can hien thi
xuly(ch5);
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==6)
{
LCDputs("KENH 6: ",1); //noi dung can hien thi
xuly(ch6);
LCDcontrol(0x1C);
LCDwrite(hangnghin);
LCDcontrol(0x1C);
LCDwrite(hangtram);
LCDcontrol(0x1C);
LCDwrite(hangchuc);
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ó

thể hoàn thiện sản phẩm này hơn nữa. Em xin chân thành cảm ơn!
Đồ án Kĩ thuật vi xử lý
GVHD:Nguyễn Hải Dương
21
Mục lục
Mục Trang
I.Phân tích đề tài 2
II.Các linh kiện trong mạch 2
1.Onchip80c51 2
2.Flip Flop D 3
3.LCD 16:2 4
4.bàn phím 6
III.Lưu đồ thuật toán 8
1.Sơ đồ bố trí các khối của toàn hệ thống 8
2.Lưu đồ thuật toán 9
a.Thuật toán thu thông tin 9
b.Thuật toán hiển thị thông tin lên LCD 11
IV.Sơ đồ thiết kế tổng thể và chương trình 12
V.Tổng kết 19

×