3.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 màn hình LCD 162 với thông tin hiển thị trên màn hình gồm số hiệu kênh và số 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ộ vi xử lý sử dụng onchip 89c51. Tín hiệu xung đưa đến chân T0 của vi điều khiển (Timer 0 hoạt động ở chế độ counter). Code C , sử dụng keil C 4.0
Trang 1MỤC LỤC
I. LỜI NÓI ĐẦU (Trang 1)
II. GIỚI THIỆU VỀ VĐK 89C51 VÀ CÁC LINH KIỆN DÙNG TRONG ĐỀ TÀI
(Trang 2)
III. LƯU ĐỒ THUẬT TOÁN CỦA TỪNG KHỐI VÀ CẢ HỆ THỐNG (Trang 9)
IV. LẬP TRÌNH CHO VĐK AT89C51 VÀ CÁC NGOẠI VI (Trang 18)
(Trang 21)
VI. KẾT LUẬN (Trang 24)
VII. PHỤ LỤC VÀ CODE (Trang 25)
I.LỜI NÓI ĐẦU
Có rất nhiều yêu cầu đặt ra trong thực tiễn kỹ thuật có liên quan đến đề tài ví dụ như đếm số sản phẩm trên hệ thống bang chuyền , đếm số người đi qua cổng một siêu thị hay số xe ô tô
đi ra , vào bãi đỗ xe Do vậy việc chọn đề tài này giúp chúng em hiểu rõ về nguyên lý hoạt động , cách làm để có thể ứng dụng vào thực tiễn khi ra trường
Trong đề tài em có viết tắt một số từ sau đây
Vi điều khiển : VĐK
Trang 2II.GIỚI THIỆU VỀ VĐK AT89C51 VÀ CÁC LINH KIỆN
1.VĐK AT89C51 VÀ BỘ ĐẾM/ĐỊNH THỜI TRONG AT89C51
a.Giới thiệu chung về VĐK 89C51
VĐK 89C51 là một vđk thuộc họ 8051 do hang Intel sáng chế , họ đã chuẩn hóa
họ VĐK này và chia sẻ rộng rãi cho toàn thế giới có thể chế tạo và sử dụng Hiện nay có rất nhiều hang chế tạo loại VĐK này như là Atmel, Motorola, Philips
Trong đề tài này em sử dụng VĐK AT89C51 do hãng Atmel chế tạoAT89C51 là VĐK đóng vỏ dạng DIP có 40 chân
- 128 bytes RAM
- 4 cổng xuất, nhập dữ liệu mỗi cổng 8 bit
- 2 bộ định thời 16bit
- Có mạch giao tiếp nối tiếp
- Không gian nhớ chương trình ngoài 64K
- Không gian nhớ dữ liệu ngoài 64K
- Có ROM trên chip dạng flash
- Mỗi lệnh xử lý hết khoảng 4 micro giây
SƠ ĐỒ CHÂN AT89C51
Trong đó chức năng các chân như sau
- Chân 40 cấp nguồn +5v (Vcc)
- Chân 20 nối đất (GND)
- Chân 29 PSEN là tín hiệu điều khiển xuất ra của 89C51 , nó cho phép chọn bộnhớ ngoài và được nối với chân OE của EPROM mở rộng để cho phép đọc chương trình
- Chân 30 ALE là tín hiệu điều khiển xuất ra của 89C51 , nó cho phép phân kênh bus địa chỉ và bus dữ liệu của port 0
Trang 3- Chân 31 EA được đưa xuống thấp cho phép chọn bộ nhớ ngoài của 89C5 ( EA
= 5(V) chọn rom nội , EA = 0V chọn rom ngoại )
- Chân 18 và 19 để nối thạch anh tạo dao động cho VĐK
- 32 chân còn lại chia làm 4 cổng vào ra trong đó Cổng 0: từ chân 39 đến chân 32 tương ứng là các chân P_0 đến P0_7 , cổng này cần dungtrở kéo để có thể xuất và nhập dữ liệu
Cổng 1 : từ chân 1 đến chân 8 tương ứng là P1_0 đến P1_7
Cổng 2 : từ chân 21 đến chân 28 tương ứng các chân P2_0 đến P2_7
Cổng 3: từ chân 10 đến chân 17 tương ứng các chân P3_0 đến P3_7 , tuy nhiên người ta không thường xuyên dung cổng P3 như một cổng xuất nhập vì mỗi chân của cổng P3 có một chức năng riêng như sau
P3_0: RxD: chân nhân dữ liệu nối tiếp khi giao tiếp RS232 ( cổng COM)P3_1: TxD: chân truyền dữ liệu nối tiếp khi giao tiếp RS 232
P3_2: INT0: chân ngắt ngoài 0P3_3: INT1 : chân ngắt ngoài 1P3_4: T0 : Timer 0 đầu vào của bộ đếm/định thời 0P3_5:T1: Timer 1 đầu vào của bộ đếm/định thời 1P3_6 WR: điều khiển ghi dữ liệu
P3_7 RD: điều khiển đọc dữ liệub.Bộ đếm/định thời trong VĐK 89C51
Mỗi VĐK 89C51 có 2 bộ đếm/định thời là Timer0 và Timer1 tương ứng với 2 chân đầu vào là T0 và T1 , đây là các ngoại vi được thiết kế để thực hiện một nhiệm vụ đơn giản là đếm các xung nhịp Mỗi khi có xung nhịp tại đầu vào đếm thì giá trị của bộ đếm sẽ được tang lên 1 xung nhịp đưa vào đếm có thể là 1 trong 2 loại
Xung bên trong VĐK : đó là xung nhịp được tạo ra nhờ kết hợp mạch dao động bên trong IC và các linh kiện phụ bên ngoài ( thạch anh ) Trong trường hợp sử dụng xung loại này thì ta gọi là các bộ định thời (Timer) do xung nhịp này được tạo ra khá đều đặn nên có thể dung
để đếm thời gian , thiết kế đồng hồ
Xung bên ngoài VĐK:Đó là các tín hiệu logic thay đổi liên tục giữa 02 mức 0-1 và không
nhất thiết phải là đều đặn Trong trường hợp này người ta gọi là các bộ đếm (counters) Ứng dụng phổ biến của các bộ đếm là đếm các sự kiện bên ngoài như đếm các sản phầm chạy trên
băng chuyền, đếm xe ra/vào kho bãi
Trang 4Mỗi bộ đếm có 1 thanh ghi 16bit để lưu giá trị đếm , thanh ghi này có thể truy cập bình thường như các thanh ghi khác và chia ra làm 2 thanh ghi 8 bit con là TH và TL Bộ đếm T0 có thanh ghi TH0 và TL0 tương ứng bộ đếm T1 có TH1 và TL1
Cả 2 bộ đếm đều sử dụng chung một thanh ghi điều khiển gọi là thanh ghi TMOD , thanhghi này là thanh ghi 8bit dung để thiết lập chế độ làm việc khác nhau cho bộ đếm
4 bit thấp của thanh ghi để thiết lập cho bộ Timer 0 , 4 bit cao để thiết lập cho bộ timer 1
Trong đó các bit M1 và M0 là các bit chế độ của thanh ghi Các trường hợp của M1 M0 được cho trong bảng sau
0 0 0 Bộ định thời 13 bit:8 bit là bộ định thời/bộ đếm, 5 bit đặttrước.
Ngoài ra còn một thanh ghi tham gia vào việc điều khiển 2 bộ đếm là thanh ghi TCON ,
là một thanh ghi 8bit
Trang 5Trong đó 4 bit trên dùng để lưu cất trạng thái cho cả bộ đếm 0 và bộ đếm 1 , TF là cờ tràn, TR là bit điều khiển bật tắt bộ đếm tương ứng , 4 bit thấp là 4 bit điều khiển các ngắt
Chẳng hạn ta muốn đếm các xung ở chân P3_4 ta phải nạp các giá trị sau vào các thanh ghi
TMOD=5; // nạp giá trị 00000101TH0=0x00; // reset giá trị của thanh ghi THTL0=0x00; // reset giá trị của TL
P3_4=1; // set chân vào cho bộ đếmTR0=1; // bắt đầu thực hiện đếm2.MÀN HÌNH LCD 16*2
LCD có 16 chân chức năng như sau
liệu
Trang 67 DB0 I/O Bit dữ liệu
- Chân đọc ghi R/W : đầu vào đọc ghi cho phép người dùng ghi thông tin lên LCD khi R/W =0 hoặc đọc thông tin từ nó khi R/W=1
- Chân cho phép E được sử dụng để LCD chốt dữ liệu của nó , khi dữ liệu được cấp đến chân dữ liệu thi một xung mức cao xuống mức thấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liệu Yêu cầu xung này phải rộng tối thiểu 450ns
- Chân D0 đến D7 là các chân dữ liệu dùng để hiển thị thông tin lên LCD hoặc đọc nội dung từ các thanh ghi , LCD có thể hiển thị các ký tự nếu mã ASCII của nó được gửi đến các chân dữ liệu
- Cần chú ý khi sử dụng LCD là phải sử dụng bit RS =0 để kiểm tra bit cờ bận D7, bit này có thể được đọc khi R/W=1 và RS=0 Nếu D7=1 thì LCD đang bận nên sẽ không nhận bất kỳ thông tin nào khi D7 =0 thì LCD sãn sang nhận thông tin mới
Sau đây là bảng mã lệnh của LCD
Mã(hex) Lệnh đến thanh hiển thị của LCD
Trang 7A Tắt hiển thị , bật con trỏ
Muốn điều khiển LCD thực hiện việc gì đó thì ta qua nhưng bước sau
- Bước 0 : chuẩn bị phần cứng , chỉnh độ tương phản
- Bước 1: Khởi tạo LCD
- Bước 2 : Gán giá trị cho các bit điều khiển dùng chân RS,RW,EN cho phù hợp
- Bước 3 xuất dữ liệu ra các cổng dữ liệu
- Bước 4: kiểm tra cờ bận
3.IC MUX 74151
MUX 74151 là một IC gộp kênh 8 đầu vào 2 đầu ra đợn giản
Có ba chân chọn cổng ABC được cho trong bảng chân lý sau
Trang 8Dựa vào bảng chân lý trên ta có thể tìm ra tín hiệu để chọn kênh đếm.4.BÀN PHÍM ĐIỆN THOẠI KIỂU T9 KEYPAD
Nguyên lý quét bàn phím em sẽ trình bày cụ thể ở phần sau
Trang 9III.SƠ ĐỒ KHỐI VÀ LƯU ĐỒ THUẬT TOÁN CỦA TỪNG KHỐI
VÀ CẢ HỆ THỐNG
1-SƠ ĐỒ KHỐI CỦA HỆ THỐNG
Đưa xung về chân T0
Đưa tín hiệu chọn kênh ra
mux 74151
Đưa mã quét phím ra bàn phím
Hoạt động của từng khối cụ thể như sau:
- Khối 6 kênh thông tin đầu vào : thực tế là 6 cảm biến hồng ngoại nhưng trong
đề tài này em mô phỏng bằng 6 nút bấm, bấm 1 lần tương đương với 1 vật thể
đi qua cảm biến
- IC MUX 74151 : ic này có 8 đầu vào nhưng em chỉ sử dụng 6 đầu vào tương ứng với 6 tín hiệu chọn kênh
- VĐK AT89c51: nơi nhận và xử lý thông tin sau đó gửi tín hiệu tới các ngoại vi
- Màn hình 16*2 : hiển thị tên kênh và số sản phẩm trên kênh đó
- Bàn phím : hoạt động bằng cách quét bàn phím , người dùng bấm phím , tín hiệu sẽ gửi về VĐK
Màn hình LCD 16*2 AT89C51
Bàn phím
Trang 102- LƯU ĐỒ THUẬT TOÁN
a, Lưu đồ thuật toán của cả hệ thống
Start : -Gọi hàm thư viện
-Khai báo biến -Khai báo các cổng ra vào cho LCD
Main( ):- Gọi ctc khởi tạo
LCD -Cài đặt chế độ bộ đếm sự kiện T0
Gửi tín hiệu chọn kênh tương ứng ra MUX ,reset giá trị thanh ghi TL , TH , set bit TR0=1
Có tín hiệu thay đổi kênh từ bán
phím ?
Trang 11b, lưu đồ thuật toán quét bàn phímBàn phím ở đây gồm 3 cột và 2 hàng , có 6 nút bấm Nguyên lý quét bàn phím là lần lượt đưa mức thấp đến các cột của bàn phím , bình thườn các hang sẽ có mức cao Nếu nút nào được bấmthì hàng đó sẽ được nối đất , VĐK sẽ quét liên tục nếu có cả cột và hang của phím nào đều ở mức 1 thì phím đó được bấm
N
Kết thúc
Khởi tạo vòng lặp while với điều kiện tín hiệu chọn kênh vẫn giữ nguyên , liên tục gửi tín hiệu điều khiển màn hình in tên kênh
và số xung đưa đến chân T0
Khởi tạo vòng lặp for để lần lượt nạp giá trị cho các cột
Start : khai báo mảng gồm 3 thành phần để lần lượt nạp cho
các cột
Có phím được nhấn?
Trang 12Trong đề tài này , phần code quét bàn phím em trình bày là một trương trình con
unsigned char i,j,phim;
unsigned char ma[3]={0x1b,0x17,0x0f};// mang gia tri de nap cho cong P1 unsigned char banphim()// chuong trinh con ban phim de xac dinh nut da bam
case 0:{phim='1';break;} // truong hop j =0 thi phim 1 duoc bam
case 1:{phim='2';break;} // j=1 phim 2 dc bam
Thoát khỏi vòng lặp , tín hiệu từ phím được bấm gửi về VĐK
Trang 13case 2:{phim='3';break;} // j=2 phim 3 dc bam
case 3:{phim='4';break;} // j=3 phim 4 dc bam
case 4:{phim='5';break;} // j-4 phim 5 dc bam
case 5:{phim='6';break;} // j=5 phim 6 dc bam
default: {phim=0;break;} // mac dinh ko phim nao dc bam thi j=0
P1=ma[i]; // nap gia tri
delay_ms(10); // goi ham delay co gia tri 10ms
if(A==0) // phat hien phim bam o cot A
{j=i+0*3;// gan gia tri j cho moi nut bam de xac dinh toa do
break;} // thoat khoi vong lap
if(B==0)
{j=i+1*3;
break;}
}
Trang 14c, Lưu đồ thuật toán phần màn hình
Để tiện dụng cho việc thực hiện đồ án và làm các bài tập khác , em viết một chương trình dùng chung để khởi tạo LCD và thực hiện các lệnh như xóa màn hình , di chuyển ký tự …
Code như sau
//Ham Gui 4 Bit Du Lieu Ra LCD
void LCD_Send4Bit( unsigned char Data )
// Ham Gui 1 Lenh Cho LCD
void LCD_SendCommand (unsigned char command )
{
LCD_Send4Bit ( command >>4 );/* Gui 4 bit cao */
LCD_Enable () ;
Trang 15LCD_Send4Bit ( command ); /* Gui 4 bit thap*/
LCD_Enable () ;
}
// Ham Khoi Tao LCD
void LCD_Init ( void )
LCD_SendCommand( 0x28 ); // giao thuc 4 bit, hien thi 2 hang, ki tu 5x8
LCD_SendCommand( 0x06 ); // tang ID, khong dich khung hinh
LCD_SendCommand( Clear_LCD ); // xoa toan bo khung hinh
}
Trang 16// Ham Gui 1 Ki Tu Len LCD
void LCD_PutChar ( unsigned char Data ) {
Trang 17LƯU ĐỒ THUẬT TOÁN HIỂN THỊ THÔNG TIN
LCD chỉ hiện thị được các ký tự nên cần chuyển các biến dạng số về dạng ký tự
IV.LẬP TRÌNH CHO VĐK AT89C51 NGOẠI VI
Biến đếm nhận từ VĐK dạng
số
Chuyển biến số thành ký tự với lệnh sprintf
In ký tự lên màn hình
Trang 18Để phục vụ cho việc xuất dữ liệu ra LCD em viết một thư viện main.h để định nghĩa các cổng ra vào cho LCD và một chương trình để tạo hàm trễ Tương tự như CT các hàm cho LCD
em đã trình bàu ở phần trên , sau khi biên dịch chỉ cần để chung file c của các CT này và liên kếtvới project đang thực hiện là có thể gọi hàm con ra để sử dụng
Thư viện main.h code như sau :
//+++++++++++++++++++++++++DEFINE PORT1++++++++++++++++++++++ +++++
//+++++++++++++++++++++++++DEFINE PORT2++++++++++++++++++++++ +++++
#define LCD_RW P0_3
#define LCD_EN P0_4
#define LCD_D4 P2_3
Trang 19#define LCD_D5 P2_2
#define LCD_D6 P2_1
#define LCD_D7 P2_0
//+++++++++++++++++++++++++DEFINE PORT3++++++++++++++++++++++ +++++
// -void delay_ms(unsigned char
x) -void delay_ms(unsigned time)
{
unsigned int i,j;
for(i=0;i<time;i++) for(j=0;j<125;j++)
Trang 20;// khong lam gi ca
} }
Sau khi biên dịch thì sẽ có 2 file là main.h và delay.c
Thực hiện liên kết như hình vẽ minh họa dưới đây
V.SƠ ĐỒ MẠCH MÔ PHỎNG VÀ SƠ ĐỒ MẠCH IN
Phần mềm thực hiện mô phỏng đề tài là PROTEUS 7.8 sơ đồ như hình dưới
Sơ đồ mô phỏng
Trang 21Mạch mô phỏng đã chạy đúng với yêu cầu của đề tài
Sơ đồ nguyên lý
Trang 22Sơ đồ mạch in
Trang 23Sau khi thực hiện trên mạch thật thì có một lỗi phát sinh như sau Khi bấm vào một nút bấm trên kênh đếm sản phẩm thì số sản phẩm thường bị nhảy lên thêm vài số do nhiễu của nút bấm
Trang 24Trên đây là phần trình bày của em về quá trình thực hiện đề tài Qua đề tài em đã rút ra rất nhiều kinh nghiệm về lập trình VĐK và thực hiện trên mạch thật 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 Emxin chân thành cảm ơn!
VII.PHỤ LỤC
Trang 251.Các phần mềm đã sử dụng trong đề tài
- Keil C 4.0
- Proteus 7.8
- ARES 7.82.CODE của cả đề tài
#define LCD_RW P0_3
#define LCD_EN P0_4
#define LCD_D4 P2_3
Trang 26// -void delay_ms(unsigned char
x) -void delay_ms(unsigned time)
Trang 27//Ham Gui 4 Bit Du Lieu Ra LCD
void LCD_Send4Bit( unsigned char Data )
// Ham Gui 1 Lenh Cho LCD
void LCD_SendCommand (unsigned char command ) {
LCD_Send4Bit ( command >>4 );/* Gui 4 bit cao */
Trang 28LCD_Enable () ;
}
// Ham Khoi Tao LCD
void LCD_Init ( void )
LCD_SendCommand( 0x28 ); // giao thuc 4 bit, hien thi 2 hang, ki tu 5x8
LCD_SendCommand( 0x06 ); // tang ID, khong dich khung hinh
LCD_SendCommand( Clear_LCD ); // xoa toan bo khung hinh
}
// ham dua con tro den dia chi x,y
void LCD_Gotoxy(unsigned char x, unsigned char y)
{
Trang 29unsigned char address;
}
// Ham Gui 1 Ki Tu Len LCD
void LCD_PutChar ( unsigned char Data ) {
Trang 30#define A P1_0 // gan cong P1_0 la A
#define B P1_1// gan cong P1_0 la B
#define E P2_5// gan cong P2_5 la E
#define F P2_6 // gan cong P2_6 la F
char k,o;
int l;
char a[10];
unsigned char i,j,phim;
unsigned char ma[3]={0x67,0xc7,0xa7};// mang gia tr de nap cho cong P1 unsigned char chonkenh()// chuong trinh con chon kenh cho mux 74151 {
for(i=0;i<3;i++)//vong lap lan luot nap 3 gia tri tren
{
P1=ma[i]; // nap gia tri
delay_ms(10); // goi ham delay co gia tri 10ms
if(A==0) // phat hien phim bam o cot A
Trang 31{j=i+0*3;// gan gia tri j cho moi nut bam de xac dinh toa do
break;} // thoat khoi vong lap
Trang 32case 1:{phim='2';break;} // j=1 phim 2 dc bam
case 2:{phim='3';break;} // j=2 phim 3 dc bam
case 3:{phim='4';break;} // j=3 phim 4 dc bam
case 4:{phim='5';break;} // j-4 phim 5 dc bam
case 5:{phim='6';break;} // j=5 phim 6 dc bam
default: {phim=0;break;} // mac dinh ko phim nao dc bam thi j=0
LCD_Init(); // goi ham con khoi dong LCD
dua vao chan T0
TH0=0x00;// nap gia tri cho thanh ghi TH0 la 0 xoa bo dem ban dau
TL0=0x00;// nap gia tri cho thanh ghi TL0
while(1)//vong lap vo han chinh cua chuong trinh
{
if(o==0)//kenh 1 o la ket qua cua chuong trinh con chonkenh
{
k=banphim(); // goi chuwowng trinh con banphim de xac dinh ten kenh
LCD_Gotoxy(5,0); // dua con tro den vi tri 5,0 de in ten kenh
Trang 33LCD_PutChar(k); // in ten kenh
E=0; //xuat gia tri qua cong P2 de lam tin hieu chon kenh cho mux 74151
LCD_Puts("kenh"); // in chu kenh len LCD LCD_Gotoxy(7,0); // di chuyen con tro den vi tri 7,0 de hien so san pham
l=TH0*256+TL0; // gan bien l la so san pham de in len LCD if(l>5000)
{l=0;TH0=0;TL0=0;LCD_Clear();k=banphim();LCD_Gotoxy(5,0);LCD_PutChar(k);LC D_Gotoxy(7,0);} // neu so san pham lon hon 5000 thi dem lai tu dau
sprintf(a,"%d",l);// ep kieu bien l ve kieu char la a de in len LCD LCD_Puts(a); // in a len LCD
o=chonkenh(); // cap nhat gia tri cho chuong trinh con chonkenh }
}
//***************************TUONG TU VOI 5 KENH CON
Trang 34LCD_Gotoxy(7,0);
l=TH0*256+TL0;
if(l>5000) {l=0;TH0=0;TL0=0;LCD_Clear();;k=banphim();LCD_Gotoxy(5,0);LCD_PutChar(k);LC D_Gotoxy(7,0);}
sprintf(a,"%d",l);
LCD_Puts(a);
o=chonkenh();
} }
if(o==2) //kenh 3