LẬP TRÌNH VI ĐIỀU KHIỂN MCS51
MỤC ĐÍCH – YÊU CẦU
- Lập trình điều khiển từng Port, từng chân (pin) của vi điều khiển
- Sử dụng lệnh: gán, dịch, và lập trình mảng
- Điều khiển được từng Port, từng pin vi điều khiển
- Sử dụng thành thạo các phép toán gán, dịch, tạo và truy xuất mảng.
CƠ SỞ LÝ THUYẾT
Sơ đồ nguyên lý và hình bố trí linh kiện của 32 con LED đơn trên KIT MC-1000
- 32 LED đơn chia làm 4 nhóm, mổi nhóm 8 led Cực Katode của led nối xuống mass cực Anod được nối ra các Pin Header thông qua điện trở 330Ω
- Led sáng: Mức logic tích cực là 1 (5volt), led tắt: mức logic 0 (0volt)
Thực tế, tùy thuộc cách mắc LED mà mức logic tích cực có thể 0 hoặc 1
TRÌNH TỰ THỰC HIỆN
3.1 Yêu cầu đặt ra: Điều khiển 8 led sáng dần từ phải qua trái Với thời gian dịch chuyển là 0,5 giây
Kết nối trên KIT: Dùng Jump bẹ 8 nối PORT2 với 8 LED đơn
Mạch thực tế trên KIT
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
3.3 Giải thuật và viết chương trình
Cách 1: Dùng phương pháp gán giá trị trực tiếp
Cấu trúc: P2 = 0b00000011; hoặc P2 = 3; hoặc P2 = 0x03; void main() { while(1) { p2=0; delay_ms(500); p200000001; delay_ms(500); p200000011; delay_ms(500); p200000111; delay_ms(500); p200001111; delay_ms(500); p200011111; delay_ms(500); p200111111; delay_ms(500); p201111111; delay_ms(500); p211111111; delay_ms(500); }}
Tắc hết led Sáng LED 1 Sáng LED 2 Sáng LED 3 Sáng LED 4 Sáng LED 5 Sáng LED 6 Sáng LED 7 Sáng LED 8
Cách 2: Dùng lệnh dịch trái
Khoa Điện – Điện tử 9 char i; void main() { while(1) { p2=0; for(i=0;i Lcd.mcp51
Lcd_Init(): Khởi tạo LCD chế độ 4 bit 2 dòng
Lcd_Out(a,b,“chuoi ki tu”): Hiển thị một chuỗi kí tự ở vị ở hàng a, cột b
Lcd_Out_CP(“chuoi ki tu”): Hiển thị chuỗi kí tự tại vị trí con trỏ
Lcd_Chr(a,b,‘ki tu’): Hiển thị kí tự ở hàng a, cột b
Lcd_Chr_CP(‘ki tu’): Hiển thị kí tự tại vị trí con trỏ
Lcd_Cmd(Lệnh): Ghi lệnh vào LCD
_LCD_CLEAR: Xóa màn hình
_LCD_RETURN_HOME: Đưa con trỏ về đầu dòng
_LCD_CURSOR_OFF: Tắt con trỏ
_LCD_UNDERLINE_ON: Hiển thị con trỏ gạch chân
_LCD_BLINK_CURSOR_ON: Hiển thị con trỏ chớp tắt
_LCD_MOVE_CURSOR_LEFT: Di chuyển con trỏ qua trái
_LCD_MOVE_CURSOR_RIGHT: Di chuyển con trỏ qua phải
_LCD_TURN_ON: Bật hiển thị LCD
_LCD_TURN_OFF: Tắt hiển thị LCD
_LCD_SHIFT_LEFT: Toàn bộ dữ liệu trên màn hình dịch trái
_LCD_SHIFT_RIGHT: Toàn bộ dữ liệu trên màn hình dịch phải
The Khoa Điện – Điện tử 38 project utilizes an LCD interface with specific pin configurations: LCD_RS is connected to P2_5, LCD_RW to P2_6, and LCD_EN to P2_7 Additionally, the data pins are set as follows: LCD_D4 at P3_4, LCD_D5 at P3_5, LCD_D6 at P3_6, and LCD_D7 at P3_7 The program's main function begins with the void main() declaration.
Lcd_Init(); // khoi tao LCD
Lcd_Cmd(_LCD_CLEAR); // xoa man hinh
Lcd_Cmd(_LCD_CURSOR_OFF); // bat hien thi, tat con tro
Lcd_Out(1,1,"DHSPKT VINH LONG");// xuat "DHSPKT VINH LONG" o hanng 1, cot
Lcd_Out(2,3,"Hello World");// xuat "HELLO WORLD" o hang 2, cot 3 while(1) { // vong lap vo han
Lưu ý: khi mô phỏng đối với code này thì cần chỉ kết nối 4 chân dữ liệu từ D4 đến D7
3.4 Mô phỏng mạch điện và đoạn code trên
3.5 Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế
3.7 Thay đổi thời gian trễ (delay_ms) đưa ra nhận xét:
- Khi tăng thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ lớn nhất là bao nhiêu để khắc phục hiện tượng đó?
- Khi giảm thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ nhỏ nhất là bao nhiêu để khắc phục hiện tượng đó?
- Xác định thời gian trể hợp lý nhất để LCD sáng rõ nhất?
4.1 Hiển thị một chuỗi kí tự bất kì đầu dòng 2
4.2 Hiển thị và dịch phải “Dai hoc SPKT Vinh Long” đầu dòng 1 cách nhau 500ms Sau đó dịch lên dòng 2, rồi dịch trái về dòng 1
4.3 Kết hợp với nút ấn hiển thị số lần ấn nút lên LCD
Bài thực hành số 9: LẬP TRÌNH ĐẾM SẢN PHẨM
- Lập trình đếm sản phẩm dùng bộ đếm (Counter) với 8051
- Lập trình đếm sản phẩm dùng ngắt ngoài với 8051
- Lập trình Counter đếm sản phẩm từ 00 đến 59 dùng vi điều khiển 8051
- Lập trình ngắt ngoài đếm sản phẩm từ 00 đến 59 dùng vi điều khiển 8051
- Thiết kế được phần cứng giữa vi điều khiển với LED 7 đoạn 2 số và module thu - phát hồng ngoại
Sơ đồ nguyên lý của module hồng ngoại:
- Sản phẩm sẽ đi qua giữa LED phát D1 và LED thu D2 - Lúc không có sản phẩm, LED
D2 nhận được tín hiệu từ LED phát D1 => D2 dẫn => V- = +5V, V+ < +5V ngõ ra của Opamp U1 là V0=0V => Q1 ngưng dẫn => OUT =1
- Lúc có sản phẩm, LED D2 không nhận được tín hiệu từ D1 => D2 ngưng dẫn => V-
- Lập trình Counter đếm sản phẩm từ 00 => 59 hiện thị lên LED 7 đoạn
- Lập trình ngắt ngoài đếm sản phẩm từ 00 => 59 hiện thị lên LED 7 đoạn
+ Kết nối trên KIT thực hành
- Kết nối ngõ ra của module hồng ngoại với chân P3.2 (INT0) của vi điều khiển
- Kết nối ngõ ra của module hồng ngoại với chân P3.4 (T0) của vi điều khiển
- Dùng jump bẹ 8 nối PORT 0 của vi điều khiển với LED 7 đoạn 2 số
4 Lưu đồ giải thuật và chương trình
Cách 1: Dùng bộ đếm (Counter)
#define out P0 sbit led1 at P2_1_bit; sbit led2 at P2_0_bit; char mang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //mang du lieu ma LED 7 doan tu 0 den 9 void hienThi(unsigned char n)
// tach so hang chuc va hang don vi chuc = n/10; dvi= n%10;
//hien thi so hang chuc roi tat out = mang[chuc]; led2 = 0; delay_ms(1); led2 = 1;
//hien thi so hang don vi roi tat out = mang[dvi]; led1 = 0;
Khoa Điện – Điện tử 42 delay_ms(1); led1 = 1;
TMOD &= 0xF0;//xoa cac bit dieu khien thanh ghi TMOD cua counter T0
TMOD |= 0x06;//khoi tao counter 0 mode 2 tu dong nap lai
TR0_bit = 1; //cho phep dem xung while(1)
{ if(TL0>59)TL0=0;//TL0 tang tu 0 den 59 hienThi(TL0); //hien thi so san pham
The article defines specific bit variables for controlling LEDs and input on a microcontroller, with `led1` and `led2` assigned to particular bits on port P2, and an input defined on port P3 Additionally, it initializes an unsigned character variable `dem` and creates an array `mang` containing hexadecimal values that represent the data for a 7-segment display, corresponding to numbers 0 through 9.
//chuong trinh hien thi void hienThi(unsigned char n){ unsigned char i, chuc, dvi;
// tach so hang chuc va hang don vi chuc = n/10; dvi= n%10;
//hien thi so hang chuc roi tat out = mang[chuc]; led2 = 0; delay_ms(1); led2 = 1;
//hien thi so hang don vi roi tat out = mang[dvi]; led1 = 0; delay_ms(1); led1 = 1;
//chuong trinh khoi tao void khoitao(){ out = 1; //khoi tao ma quet in = 1; //khoi tao chan ngat
IT0_bit = 1; //bat che do ngat xung canh xuong
EX0_bit = 1; //cho phep ngat ngoai 0
EA_bit = 1; //cho phep ngat toan cuc
//chuong trinh ngat void ngatdem() iv IVT_ADDR_EX0{ dem++;// tang so dem
} void main(){ khoitao(); //ham khoi tao while(1){ //vong lap vo han if(dem>59)dem=0; // dem tang tu 0 den 59 hienThi(dem); //ham hien thi
3.4 Mô phỏng mạch điện và đoạn code trên
3.5 Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế
3.7 Thay đổi thời gian delay_ms, quan sát, nhận xét
5.1 Thực hiện lại yêu cầu trên hệ thống sẽ trả số lượng sản phẩm về 0 nếu sản phẩm đủ 90 5.2 Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 500 sản phẩm
5.3 Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 1500 sản phẩm
5.4 Thực hiện lai 5.3 đếm đến 1234 rồi dừng lại
Bài thực hành số 10: LẬP TRÌNH ĐỒNG HỒ SỐ HIỂN THỊ LED 7 ĐOẠN
- Sử dụng phương pháp quét điều khiển 6 LED 7 đoạn
- Kết nối sơ đồ mạch giữa vi điều khiển với LED 7 đoạn
- Lập trình hiển thị được giờ, phút, giây lên LED 7 đoạn bằng phương pháp quét
Xem lại lý thuyết bài lập trình điều khiển LED 7 đoạn
3.1 Yêu cầu đặt ra: Điều khiển 6 LED 7 đoạn hiển thị giờ, phút, giây
+ Kết nối trên KIT thực hành:
Dùng 2 Jump bẹ 8 nối PORT0 với DATA và PORT2 với SCAN của LED 7 đoạn
3.3 Giải thuật và chương trình:
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
//khai bao chan sbit ledgiochuc at P2_0_bit; sbit ledgiodonvi at P2_1_bit; sbit ledphutchuc at P2_3_bit; sbit ledphutdonvi at P2_4_bit; sbit ledgiaychuc at P2_6_bit; sbit ledgiaydonvi at P2_7_bit;
#define data P0 //dat port 0 = data char so1[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma 7 doan
The function `hienthi` is designed to display time in hours, minutes, and seconds It takes unsigned char parameters for hours, minutes, and seconds, along with an unsigned int for time The function calculates the time delay by dividing the input time by three It extracts the tens and units for hours, minutes, and seconds using division and modulus operations A loop is implemented to create a delay based on the calculated time.
//quet so chuc ledgiochuc = 0; data = so1[giochuc]; delay_us(500); ledgiochuc = 1;
//quet don vi ledgiodonvi = 0; data = so1[giodonvi]; delay_us(500); ledgiodonvi = 1;
//quet so chuc ledphutchuc = 0; data = so1[phutchuc]; delay_us(500); ledphutchuc = 1;
//quet don vi ledphutdonvi = 0; data = so1[phutdonvi]; delay_us(500); ledphutdonvi = 1;
//quet so chuc ledgiaychuc = 0; data = so1[giaychuc]; delay_us(500); ledgiaychuc = 1;
//quet don vi ledgiaydonvi = 0; data = so1[giaydonvi]; delay_us(500); ledgiaydonvi = 1;
} void main() { unsigned char giay=0, phut=0,gio=0;//khoi tao gia tri ban dau while(1){//vong lap vo han if(giay>59){//giay tu 0 den 59 phut++;//tang phut giay=0;
} if(phut>59){//phut tu 0 den 59 gio++;//tang gio phut=0;
} if(gio>23)gio=0;//gio tu 0 den 23 hienthi(gio, phut, giay, 1000);//ham hien thi giay++;//tang giay
3.4 Mô phỏng mạch điện và đoạn code trên
3.5 Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế
3.7 Thay đoạn chương trình sau vào vòng lặp while và nhận xét giay++;//tang giay if(giay>59){//giay tu 0 den 59 phut++;//tang phut giay=0;
} if(phut>59){//phut tu 0 den 59
Khoa Điện – Điện tử 48 gio++;//tang gio phut=0;
} if(gio>23)gio=0;//gio tu 0 den 23 hienthi(gio, phut, giay, 1000);//ham hien thi
3.8 Thay đổi thời gian trễ (delay_ms) đưa ra nhận xét:
- Khi tăng thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ lớn nhất là bao nhiêu để khắc phục hiện tượng đó?
- Khi giảm thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ nhỏ nhất là bao nhiêu để khắc phục hiện tượng đó?
- Xác định thời gian trể hợp lý nhất để LED 7 đoạn sáng rõ nhất?
4.1 Thực hiện lại bài tập trên với chương trình đếm lùi
4.2 Kết nối với nút ấn để điều chỉnh thời gian, đếm xuôi hoặc ngược
4.3 Thực hiện lại bài tập 4.2 viêt chương trình hẹn giờ (chuông báo động)
Bài thực hành số 11: LẬP TRÌNH ĐO LƯỜNG VÀ HIỂN THỊ NHIỆT ĐỘ LÊN LCD
- Tìm hiểu IC cảm biến nhiệt độ LM35
- Tìm hiểu IC chuyển đổi tương tự - số ADC0804
- Tìm hiểu LCD1602 (8bit, 2 dòng ký tự)
- Lập trình hiển thị chuỗi ký tự lên LCD
- Thiết kế được phần cứng giao tiếp IC cảm biến nhiệt LM35 với IC chuyển đổi tương tự- số ADC0804
- Thiết kế được phần cứng giao tiếp với LCD1602 (8bit, 2 dòng ký tự)
- Lập trình đo lường hiển thị được nhiệt độ lên LCD
2.1 LCD1602:(xem lại bài Lập trình hiển thị LCD)
2.2 Cảm biến nhiệt độ LM35:
IC LM35 là một cảm biến nhiệt tuyến tính, với ngõ ra được tính theo công thức V0 = 10 * t (mV), trong đó t là nhiệt độ đo được tính bằng độ C Sơ đồ chân của IC cũng rất quan trọng để kết nối và sử dụng hiệu quả.
2.3.IC chuyển đổi tương tự - số ADC0804:
IC ADC0804 là IC chuyển đổi tín hiệu tương tự sang số công nghệ CMOS 8 bit
Khoa Điện – Điện tử 51 Ý nghĩa các chân được chia thành các nhóm sau:
- Nhóm điều khiển dùng để kết nối với vi điều khiển:
Chân 1: CS (Chip Select) chân chọn chip Nếu CS=1 sẽ khóa IC, nếu CS=0 sẽ cho phép
Chân 2: RD (Read) Nếu RD=1 sẽ khóa ngõ ra của IC (ngõ ra tổng trở cao), nếu RD=0 sẽ cho phép mở cổng ngõ ra
Chân 3: WR (Write) có tác dụng chốt dữ liệu Khi có xung cạnh lên tác động lên chân
WR thì IC cho phép xuất 8 bit, bình thường thì chốt dữ liệu ngõ ra
Lập trình Arduino
Mục đích
- Kết nối được LED với chân digital của Arduino
- Lập trình điều khiển bật tắt LED dùng chân digital của Arduino
- Sử dụng lệnh nhập xuất digital
Yêu cầu
- Điều khiển nhập xuất được các chân digital của Arduino
- Biết sử dụng được lệnh digital để điều khiển LED
Lưu đồ giải thuật và chương trình
Cách 1: Dùng bộ đếm (Counter)
#define out P0 sbit led1 at P2_1_bit; sbit led2 at P2_0_bit; char mang[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //mang du lieu ma LED 7 doan tu 0 den 9 void hienThi(unsigned char n)
// tach so hang chuc va hang don vi chuc = n/10; dvi= n%10;
//hien thi so hang chuc roi tat out = mang[chuc]; led2 = 0; delay_ms(1); led2 = 1;
//hien thi so hang don vi roi tat out = mang[dvi]; led1 = 0;
Khoa Điện – Điện tử 42 delay_ms(1); led1 = 1;
TMOD &= 0xF0;//xoa cac bit dieu khien thanh ghi TMOD cua counter T0
TMOD |= 0x06;//khoi tao counter 0 mode 2 tu dong nap lai
TR0_bit = 1; //cho phep dem xung while(1)
{ if(TL0>59)TL0=0;//TL0 tang tu 0 den 59 hienThi(TL0); //hien thi so san pham
The code defines specific bits for controlling two LEDs (led1 and led2) and an input signal, using the P2 and P3 ports An unsigned character variable named 'dem' is initialized to zero, while an array 'mang' containing hexadecimal values represents the data for a 7-segment display, corresponding to the digits 0 through 9.
//chuong trinh hien thi void hienThi(unsigned char n){ unsigned char i, chuc, dvi;
// tach so hang chuc va hang don vi chuc = n/10; dvi= n%10;
//hien thi so hang chuc roi tat out = mang[chuc]; led2 = 0; delay_ms(1); led2 = 1;
//hien thi so hang don vi roi tat out = mang[dvi]; led1 = 0; delay_ms(1); led1 = 1;
//chuong trinh khoi tao void khoitao(){ out = 1; //khoi tao ma quet in = 1; //khoi tao chan ngat
IT0_bit = 1; //bat che do ngat xung canh xuong
EX0_bit = 1; //cho phep ngat ngoai 0
EA_bit = 1; //cho phep ngat toan cuc
//chuong trinh ngat void ngatdem() iv IVT_ADDR_EX0{ dem++;// tang so dem
} void main(){ khoitao(); //ham khoi tao while(1){ //vong lap vo han if(dem>59)dem=0; // dem tang tu 0 den 59 hienThi(dem); //ham hien thi
3.4 Mô phỏng mạch điện và đoạn code trên
3.5 Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế
3.7 Thay đổi thời gian delay_ms, quan sát, nhận xét.
Bài tập
5.1 Thực hiện lại yêu cầu trên hệ thống sẽ trả số lượng sản phẩm về 0 nếu sản phẩm đủ 90 5.2 Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 500 sản phẩm
5.3 Lập trình lại hệ thống với số lượng sản phẩm cần đếm là 1500 sản phẩm
5.4 Thực hiện lai 5.3 đếm đến 1234 rồi dừng lại
Bài thực hành số 10: LẬP TRÌNH ĐỒNG HỒ SỐ HIỂN THỊ LED 7 ĐOẠN
- Sử dụng phương pháp quét điều khiển 6 LED 7 đoạn
- Kết nối sơ đồ mạch giữa vi điều khiển với LED 7 đoạn
- Lập trình hiển thị được giờ, phút, giây lên LED 7 đoạn bằng phương pháp quét
Xem lại lý thuyết bài lập trình điều khiển LED 7 đoạn
3.1 Yêu cầu đặt ra: Điều khiển 6 LED 7 đoạn hiển thị giờ, phút, giây
+ Kết nối trên KIT thực hành:
Dùng 2 Jump bẹ 8 nối PORT0 với DATA và PORT2 với SCAN của LED 7 đoạn
3.3 Giải thuật và chương trình:
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
//khai bao chan sbit ledgiochuc at P2_0_bit; sbit ledgiodonvi at P2_1_bit; sbit ledphutchuc at P2_3_bit; sbit ledphutdonvi at P2_4_bit; sbit ledgiaychuc at P2_6_bit; sbit ledgiaydonvi at P2_7_bit;
#define data P0 //dat port 0 = data char so1[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma 7 doan
The function `hienthi` is designed to display time in hours, minutes, and seconds, taking into account a delay specified by the `time` parameter It calculates the tens and units for hours, minutes, and seconds by performing division and modulus operations The `time` variable is adjusted by dividing it by 3 to create a delay effect A loop iterates for the calculated delay, allowing for the implementation of a timed display of the given time values.
//quet so chuc ledgiochuc = 0; data = so1[giochuc]; delay_us(500); ledgiochuc = 1;
//quet don vi ledgiodonvi = 0; data = so1[giodonvi]; delay_us(500); ledgiodonvi = 1;
//quet so chuc ledphutchuc = 0; data = so1[phutchuc]; delay_us(500); ledphutchuc = 1;
//quet don vi ledphutdonvi = 0; data = so1[phutdonvi]; delay_us(500); ledphutdonvi = 1;
//quet so chuc ledgiaychuc = 0; data = so1[giaychuc]; delay_us(500); ledgiaychuc = 1;
//quet don vi ledgiaydonvi = 0; data = so1[giaydonvi]; delay_us(500); ledgiaydonvi = 1;
} void main() { unsigned char giay=0, phut=0,gio=0;//khoi tao gia tri ban dau while(1){//vong lap vo han if(giay>59){//giay tu 0 den 59 phut++;//tang phut giay=0;
} if(phut>59){//phut tu 0 den 59 gio++;//tang gio phut=0;
} if(gio>23)gio=0;//gio tu 0 den 23 hienthi(gio, phut, giay, 1000);//ham hien thi giay++;//tang giay
3.4 Mô phỏng mạch điện và đoạn code trên
3.5 Dùng mạch nạp để nạp đoạn code trên máy tính vào vi điều khiển
3.6 Gắn vi điều khiển vào KIT, cấp nguồn chạy thực tế
3.7 Thay đoạn chương trình sau vào vòng lặp while và nhận xét giay++;//tang giay if(giay>59){//giay tu 0 den 59 phut++;//tang phut giay=0;
} if(phut>59){//phut tu 0 den 59
Khoa Điện – Điện tử 48 gio++;//tang gio phut=0;
} if(gio>23)gio=0;//gio tu 0 den 23 hienthi(gio, phut, giay, 1000);//ham hien thi
3.8 Thay đổi thời gian trễ (delay_ms) đưa ra nhận xét:
- Khi tăng thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ lớn nhất là bao nhiêu để khắc phục hiện tượng đó?
- Khi giảm thời gian trễ thì hiện tượng gì xảy ra? Vậy thời gian trễ nhỏ nhất là bao nhiêu để khắc phục hiện tượng đó?
- Xác định thời gian trể hợp lý nhất để LED 7 đoạn sáng rõ nhất?
4.1 Thực hiện lại bài tập trên với chương trình đếm lùi
4.2 Kết nối với nút ấn để điều chỉnh thời gian, đếm xuôi hoặc ngược
4.3 Thực hiện lại bài tập 4.2 viêt chương trình hẹn giờ (chuông báo động)
Bài thực hành số 11: LẬP TRÌNH ĐO LƯỜNG VÀ HIỂN THỊ NHIỆT ĐỘ LÊN LCD
- Tìm hiểu IC cảm biến nhiệt độ LM35
- Tìm hiểu IC chuyển đổi tương tự - số ADC0804
- Tìm hiểu LCD1602 (8bit, 2 dòng ký tự)
- Lập trình hiển thị chuỗi ký tự lên LCD
- Thiết kế được phần cứng giao tiếp IC cảm biến nhiệt LM35 với IC chuyển đổi tương tự- số ADC0804
- Thiết kế được phần cứng giao tiếp với LCD1602 (8bit, 2 dòng ký tự)
- Lập trình đo lường hiển thị được nhiệt độ lên LCD
2.1 LCD1602:(xem lại bài Lập trình hiển thị LCD)
2.2 Cảm biến nhiệt độ LM35:
IC LM35 là một cảm biến nhiệt tuyến tính, với ngõ ra được tính theo công thức V0 = 10 * t (mV), trong đó t là nhiệt độ đo được tính bằng độ C.
2.3.IC chuyển đổi tương tự - số ADC0804:
IC ADC0804 là IC chuyển đổi tín hiệu tương tự sang số công nghệ CMOS 8 bit
Khoa Điện – Điện tử 51 Ý nghĩa các chân được chia thành các nhóm sau:
- Nhóm điều khiển dùng để kết nối với vi điều khiển:
Chân 1: CS (Chip Select) chân chọn chip Nếu CS=1 sẽ khóa IC, nếu CS=0 sẽ cho phép
Chân 2: RD (Read) Nếu RD=1 sẽ khóa ngõ ra của IC (ngõ ra tổng trở cao), nếu RD=0 sẽ cho phép mở cổng ngõ ra
Chân 3: WR (Write) có tác dụng chốt dữ liệu Khi có xung cạnh lên tác động lên chân
WR thì IC cho phép xuất 8 bit, bình thường thì chốt dữ liệu ngõ ra
Chân 5: INTR (Interrupt) có tác dụng báo cho vi điều khiển biết IC đã thực hiện chuyển đổi xong, chờ vi điều khiển đọc dữ liệu 8 bit ngõ ra của IC ADC0804
- Nhóm các ngõ ra: bao gồm các chân từ 18 đến 11 tương ứng các bit 0 đến bit 7
Chân 9: VREF/2 là chân cấp điện áp tham chiếu quyết định độ phân giải 8 bit nhị phân ngõ ra
Từ hình trên ta có:
Mã nhị phân ngõ ra = (áp vào * 256 / VREF) /2
Chân 8: AGND là chân đồng bộ GND với tín hiệu tương tự cần chuyển đổi
Nhóm chân dao động của IC ADC0804 bao gồm chân 4 và chân 19, cho phép kết nối tụ điện và điện trở để lấy xung clock nội Ngoài ra, người dùng cũng có thể cung cấp xung clock bên ngoài qua chân 19.
Chân 6: VIN(+) ngõ vào không đảo của mạch so sánh
Chân 7: VIN(-) ngõ vào đảo của mạch so sánh
Nguyên lý hoạt động của IC ADC0804 được chia thành 2 giai đoạn:
Giai đoạn IC 0804 đọc giá trị tương tự vào và thực hiện chuyển đổi:
Giai đoạn xuất dữ liệu ra ngõ ra của IC ADC0804:
Sơ đồ nguyên lý của module IC ADC0804 trên KIT thực hành:
3.1 Yêu cầu đặt ra: Lập trình đo lường và hiển thị nhiệt độ lên LCD
+ Sơ đồ kết nối trên KIT:
- Kết nối ADC0804: Tương tự như bài 28.1
- Kết nối LCD như sau:
+ Dùng Jump bẹ 4 nối 3 bit cao ngõ ra PORT2 với 3 chân E, RW, RS của LCD + Dùng Jump bẹ 8 nối ngõ vào PORT3 với DATA của LCD
Giải thuật chương trình chính
Chờ ADC0804 chuyển đổi Đọc giá trị số từ ADC0804 vào vi điều khiển
Tính toán và lưu vào vi điều khiển
Giải thuật hiển thị lên LCD
- Tạo dữ liệu cần hiển thị
- Đưa con trỏ về dòng 1
Hiển thị nhiệt độ Đủ 10 kí tự
#define out P3 sbit E at P2_7_bit;
Gửi mã lệnh ra LCD
Tạo xung cạnh xuống cho phép thực thi
Gửi dữ liệu ra LCD
Chọn thanh ghi dữ liệu
Tạo xung cạnh xuống cho phép thực thi
Giải thuật ghi lệnh vào LCD Giải thuật ghi dữ liệu vào LCD
Khoa Điện – Điện tử 57 sbit RW at P2_6_bit; sbit RS at P2_5_bit;
#define in P0 sbit CS at P1_0_bit; sbit RD at P1_1_bit; sbit WR at P1_2_bit; sbit INT at P1_3_bit; unsigned char adc;
//chuong trinh thuc hien lenh void LCD_Lenh(unsigned char cmd){
RS = 0; //chan RS muc thap de ghi lenh out = cmd; //xuat ma lenh
E = 0; //tao xung canh xuong o chan E
//tao tre de thuc hien lenh if(cmd