Chương 1: Tổng quan về vi xử lý và vi điều khiển 1.1 Giới thiệu chung về vi xử lý và vi điều khiển 1.2 Cấu trúc chung của hệ vi xử lý và vi điều khiển 1.3 Giới thiệu một số dòng vi điều khiển thông dụng Chương 2: Cấu trúc và lập trình cho 8051 2.1 Cấu trúc và các ngoại vi của 8051 2.2 Ngôn ngữ lập trình cho 8051 2.3 Cấu trúc chương trình và lập trình C cho 8051 2.4 Hoạt động định thời và hoạt động ngắt của 8051 2.5 Ghép nối vi điều khiển với các ngoại vi cơ bản 2.5.1 Lập trình vàora với các cổng 2.5.2 Ghép nối và hiển thị với LED 7 thanh và LCD Chương 3: Đo lường và điều khiển với 8051 3.1. Đo tốc độ, vị trí và lưu lượng sử dụng Encoder. 3.2. Đo lường và điều khiển sử dụng bộ chuyển đổi tương tự số (ADC) và số tương tự (DAC). 3.3. Đo lường và điều khiển sử dụng các chuẩn giao tiếp nối tiếp 3.3.1 Giao tiếp SPI và I2C 3.3.2 Giao tiếp 1wire
Trang 1Chương 1: Tổng quan về vi xử lý và vi điều khiển
1.1 Giới thiệu chung về vi xử lý và vi điều khiển
1.2 Cấu trúc chung của hệ vi xử lý và vi điều khiển
1.3 Giới thiệu một số dòng vi điều khiển thông dụng
2.1 Cấu trúc và các ngoại vi của 8051
2.2 Ngôn ngữ lập trình cho 8051
2.3 Cấu trúc chương trình và lập trình C cho 8051
2.4 Hoạt động định thời và hoạt động ngắt của 8051
2.5 Ghép nối vi điều khiển với các ngoại vi cơ bản
2.5.1 Lập trình vào/ra với các cổng
2.5.2 Ghép nối và hiển thị với LED 7 thanh và LCD
3.1 Đo tốc độ, vị trí và lưu lượng sử dụng Encoder
3.2 Đo lường và điều khiển sử dụng bộ chuyển đổi tương tự - số (ADC) và số - tương tự (DAC)
3.3 Đo lường và điều khiển sử dụng các chuẩn giao tiếp nối tiếp
3.3.1 Giao tiếp SPI và I2C
3.3.2 Giao tiếp 1-wire
Tài liệu bắt buộc
1 Đỗ Duy Phú, Giáo trình vi xử lý, Nhà xuất bản giáo dục Việt Nam, 2015
Trang 2Chương 1: Khái quát chung về vi xử lý và vi điều khiển
1.1 Giới thiệu chung về vi xử lý và vi điều khiển
Vi xử lý: (Micro-Processor):
vi tính
chip với vài chục chân Phức tạp hơn, CPU được ráp sẵn trong các bộ mạch với hàng trăm con chip khác CPU là một mạch xử lý dữ liệu theo chương trình được thiết lập trước Nó là một mạch tích hợp phức tạp gồm hàng triệu transistor
Vi điều khiển: là một máy tính được tích hợp trên một chíp, nó thường được sử dụng để điều khiển các thiết bị điện tử
dùng và giá thành thấp (khác với các bộ vi xử lý đa năng dùng trong máy tính) kết hợp với các khối ngoại vi như bộ nhớ, các mô đun vào/ra, các mô đun biến đổi số sang tương tự và tương tự sang số,
khá nhiều trong các dụng cụ điện tử, thiết bị điện, máy
So sánh giữa vi xử lý và vi điều khiển
Embedded System (hệ thống nhúng)
chỉ sử dụng VXL hoặc VĐK để thực thi 1 công việc duy nhất;
trong ROM;
vd:printer, keyboard, video game player
Trang 31.2 Cấu trúc chung của hệ vi xử lý và vi điều khiển
(Sơ đồ khối một hệ máy tính căn bản)
1.3 Giới thiệu một số dòng vi điều khiển thông dụng
Việc sử dụng các loại vi điều khiển và vi xử lý trong các thiết bị điện tử tự động ở Việt Nam rất đa dạng, phong phú tùy vào yêu cầu kỹ thuật và giá thành sản phẩm
8051,
PIC, AVR, PsoC,
Tiêu chí chọn vi điều khiển:
o Tốc độ, lượng bộ nhớ, cổng I/O, timers, kích cỡ, đóng gói, năng lượng tiêu thụ
Trang 4Chương 2: Cấu trúc và lập trình cho 8051 2.1 Cấu trúc của 8051/ Sơ đồ khối của 8051
lý của 8051 (liên quan đến thời gian/lệnh, Timer, Interrupt );
128K: AVR 128, 1M: STM32F4 -> không cần quá quan tâm)
lên tới 4K: AVR 128, 192K: STM32F4
Data), Bus điều khiển (Control Bus)
Các thành viên họ 8051
Trang 5a) Sơ đồ chân của 8051
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
U1
AT89C51
R1
10k
Trang 6Port 3 là Port xuất nhập 8-bit hai chiều Port 3 cũng còn làm các chức năng khác của
AT89C51 Các chức năng này được liệt kê như sau:
động đang hoat động sẽ reset 8051 Mạch reset tác động bằng tay và tự động reset khi khởi động máy
trên chip
o /EA nối mass chỉ định rằng code lưu trên bộ nhớ ngoài
o /PSEN & ALE dùng cho ROM ngoài
o Với 8051, 8031, 8032 thì /EA nối Vcc
o “/”: chỉ định tác động mức thấp
o Output, cho phép truy xuất bộ nhớ chương trình ngoài
o Nối tới chân /OE của ROM/EPROM
o Khi thực thi chương trình ở ROM nội, /PSEN được giữ ở mức1
o Là chân output cho phép chốt địa chỉ để giải đa hợp (demultiplexing) bus dữ liệu
và bus địa chỉ
o ALE xuất tín hiệu để chốt địa chỉ (byte thấp địa chỉ 16-bit) vào 1 thanh ghi ngoài
(memory cycle) Trong nửa chu kỳ bộ nhớ còn lại, P0 sẽ xuất/nhập dữ liệu
o ALE có f=1/6fclock
o Có 1 ngoại lệ: trong thời gian thực thi lệnh MOVX, một xung ALE bị bỏ qua
Trang 7Nguồn cho 8051 hoạt động: 5 VDC
Mạch dao động và Reset
bộ nhớ ngoài để chứa chương trình (code) thực thi, cần nối chân (EA/VPP) này lên nguồn dương (5V) Đây là chân chọn bộ nhớ lưu giữ chương trình thực thi của vi điều khiển Khi nối lên +5V là đã chọn thực thi chương trình từ bộ nhớ flash bên trong VĐK
khiển thì phải sử dụng trở treo cho các chân port P0 Thường sử dụng trở băng 10k cho
8 chân của port P0
thiết kế mạch nên vẽ thêm các chân mạch nạp để trong quá trình test code sẽ nạp trực tiếp onboard (chỉ dùng được với dòng 89S có hỗ trợ chuẩn nạp ISP) sẽ tiện lợi hơn rất nhiều là khi các bạn cứ phải tháo chip ra vào, dễ làm gãy chân chip
b) Các ngoại vi của 8051
Trang 8P2.0=0;
P2.1=1;
2.3 Cấu trúc chương trình và lập trình C cho 8051
Giới thiệu Keil-C
Trang 92.3.1 Cấu trúc chương trình lập trình C cho 8051
2.3.2 Khai báo biến, các phép toán và các cấu trúc của C / Biến số trong Keil-C
Trang 10
Cấu trúc điều khiển cơ bản trong Keil-C
Cấu trúc if
if (điều kiện) {
tập lệnh 1;
} else { tập lệnh 2;
}
Vòng lặp for for (i = 0; i < n ; i++) {
khối lệnh;
} Vòng lặp for vô tận for (;;)
{ khối lệnh }
Trang 11} while (biểu thức điều kiện)
Các lệnh xuất/nhập, định địa chỉ trên Keil:
#define DataPort P2 DataPort = 0xFE; // gắn giá trị 0xFE vào cổng P2
//Khai báo thư viện sử dụng
#include <reg51.h> /*Khai báo thư viện 8051*/
#include <math.h> /*Khai báo dùng thư viện toán*/
#include <absacc.h> /**/
//Định nghĩa biến, khai báo biến toàn cục
Trang 122.3.3 Ứng dụng điều khiển LED đơn bằng nút bấm
Ví dụ 1: Ấn nút đèn P1.0 sáng, buông tay đèn tắt
Ví dụ 2:
XTAL2 18 XTAL1 19
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WRP3.5/T1 1615 P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
R4
10k
Trang 132 4 Hoạt động định thời và hoạt động ngắt của 8051
2.4.1 Timer/Counter
xung, tạo chu kỳ lấy mẫu trong hệ thống điều khiển số, tạo tốc độ baud cho cổng nối tiếp…
a) Giới thiệu về Timer/counter
Counter (C/T=1) đếm các xung ở chân vi điều khiển (T0/T1) Có thể là xung rời rạc
8051 dùng thạch anh ngoài:
Trang 14Các thanh ghi cho Timer/counter
Thanh ghi TCON: Là thanh ghi 8 bit, có thể truy xuất byte hoặc bit dùng để điều khiển hoạt động của Timer
Thanh ghi TMOD: Là thanh ghi 8 bit, chỉ có thể truy xuất byte dùng để xác định chế độ hoạt động của Timer
M0, M1: Chọn chế độ hoạt động của Timer/Couter (T/C)
Trang 15Chế độ 0: TLx chỉ được sử dụng 5 bit đầu để ghép với 8bit của THx, tạo thành 13 bit Thời
Chế độ 2: Chế độ 8 bit, tự động nạp lại Khi đó TLx hoạt động để đếm (định thời), còn THx chứa giá trị nạp lại Khi xảy ra tràn, TFx được bật lên, đồng thời cho phép giá trị của THx được nạp vào TLx
Trang 16Chế độ 3: Bộ định thời/bộ đếm 8 bit Tuy nhiên chỉ sử dụng hai thanh ghi TH0 và TL0 (TH0 thay vai trò của TH1, TH1 không được sử dụng)
GATE, C/ T: điều khiển trạng thái hoạt động cho Timer/Counter
“TRx = 1” thì cũng cho phép ta khởi động và dừng bộ định thời từ bên ngoài tại bất
kỳ thời điểm nào thông qua công tắc chuyển mạch đơn giản
Trang 17Các bước lập trình cho chế độ 1
sử dụng và chế độ nào được chọn
này bộ định thời bắt đầu đếm tiến
không Thoát vòng lặp khi TF được lên cao
Tìm ra được các giá trị cần thiết cho các thanh thi TH và TL:
Ví dụ sau với việc sử dụng tần số dao động XTAL = 12 MHz đối với hệ thống 8051, dung T/C ở chế độ 1 – 16 bit):
Các bước để tìm các giá trị của các thanh ghi TH và TL:
1 Chia thời gian trễ cần thiết cho 1(us): n
3 Chuyển đổi kết quả ở bước 2 sang số Hex: ta có YYXX là giá trị Hexa ban đầu cần phải nạp vào các thanh ghi bộ định thời
void delay_1ms (void) { //định nghĩa hàm delay
TMOD=0x01; //chọn timer0 chế độ 1 16Bit
#include<at89x51.h> //khai báo thư viện cho VĐK 89x51
void delay_1ms(void); //khi báo nguyên mẫu hàm con tạo trễ
main()
{
TMOD=0x20; //chọn timer1, chế độ 2, 8Bit, tự nạp lại
Trang 18Delay_1ms(); //gọi chương trình con tạo trễ
P1_5=~P1_5; //đảo tín hiệu chân P1_5
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WRP3.5/T1 1615 P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
R17
10k
Dem
Trang 192.4.2 Lập trình ngắt
ĐN Ngắt (Interrupt) : là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều khiển xảy ra, buộc vi điều khiển tạm dừng thực hiện chương trình hiện tại, phục vụ ngay lập tức nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt (ISR: Interrupt Service Routine)
Cấu trúc khai báo trình phục vụ ngắt
void int0_ISR(void) interrupt 0 //using 1
Trang 20Thanh ghi hệ thống ngắt
Thanh ghi cho phép ngắt IE
Thanh ghi ưu tiên IP
Trang 21Ngắt ngoài:
Có hai kiểu ngắt ngoài: ngắt theo mức và theo sườn
Điều kiện để VĐK nhận biết được ngắt ngoài
(Thời gian tối thiểu của xung ngắt theo mức)
(Thời hạn xung tối thiểu để phát hiện ra các ngắt theo sườn âm)
(Các bước cho phép ngắt)
Trang 22Ngắt Timer
Ví dụ: Hãy viết chương trình điều khiển 3 LED (D1-D3) nhấp nháy ở cổng P1 và hẹn giờ
cứ 10 giây lại bật đèn LED D4 , đèn sẽ tắt sau vài giây Hãy sử dụng bộ Timer0 để hẹn giờ, tần số của 8051 là XTAL = 12MHz
XTAL2 18 XTAL1 19
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
330 330 330
Trang 23b) Điều khiển ngắt theo mức
XTAL2 18 XTAL1 19
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WRP3.5/T1 1615 P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
R17
10k
GIAM TĂNG
Trang 24c) Lập trình bộ đo tần số sử dụng ngắt ngoài, ngắt Timer
XTAL2 18 XTAL1 19
ALE 30 EA 31 PSEN 29
RST 9
P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32
P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8
P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28
P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27
R17
10k
Ngat
220 220
Thuong R19
10k
Trang 252 4.4 Giới thiệu bài toán đo tốc độ động cơ sử dụng Encoder
//Khai bao cac ham con
void delay_ms(unsigned int Time);
static unsigned char LED7SEG[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //LED 7 thanh
//Khai bao ham phuc vu ngat ngoai INT0
void ngatINT0() interrupt 0
{
xung++;
}
// Khai bao ham phuc vu ngat Timer 0
void timer0() interrupt 1
{
time++;
Trang 26//Khai bao ngat ngoai
EX0=1;//Cho phep nhat INT0 chan 3.2
IT0=1;//Cho phap INT0 ngat theo suon xuong
//Khai bao ngat timer 0 trong 10ms
//TH0=0xfc;
TL0=0xEF;
TH0=0xD8;
TR0=1; //khoi dong timer
Trang 27a++;
if (a>=4) a = 0;
}
2.5 Ghép nối vi điều khiển với các ngoại vi
Ghép nối và hiển thị với LED 7 thanh và LCD
Q4 A1015
LED2
Q2 A1015
Q3 A1015
XTAL1
PSEN ALE/PROG EA/VPP
P1.0 P1.2 P1.4 P1.6
P2.0/A8 P2.2/A10 P2.4/A12 P2.6/A14 P3.0/RXD P3.1/TXD P3.2/INT0 P3.4/T0 P3.6/WR P3.7/RD
P0.0/AD0 P0.2/AD2 P0.4/AD4 P0.6/AD6
C133p
LED4
C3 10uF VCC
R1 10K
LED4
LED_C
SW1 RESET
Y1
11.0952
LED_F
R5 100 VCC
LED3
LED_B
LED1 LED3
VCC
LED1
RN1 1501 3 5 7 9 10 12 14 16
LED_DOT
LED7G1.2 DIPSOC-9x2/SM
11 7 2 10 5
LED_G
LED2
Q1 A1015
LED_E
Trang 28char nghin,tram, chuc, donvi;
static unsigned char LED7SEG[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //LED 7 thanh
Trang 29a++;
if (a>=4) a = 0;
}
Ghép nối LCD:
Trang 30void delay_ms(unsigned int Time);
void delay_us(unsigned int Time);
Trang 31void lcd1602_enable(void);
void lcd1602_send_4bit_data ( unsigned char cX );
void lcd1602_send_command (unsigned char cX );
void lcd1602_init (void );
void lcd1602_gotoxy(unsigned char x, unsigned char y);
void lcd1602_clear(void);
void lcd1602_putchar ( unsigned int cX );
void lcd1602_puts (char *s);
//Cac ham che do LED don
void chedo1 (void);
void chedo2 (void);
void chedo3 (void);
void chedo4 (void);
//Khai bao cac bien toan cuc
char Lcd_Buff[20];//cho LCD
int dem=0;
static unsigned char so[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //LED 7 thanh
//Khai bao ham phuc vu ngat ngoai INT0
void ngatINT0(void) interrupt 0
//Khai bao ngat INT0
EA=1;//Cho phep ngat toan cuc
EX0=1;//Cho phep nhat INT0 chan 3.2
IT0=1;//Cho phap INT0 ngat theo suon xuong
Trang 32if(dem==2) chedo2(); if(dem==3) chedo3(); if(dem==4) chedo4(); }
}
void delay_ms(unsigned int Time)
Trang 33void lcd1602_send_4bit_data ( unsigned char cX )
// Ham Gui 1 Lenh Cho LCD
void lcd1602_send_command (unsigned char cX )
// Ham Khoi Tao LCD
void lcd1602_init ( void )
// che do gui lenh
lcd1602_send_4bit_data ( 0x03 ); // ket noi 8 bit
phep hien thi man hinh
khung hinh
lcd1602_send_command( CLEAR_LCD ); // xoa toan bo khung hinh
}
Trang 34// -
// Ham Thiet Lap Vi Tri Con Tro
void lcd1602_gotoxy(unsigned char x, unsigned char y) {
unsigned char address;
}
// -
// Ham Gui 1 Ky Tu Len LCD
void lcd1602_putchar ( unsigned int cX )
Trang 35Chương 3: Đo lường và điều khiển với 8051
3.1 Đo tốc độ, vị trí và lưu lượng sử dụng Encoder
- Đo tốc độ
- Xác định vị trí, khoảng cách
- Đo lưu lượng
3.2 Đo lường và điều khiển sử dụng bộ chuyển đổi tương tự - số (ADC) và số - tương
tự (DAC)
- Ghép nối ADC0804
/CS: chọn chíp
/RD: đọc data
/WR: bắt đầu biến đổi
/INTR: thông báo hoàn thành
quá trình chuyển đổi
DGND: đất của digital
AGND: đất của analog
Vin+, Vin-: đầu vào analog
V+: nguồn cấp +5V
CLKR, CLKIN: xung nhịp
DB0-DB7: Data
Trang 36-
- Thực hiện bài toán đo và hiển thị nhiệt độ sử dụng cảm biến LM 35