tìm hiểu, khảo sát, xây dựng bài thực hành chuyển đổi adc trên modul mmc-100 với 8051
Trang 1LỜI CẢM ƠN
Em xin chân thành cảm ơn các thầy cô giáo trong trường Đại học Công NghệThông Tin và Truyền Thông- Đại học Thái Nguyên và đặc biệt là thầy giáo
ThS.Phạm Thành Nam-Khoa CNĐT & TT đã tận tình chỉ bảo và định hướng giúp
em hoàn thành đề tài này
Cuối cùng, em xin chân thành cảm ơn gia đình và bạn bè, cũng như các
thành viên phòng thực hành vi điều khiển và vi xử lý, thầy giáo Đinh Quý Long, Nguyễn Thế Dũng đã luôn tạo điều kiện thuận lợi, động viên và giúp đỡ em trong
suốt thời gian học tập cũng như trong quá trình tìm hiểu và nghiên cứu
Thái Nguyên, tháng 3 năm 2015
Trang 2MỤC LỤC
Trang 3DANH SÁCH CÁC HÌNH VẼ
Trang 4DANH SÁCH CÁC BẢNG BIỂU
Trang 5LỜI NÓI ĐẦU
Ngày nay kỹ thuật vi điều khiển đã trở nên quen thuộc trong các ngành kỹ thuật
và trong dân dụng Các bộ vi điều khiển có khả năng xử lý nhiều hoạt động phứctạp mà chỉ cần một chip vi mạch nhỏ, nó đã thay thế các tủ điều khiển lớn và phứctạp bằng những mạch điện gọn nhẹ, dễ dàng thao tác sử dụng
Vi điều khiển không những góp phần vào kỹ thuật điều khiển mà còn góp phần
to lớn vào việc phát triển thông tin Chính vì các lý do trên, việc tìm hiểu, khảo sát viđiều khiển là điều mà các sinh viên ngành Điện Tử - Viễn Thông phải hết sức quantâm Để đáp ứng nhu cầu thực hành của sinh viên các khóa Khoa Công Nghệ Điện
Tử và Truyền Thông liên tục mua sắm các trang thiết bị mới cho các phòng thựchành Việc tìm hiểu về các modul thực hành viết tài liệu hướng dẫn thực hànhnhằm tạo điều kiện cho sinh viên các khóa tiếp theo dễ dàng tiếp cận và phát triểncác công nghệ hiện đại dễ dàng hơn
Xuất phát từ thực tiễn này em đã đi đến quyết định chọn đề tài: Tìm hiểu, khảo sát, xây dựng bài thực hành chuyển đổi ADC trên modul MMC-100 với 8051
nhằm xây dựng các chương trình ứng dụng trên modul MMC-100 và làm tài liệuhướng dẫn thực hành cho các sinh viên khóa sau
Nội dung đề tài gồm 3 chương:
Chương 1: Tổng quan về 8051
Chương 2: Tìm hiểu về kit thực hành vi điều khiển đa năng MMC-100
Chương 3: Thực hành chuyển đổi ADC
Trong quá trình thực hiện đề tài vẫn còn nhiều thiếu sót, mong nhận được nhiều
ý kiến đóng góp từ thầy cô và các bạn
Em chân thành cảm ơn!
Thái Nguyên, tháng 3 năm 2015
Trang 71.2 Sơ đồ giải thuật
Mặc dù các thành viên của họ 8051 đều có các kiểu đóng vỏ khác nhau, chẳnghạn như hai hàng chân DIP, dạng vỏ dẹp vuông QFP, và dạng chíp không có chân
Trang 8đỡ LLC thì chúng đều có 40 chân cho các chức năng khác nhau như vào, ra I/O,đọc RD, ghi WR,địa chỉ, dữ liệu và ngắt Cần phải lưu ý rằng một số hãng cung cấpmột phiên bản 8051 có 20 chân với số cổng vào ra ít hơn cho các ứng dụng yêucầu thấp hơn Tuy nhiên vì hầu hết các nhà phát triển chính sử dụng chíp đóng vỏ
40 chân với 2 hàng chân DIP nên ta chỉ tập trung mô tả phiên bản này
1.2.1 Giới thiệu về họ MSC-51
MCS-51 là họ IC vi điều khiển do hãng Intel sản xuất Các IC tiêu biểu cho họ
là 8051 và 8031 Các sản phẩm MSC-51 thích hợp cho những ứng dụng điềukhiển Việc xử lý trên Byte và các toán số học ở cấu trúc dữ liệu nhỏ được thựchiện bằng nhiều chế độ truy xuất dữ liệu nhanh trên RAM nội
AT89S52 cung cấp những đặc tính chuẩn như sau : 4 KB bộ nhớ chỉ đọc cóthể xóa và lập trình nhanh (EPROM), 128 Byte RAM, 32 đường I/O, 2TIMER/COUNTER 16 Bit, vecto ngắt có cấu trúc 2 mức ngắt, 1 mạch dao động tạoxung Clock và dao động ON-CHIP Thêm vào đó, AT89S52 được thiết kế với logictĩnh cho hoạt động đến mức không tần số và hỗ trợ hai phần mềm có thể lựa chọnnhững chế độ tiết kiện công suất, chế độ chờ (IDLE MODE) sẽ dừng CPU trong khivẫn cho phép RAM, timer/counter, port nối tiếp và hệ thống ngát tiếp tục hoạt động.Chế độ giảm công suất sẽ lưu nội dung RAM những sẽ treo bộ dao động làm khảnăng hoạt động của tất cả những chức năng khác cho đến khi Reset hệ thống
1.2.2 Sơ đồ khối của AT89S52
Trang 9Hình 1 2 Sơ đồ khối
1.2.3 Sơ đồ chân của AT89S52
Hình 1 3 Sơ đồ chân AT89S52
Trang 101.2.4 Chức năng các chân của AT89S52
AT89S52 có tất cả 40 chân có chức năng như các đường xuất nhập trong đó
có 24 chân có tác dụng kép (có nghĩa 1 chân có 2 chức năng), mỗi dường có thểhoạt động như đường xuất nhập hoặc như đường điều khiển hoặc là thành phầncủa các bus dữ liệu và bus địa chỉ
Bảng 1 1 Chức năng các chân của AT89S52
Các port:
Port 0: Port 0 là port có hai chức năng ở các chân 32-39 của AT89S52 trong
các thiết kế cỡ nhỏ không dùng bộ nhớ mở rộng, nó có chức năng như các đường
IO Đối với các thiết kế cỡ lớn có bộ nhớ mở rộng, nó được kết hợp giữa bus địachỉ và bus dữ liệu
Trang 11Port 1: Port 1 là port IO trên các chân 1-8 các chân được kí hiệu p1.0, p1.1,
p1.2, có thể dùng cho giao tiếp với các thiết bị ngoài nếu cần port 1 không có chứcnăng khác, vì vậy chúng chỉ được dùng cho giao tiếp với các thiết bị bên ngoài
Port 2: Port 2 là 1 port có tác dụng kép trên các chân 21-28 được dùng như
các đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết bị dùng bộnhớ mở rộng
Port 3: Port 3 là port có tác dụng kép trên các chân 10-17 Các chân của port
này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tính đặcbiệt của AT89S52 như ở bảng sau:
Bảng 1 2 Chức năng các chân của Port 3
P3.0 RXT Ngõ vào dữ liệu nối tiếpP3.1 TXD Ngõ ra dữ liệu nối tiếp
P3.4 T0 Ngõ vào Time/Counter thứ 0P3.5 T1 Ngõ vào Time/Counter thứ P3.6 WR Tín hiệu ghi dữ liệu lên bộ nhớ
ngoàiP3.7 RD Tín hiệu đọc dữ liệu từ bên ngoài
Các ngõ tín hiệu điều khiển:
Ngõ tín hiệu PSEN:
PSEN là tín hiêu ngõ ra ở chân 29 có tác dụng cho phép đọc bộ nhớ chươngtrình mở rộng thường được nói đén chân OE của Eprom cho phép đọc các byte mởrộng
PSEN ở mức thấp trong thời gian Microcontroller AT89S52 lấy lệnh Các mãlệnh của chương trình được đọc từ Eprom qua bus dữ liệu và được chốt từ thanhghi lệnh bên trong AT89S52 để giải mã lệnh Khi AT89S52 thi hành chương trìnhtrong ROM nội PSEN sẽ ở mức logic1
Ngõ tín hiệu điều khiển ALE(Address latch Enable):
Trang 12Khi AT89S52 truy xuất bộ nhớ bên ngoài, port 0 có chức năng là bus địa chỉ vàbus dữ liệu do đó phải tách các đường dữ liệu và địa chỉ Tín hiệu ra ALE ở chânthứ 30 dùng làm tín hiệu điều khiển để giải đa hợp các đường địa chỉ và dữ liệu khikết nối chúng với IC chốt.
Tín hiệu ra ở chân ALE là một xung trong khoảng thời gian port 0 đóng vai trò
là địa chỉ thấp nên chốt địa chỉ hoàn toàn tự động
Bộ dao động được tích hợp bên trong AT89S52, khi sử dụng AT89S52 ngườithiết kế chỉ cần kết nối thêm thạch anh và các tụ như hình vẽ trong sơ đồ Tần sốthạch anh thường sử dụng cho AT89S52 là 12Mhz
Chân 40 (vcc) được nối lên nguồn.các xung tín hiệu ALE có tốc độ bằng 1/6lần tần số dao động trên chíp và có thể được dùng làm tín hiệu clock cho các phầnkhác của hệ thống chân ALE được dùng làm ngõ vào xung lập trình cho Eprom
Ngõ tín hiệu EA\(External Access):
Tín hiệu vào EA\ ở chân 31 thường được mất lên mức 1 hoặc mức 0 nếu ởmức 1, AT89S52 thi hành chương trình từ ROM nội trong khoảng địa chỉ thấp 8KB.Nếu ở mức 0, AT89S52 sẽ thi hành chương trình từ bộ nhớ mở rộng chân EA\được lấy làm chân cấp nguồn 21V khi lập trình cho Eprom trong AT89S52
Ngõ tín hiệu RST (Reset):
Ngõ vào RST ở chân 9 là ngõ vào reset của AT89S52 khi ngõ vào tín hiệu nàyđưa lên cao ít nhất là 2 chu kỳ máy, các thanh ghi bên trong được nạp những giá trịthích hợp để khởi động hệ thống khi cấp điện mạch tự động Reset
Trang 131.2.5 Sơ đồ khối điều khiển AT89S52 trên modul MMC-100
Hình 1 4 Khối điều khiển sử dụng vi điều khiển AT89S52
1.3 Giới thiệu ngôn ngữ C cho 8051
Trong kỹ thuật lập trình vi điều khiển nói chung, ngôn ngữ lập trình được sửdụng thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao
Trang 14Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do đóviệc lập trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn Có thể kểđến một số ngôn ngữ lập trình bậc cao như C, Basic, Pascal… trong dó C là ngônngữ thông dụng hơn cả trong kỹ thuật vi điều khiển Về bản chất, sử dụng các ngônngữ này thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong việc nghiêncứu các tập lệnh và xây dựng các cấu trúc giải thuật Chương trình viết bằng ngônngữ bậc cao cũng sẽ được một phần mềm trên máy tính gọi là trình biên dịch(Compiler) chuyển sang dạng hợp ngữ trước khi chuyển sang mã máy.
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúccủa bộ vi điều khiển Có nghĩa là với một người chưa quen với một vi điểu khiểncho trước sẽ xây dựng được chương trình một cách nhanh chóng hơn, do khôngphải mất thời gian tìm hiểu kiến trúc của vi điều khiển đó Và việc sử dụng lại cácchương trình đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộhoặc sửa chữa một phần
1.3.1 Kiểu dữ liệu
Kiểu dữ liệu trong C
Bảng 1 3 Các kiểu dữ liệu trong C
* Khai báo biến:
Cú pháp: Kiểu_dữ_liệu Vùng_nhớ Tên_biến _at_ Đia_chỉ;
Ví dụ: Unsigned char data x;
Trang 15Khi khai báo biến có thể gán luôn cho biến giá trị ban đầu.
Ví dụ: Thay vì: unsigned char x;
x = 0;
Ta chỉ cần: unsigned char x = 0;
Có thể khai báo nhiều biến cùng một kiểu một lúc
Ví dụ: Unsigned int x,y,z,t;
Chỉ định vùng nhớ: từ khoá “Vùng_nhớ” cho phép người dùng có thể chỉ ravùng nhớ sử dụng để lưu trữ các biến sử dụng trong chương trình Các vùng nhớ
CODE Bộ nhớ mã nguồn chương trình
DATA Bộ nhớ dữ liệu gồm 128 Byte thấp của RAM trong vi điều khiển
BDATA Bộ nhớ dữ liệu có thê định địa chỉ bit, nằm trong vùng nhớ DATA
IDATA Bộ nhớ dữ liệu gồm 128 Byte cao của RAM trong vi điều khiển
chỉ có ở một số dòng vi điều khiển sau này
PDATA Bố nhớ dữ liệu ngoài gồm 256 Byte, được truy cập bởi địa chỉ
đặt trên P0
XDATA Bộ nhớ dữ liệu ngoài có dung lượng có thể lên đến 64 KB, được
truy cập bởi địa chỉ đặt trên P0 và P2
* Định nghĩa lại kiểu
Cú pháp: Typedef Kiễu_dữ_liệu Tên_biến;
Tên_biến sau này sẽ được sử dụng như một kiểu dữ liệu mới và có thể dùng
để khai báo các biến khác
Ví dụ: Typedef int m5[5];
Dùng tên m5 khai báo hai biến tên a và b có kiểu dữ liệu là mảng 1 chiểu 5phần tử: m5 a,b;
Trang 16 Kiểu dữ liệu trong Keil C
Bảng 1 5 Các kiểu dữ liệu trong C
bit: dùng để khai báo các biến có giá trị 0 hoặc một hay các biến logic trên
vùng RAM của vi điều khiển Khi khai báo biến kiểu bit trình dịc Keil C sẽ mặc địnhvùng nhớ sử dụng là BDATA
sbit, sfr, sfr16: dùng để định nghĩa các cho các thanh ghi chức năng hoặc các
cổng trên vi điều khiển dùng để truy nhập các đoạn dữ liệu 1 bit, 8 bit, 16 bit
1.3.2 Mảng
Mảng là một tập hợp nhiều phần tử cùng một kiểu giá trị và chung một tên.Các phần tử của mảng phân biệt với nhau bởi chỉ số hay số thứ tự của phần tửtrong dãy phẩn tử Mỗi phần tử có vai trò như một biến và lưu trữ được một giá trịđộc lập với các phần tử khác của mảng
Mảng có thể là mảng một chiều hoặc mảng nhiều chiều
Khai báo:
Cú pháp: Tên_kiểu Vùng_nhớ Tên_mảng[số_phần_tử_mảng];
Khi bỏ trống số phần tử mảng ta sẽ có mảng có số phần tử bất kì
Ví dụ: Unsigned int data a[5],b[2] [3];
Với khai báo trên ta sẽ có: mảng a là mảng một chiều 5 phần tử Mảng b làmảng hai chiều, tổng số phần tử là 6
Chỉ số của mảng bắt đầu từ số 0 Mảng có bao nhiêu chiều phải cung cấp đầy
đủ bấy nhiêu chỉ số
Ví du: Phần tử mảng 2 chiều:
Trang 17b[0] [1] là đúngKhi viết: b[0] là sai
1.3.3 Con trỏ
Khi ta khai báo một biến, biến đó sẽ được cấp phát một khoảng nhớ bao gồmmột số byte nhất định dùng để lưu trữ giá trị Địa chỉ đầu tiên của khoảng nhớ đóchính là địa chỉ của biến được khai báo
Con trỏ là một biến dùng để chứa địa chỉ mà không chứa giá trị, hay giá trị củacon trỏ chính là địa chỉ khoảng nhớ mà nó trỏ tới
Với các vùng nhớ cụ thể con trỏ tới vùng nhớ đó chiếm dung lượng phụ thuộcvào độ lớn của vùng nhớ đó Con trỏ tổng quát khi không xác định trước vùng nhớ
sẽ có dung lượng lớn nhất vì vậy tốt nhất nên sử dụng con trỏ cụ thể
Bảng 1 6 Con trỏ trong C
Khai báo biến con trỏ:
Cú pháp: Kiểu_Dữ_liệu Vùng_nhớ *Tên_biến;
Ví dụ: int *int_ptr;
long data *long_ptr;
Khi không chỉ rõ vùng nhớ con trỏ sẽ được coi là con trỏ tổng quát
Trang 181.3.4 Kiểu dữ liệu cấu trúc
Kiểu dữ liệu cấu trúc là một tập hợp các biến, các mảng và cả các kiểu cấutrúc khác được biểu thị bởi một tên duy nhất kiểu dữ liệu cấu trúc dùng để lưu trữcác giá trị, thông tin có liên quan đến nhau
Định nghĩa và khai báo biến cấu trúc:
Định nghĩa: Typedef struct {
Khai báo các biến thành phần;
Trang 19Phép toán thao tác Bit
Bảng 1 10 Phép toán thao tác Bit
Trang 20& Phép và (AND) Bit_1 & Bit_2
1 Khai báo chỉ thị tiền xử lý
2 Khai báo các biến toàn cục
3 Khai báo nguyên mẫu các hàm
Trang 21#define Led1 P1_0
//*********************************
// Khai báo biến toàn cục:
Unsigned char code Led_arr[3];
Unsigned char data dem;
Unsigned int xdata X;
//*********************************
// Khai báo nguyên mẫu hàm
Void delay(unsigned int n);
bit kiemtra(unsigned int a);
//*********************************
// Xây dựng các hàm và chương trình chính: void delay(unsigned int n)
Khai báo biến cục bô;
Mã chương trình kiểm tra biến a;
}
Trang 22Chú ý: Hàm không khai báo nguyên mẫu phải được xây dựng trước hàm có
lời gọi hàm đó Ở ví dụ trên do hàm “bit kiemtra (unsigned int a)” đã được khai báonguyên mẫu hàm ở trên nên có thể xây dựng hàm ở bất kì vị trí nào trong chươngtrình
Tuy nhiên chúng ta nên khai báo nguyên mẫu hàm trước hàm main, và xâydựng các hàm phụ ở sau hàm main Như thế sẽ tạo thói quen lập trình gọn gànghơn, và cũng tạo thuận lợi hơn cho việc xem lại code, tìm kiếm và sửa lỗi sau này
Chỉ thị tiền xử lý
Các chỉ thị tiền sử lý không phải là các lệnh của ngôn ngữ C mà là các lệnhgiúp cho việc soạn thảo chương trình nguồn C trước khi biên dịch Khi dịch mộtchương trình C thì không phải chính bản chương trình nguồn mà ta soạn thảo đượcdịch Trước khi dịch, các lệnh tiền xử lý sẽ chỉnh lý bản gốc, sau đó bản chỉnh lýnày sẽ được dịch Có ba cách chỉnh lý được dùng là:
+ Phép thay thế #Define
+ Phép chèn tệp #Include
Các chỉ thị tiền xử lý giúp ta viết chương trình ngắn gọn hơn và tổ chức biêndịch, gỡ rối chương trình linh hoạt, hiệu quả hơn
* Chỉ thị #Define: Chỉ thị #define cho phép tạo các macro thay thế đơn giản.
Cú pháp: #Define Tên_thay_thế dãy_kí_tự
Một Tên_thay_thế có thể được định nghĩa lại nhiều lần, nhưng trước khi địnhnghĩa lại phải giải phóng định nghĩa bằng chỉ thị:
#Undef Tên_thay_thế
Ví dụ: #define N 100
* Chỉ thị #Include: Chỉ thị #include báo cho trình biên dịch nhận nội dung của tệp
khác và chèn vào tệp chương trình nguồn mà ta soạn thảo
Cú pháp:
Cách 1: #include<tên_tệp>
Trang 23Chú thích trong chương trình sẽ không ảnh hưởng đến chương trình mà tasoạn thảo vì trình dịch sẽ bỏ qua tất cả lời chú thích khi biên dịch chương trìnhsang mã máy.
Lời giải thích được đặt sau dấu “//” nếu chú thích chỉ viết trên một dòng hoặc trong cặp dấu “\*” và “*\”.
1.3.7 Các lệnh cơ bản trong C
+ Câu lệnh rẽ nhánh if:
Cấu trúc 1: if(dieu_kien){
// Đoạn chương trình }
Trang 24Giải thích: nếu dieu_kien đúng thì xử lí các câu lệnh bên trong còn sai thì
nhảy qua
Cấu trúc 2: if(dieu_kien){
// Đoạn chương trình 1 }
else{
// Đoạn chương trình 2 }
Giải thích: nếu dieu_kien đúng thì xử lí “Đoạn chương trình 1” bên trong còn
sai thì xử lý “Đoạn chương trình 2”
+ Câu lệnh lựa chọn Switch:
Cấu trúc: switch(biến)
{
case gia_tri_1: //các câu lệnh break;
case gia_tri_2: //các câu lệnh break;
………
case gia_tri_n: //các câu lệnh break;
Default: //các câu lệnh }
Giải thích: Tuỳ vào biến có giá trị bằng giá trị của Case nào thì thực hiện các
câu lệnh tương ứng trong Case đó, sau đó thoát khỏi cấu trúc nhờ câu lệnh
“break;” Nếu không có Case nào phù hợp thì thực hiện các câu lệnh trong default
Trang 25Giải thích: x là biến, n là giá trị xác định Trước tiên vòng lặp sẽ gán giá trị ban
đầu cho biến: x=n, rồi kiểm tra nếu điều_kiện đúng thì thực hiện các câu lệnh xử lý,sau đó thực hiện Phép_toán nhằm tác động đến điều kiện Sau đó lại kiểm tralại điều_kiện, nếu còn đúng thì thực hiện tiếp, nếu sai sẽ thoát khỏi vòng lặp
Các thành phần trong vòng for có thể không cần khai báo,for sẽ bỏ qua phần
đó, nhưng vẫn phải có đủ 2 dấu “;”.
Giải thích: Trước tiên chương trình sẽ kiểm tra điều_kiện, nếu đúng thì
thực hiện các câu lệnh, sau đó quay lại kiểm tra điều_kiện Còn nếu điều_kiện saithì thoát khỏi vòng lặp ngay
+ Vòng lặp không xác định do while:
Cấu trúc: do
{
// các câu lệnh } while(dieu_kien);
Giải thích: Trước tiên đoạn chương trình thực hiện các câu lệnh sau đó kiểm
tra điều_kiện nếu đúng thì lặp lại thực hiện các câu lệnh tiếp, nếu sai thì thoát khỏivòng lặp