BÀI TẬP HỆ THỐNG NHÚNG Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với LCD. Cho số A=0 viết chương trình hiển thị số A lên LCD, tăng A một đơn vị sau mỗi chu kỳ 500ms, khi A=20 thì hiện tên sinh viên lên LCD và reset A=0.
Trang 1Tài liệu đính kèm file code KeilC và mô phỏng proteus
1.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình thực hiện các nhiệm vụ sau: a Hiển thị số 8 lên LED 7 thanh được nối và cổng P3 (dùng LED 7 thanh anot chung); b Hiển thị đếm tăng dần từ 0 đến 9 sau mỗi 800ms
2.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình thực hiện các nhiệm vụ sau: a Cấu hình ngắt ngoài INT1 ở chế độ ngắt sườn
xuống; b Đếm số lần nút bấm nút được nối vào chân INT1, hiển thị kết quả lên LED 7 thanh nối vào cổng P2 (nếu số lần bấm bằng 10 thì quay về 0)
3 Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình thực hiện các nhiệm vụ sau: a Hiển thị số 1 lên LED 7 thanh nối vào cổng P3; b Tăng số đếm sau mỗi 800ms, nếu số đếm bằng 5 thì dừng lại
4 Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình thực hiện các nhiệm vụ sau: a Cấu hình ngắt ngoài INT0 ở chế độ ngắt sườn
xuống; b Đếm số lần nút bấm nút nối vào chân INT0 được bấm, hiển thị kết quả lên LED 7 thanh nối vào cổng P0 (nếu số lần bấm bằng 7 thì quay về 0)
5 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus cho 3 nút bấmB1, B2, B3 lần lượt nối vào các chân P2.0, P2.1, P2.2 và 3 Led L1, L2, L3 lần lượtnối vào các chân P0.0, P0.1, P0.2 Lập trình chức năng sau: bấm B1 sẽ đảo trạng thái Led L1, bấm B2 sẽ đảo trạng thái Led L2, bấm B3 sẽ đảo trạng thái Led L3 6.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với LCD Sử dụng ngắt ngoài chân INT1 đếm số lần thay đổi trạng thái của một nút bấm gắn vào nó Hiển thị số lần bấm nút lên LCD, khi số lần bấm đạt 9 lần thì hiểnthị trên LCD “Return to 0” sau đó reset số lần đếm về 0 và lặp lại quá trình trên 7.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ cho nút bấm B1 nối vào các P1.0 và 8 Led L1, L2, L3, L4, L5, L6, L7, L8 lần lượt nối vào các chân của PORT P0 Vẽ sơ
đồ mô phỏng trên Proteus và lập trình chức năng sau: bấm giữ B1 sẽ sáng nhấp nháy các Led từ L1 đến L8 với khoảng thời gian 1 giây
8 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus sử dụng ngắt ngoài chân INT0 đếm số lần thay đổi trạng thái của một nút bấm gắn vào nó Hiển thị số lần bấm nút lên UART, khi số lần bấm đạt 9 lần thì hiển thị trên UART “Họ tên SV” sau đó reset số lần đếm về 0 2
Trang 29.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus kết nối theo thứ tự 8 Led L1 đến L8 vào 8 chân của PORT P0 Lập trình hiệu ứng các Led sáng lần lượt từ L1 đến L8 với thời gian trễ cho mỗi hiệu ứng là 1s, sau đó tắt tất cả các Led và lặp lại hiệu ứng sáng lần lượt
10.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với LCD theo chế độ 4bit, hiển thị họ tên, mã số sinh viên lên LCD
11.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng Led L1 kết nối đến chân P1.1, lập trình nhấp nháy Led L1 với chu kỳ 500ms sử dụng timer 0 chế độ 16 bit 12.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với LCD Cho số A=0 viết chương trình hiển thị số A lên LCD, tăng A một đơn vị sau mỗi chu kỳ 500ms, khi A=20 thì hiện tên sinh viên lên LCD và reset A=0
13 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus, lập trình hiển thị ký tự “PROTEUS” qua chuẩn truyền thông UART;
14.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ, viết chương trình tạo hiệu ứng nhấp nháy 2 Led nối đến chân P1.1, P1.2 tuần tự với chu kỳ 800ms
Bài làm
1.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình thực hiện các nhiệm vụ sau: a Hiển thị số 8 lên LED 7 thanh được nối và cổng P3 (dùng LED 7 thanh anot chung); b Hiển thị đếm tăng dần từ 0 đến 9 sau mỗi 800ms
Trang 6EA = 1; // Cho phép các ngat toàn cuc
EX0 = 1; // Cho phép ngat ngoài INT0 chan 3.2
IT0 = 1; // Chon che do ngat suon xuong
Trang 75 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus cho 3 nút bấm B1, B2, B3 lần lượt nối vào các chân P2.0, P2.1, P2.2 và 3 Led L1, L2, L3lần lượt nối vào các chân P0.0, P0.1, P0.2 Lập trình chức năng sau: bấm B1 sẽ đảo trạng thái Led L1, bấm B2 sẽ đảo trạng thái Led L2, bấm B3 sẽ đảo trạng thái Led L3
Trang 8#include <reg52.h> // Thu vien cho AT89C52
#define LCD_data P2 // Dinh nghia cong du lieu LCD la P2
sbit RS = P3^0; // Dinh nghia chan RS cua LCD
sbit RW = P3^1; // Dinh nghia chan RW cua LCD
sbit EN = P3^2; // Dinh nghia chan EN cua LCD
sbit BT = P3^3; // Dinh nghia chan INT1 cho nut nhan
unsigned char count = 0; // Bien dem so lan nhan nut
void delay(int time)
LCD_data = cmd; // Gan lenh vao cong du lieu LCD
RS = 0; // Che do gui lenh
RW = 0; // Che do ghi
EN = 1; // Bat dau gui lenh
delay(1);
Trang 9EN = 0; // Ket thuc gui lenh
delay(1);
}
void LCD_init() // Ham khoi tao LCD
{
LCD_cmd(0x38); // Che do 8 bit, 2 dong, 5x7
LCD_cmd(0x0E); // Hien thi man hinh, con tro, khong nhap nhay
LCD_cmd(0x01); // Xoa man hinh
LCD_cmd(0x80); // Di chuyen con tro den vi tri ban dau
}
void LCD_char(unsigned char dataa) // Ham gui ky tu den LCD
{
LCD_data = dataa; // Gan ky tu vao cong du lieu LCD
RS = 1; // Che do gui du lieu
while (*str) // Trong khi chuoi chua ket thuc
LCD_char(*str++); // Gui ky tu tiep theo
}
void BT_ISR() interrupt 2 // Trinh phuc vu ngat INT1
{
count++; // Tang bien dem
if (count > 9) // Neu so lan nhan nut dat 9
{
LCD_cmd(0x01); // Xoa man hinh
delay(1000);
LCD_string("Return to 0"); // Hien thi "Return to 0"
count = 0; // Dat lai bien dem
}
else // Neu so lan nhan nut chua dat 9
Trang 10LCD_init(); // Khoi tao LCD
IT1 = 1; // Cai dat ngat ngoai INT1 o che do ngat canh xuong
EX1 = 1; // Kich hoat ngat ngoai INT1
EA = 1; // Kich hoat ngat toan cuc
while (1); // Vong lap vo han
}
7.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ cho nút bấm B1 nối vào các P1.0
và 8 Led L1, L2, L3, L4, L5, L6, L7, L8 lần lượt nối vào các chân của PORT P0 Vẽ sơ đồ mô phỏng trên Proteus và lập trình chức năng sau: bấm giữ B1 sẽ sáng nhấp nháy các Led từ L1 đến L8 với khoảng thời gian 1 giây
Trang 11#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; // Dinh nghia bien key la chan P3.2, la chan nut nhan
uchar count = 0; // Bien dem so lan nhan nut
void delay(int time);
void InitUART(void)
{
SCON = 0x50; // Cau hinh UART, che do 1
TMOD = 0x20; // Che do timer 1, tu dong nap lai
TH1 = 0xFD; // Toc do baud 9600
TL1 = 0xFD;
TR1 = 1; // Khoi dong timer 1
Trang 12void UART_send_byte(uchar dat)
{
SBUF = dat; // Gui du lieu
while (!TI); // Cho cho den khi gui xong
UART_send_byte(*s); // Gui tung ky tu cua chuoi
s++; // Chuyen sang ky tu tiep theo
}
}
void main()
{
InitUART(); // Khoi tao UART
IT0 = 1; // Cau hinh ngat ngoai INT0 voi canh xuong
EX0 = 1; // Cho phep ngat ngoai INT0
EA = 1; // Cho phep ngat toan cuc
Trang 13delay(100); // Chong nhieu
if (!key) // Neu nut bam duoc nhan
{
count++; // Tang bien dem
UART_send_byte(count +'0'); // Hien thi so lan nhan nut len UART }
Trang 14void Delay(int time) {
// Khai bao ham thu vien
// Khai bao chan giao tiep cho den nhap nhay khi su dung
Trang 15// Ham gui 1 lenh ra LCD
void LCD_SendCommand(unsigned char command)
Trang 16LCD_SendCommand(0x06); // Tang ID, khong dich khung hinh
LCD_SendCommand(0x01); // Xoa toan bo khung hinh
Trang 17delay(1000);
LCD_Gotoxy(3, 0); // Vi tri 3 hang tren
LCD_Puts("AAAAAAAAA"); // Hien thi ten
delay(100);
LCD_Gotoxy(1, 1); // Vi tri 5 hang duoi
LCD_Puts("111111111111111"); // Hien thi MSSV
Trang 18void Timer0_ISR() interrupt 1
Trang 19LCD_char(a / 10 + '0'); // Display the tens digit as a character
LCD_char(a % 10 + '0'); // Display the ones digit as a character
delay_ms(500); // Thay d?i delay thành 500ms
a++;
if (a == 21)
{
Trang 20LCD_cmd(0x80); // Di chuyen con tro ve dau dong 1
// Khoi tao UART o mode 1, 9600 baud
SM0 = 0; SM1 = 1; // Chon UART mode 1
TMOD = 0x20; // 0010 xxxx - Timer1 hoat dong o che do 8bit
tu dong nap lai
Trang 22led1 = 1; led2 = 0; delay(800);
led1 = 0; led2 = 1; delay(800);
}}