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.
Tài liệu đính kèm file code KeilC mơ proteus 1.Sử dụng vi điều khiển AT89C52, mô phần mềm Proteus lập trình thực nhiệm vụ sau: a Hiển thị số lên LED nối cổng P3 (dùng LED anot chung); b Hiển thị đếm tăng dần từ đến sau 800ms 2.Sử dụng vi điều khiển AT89C52, mơ phần mềm Proteus lập trình thực nhiệm vụ sau: a Cấu hình ngắt INT1 chế độ ngắt sườn xuống; b Đếm số lần nút bấm nút nối vào chân INT1, hiển thị kết lên LED nối vào cổng P2 (nếu số lần bấm 10 quay 0) Sử dụng vi điều khiển AT89C52, mô phần mềm Proteus lập trình thực nhiệm vụ sau: a Hiển thị số lên LED nối vào cổng P3; b Tăng số đếm sau 800ms, số đếm dừng lại Sử dụng vi điều khiển AT89C52, mô phần mềm Proteus lập trình thực nhiệm vụ sau: a Cấu hình ngắt ngồ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 bấm, hiển thị kết lên LED nối vào cổng P0 (nếu số lần bấm quay 0) Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô Proteus cho nút bấm B1, B2, B3 nối vào chân P2.0, P2.1, P2.2 Led L1, L2, L3 nối vào chân P0.0, P0.1, P0.2 Lập trình chức sau: bấm B1 đảo trạng thái Led L1, bấm B2 đảo trạng thái Led L2, bấm B3 đảo trạng thái Led L3 6.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô Proteus ghép nối với LCD Sử dụng ngắt chân INT1 đếm số lần thay đổi trạng thái nút bấm gắn vào Hiển thị số lần bấm nút lên LCD, số lần bấm đạt lần hiển thị LCD “Return to 0” sau reset số lần đếm lặp lại trình 7.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ cho nút bấm B1 nối vào P1.0 Led L1, L2, L3, L4, L5, L6, L7, L8 nối vào chân PORT P0 Vẽ sơ đồ mô Proteus lập trình chức sau: bấm giữ B1 sáng nhấp nháy Led từ L1 đến L8 với khoảng thời gian giây Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô Proteus sử dụng ngắt chân INT0 đếm số lần thay đổi trạng thái nút bấm gắn vào Hiển thị số lần bấm nút lên UART, số lần bấm đạt lần hiển thị UART “Họ tên SV” sau reset số lần đếm 9.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô Proteus kết nối theo thứ tự Led L1 đến L8 vào chân PORT P0 Lập trình hiệu ứng Led sáng từ L1 đến L8 với thời gian trễ cho hiệu ứng 1s, sau tắt tất Led lặp lại hiệu ứng sáng 10.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô 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ô 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 chế độ 16 bit 12.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô 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 đơn vị sau chu kỳ 500ms, A=20 tên sinh viên lên LCD reset A=0 13 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mơ 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 Led nối đến chân P1.1, P1.2 với chu kỳ 800ms Bài làm 1.Sử dụng vi điều khiển AT89C52, mô phần mềm Proteus lập trình thực nhiệm vụ sau: a Hiển thị số lên LED nối cổng P3 (dùng LED anot chung); b Hiển thị đếm tăng dần từ đến sau 800ms #include #define LED_PORT P3 unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void main() { while(1) { LED_PORT = Code7Seg[8]; } } Bai1.b #include #define LED_PORT P3 /* */ unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void Delay(int time); void tangdan(); void main() { while(1) { tangdan(); } } void Delay(int time) { int i,j; for(i=0; i 2) & 1; LCD_D7 = (Data >> 3) & 1; } // Ham gui lenh LCD void LCD_SendCommand(unsigned char command) { LCD_Send4Bit(command >> 4); // Gui bit cao LCD_Enable(); LCD_Send4Bit(command); // Gui bit thap LCD_Enable(); } void LCD_Clear() // Ham xoa man hinh LCD { LCD_SendCommand(0x01); delay(10); } void LCD_Init() // Ham Khoi Tao LCD { LCD_Send4Bit(0x00); delay(20); LCD_RS = 0; LCD_RW = 0; LCD_Send4Bit(0x03); LCD_Enable(); delay(5); LCD_Enable(); delay(100); 15 LCD_Enable(); LCD_Send4Bit(0x02); LCD_Enable(); LCD_SendCommand(0x28); // Giao thuc bit, hien thi hang, ki tu 5x8 LCD_SendCommand(0x0c); // Cho phep hien thi man hinh LCD_SendCommand(0x06); // Tang ID, khong dich khung hinh LCD_SendCommand(0x01); // Xoa toan bo khung hinh } void LCD_Gotoxy(unsigned char x, unsigned char y) { unsigned char address; if (!y) address = (0x80 + x); else address = (0xc0 + x); delay(100); LCD_SendCommand(address); delay(50); } void LCD_PutChar(unsigned char Data) // Ham gui ky tu { LCD_RS = 1; LCD_SendCommand(Data); LCD_RS = 0; } void LCD_Puts(char *s) // Ham gui chuoi ky tu { while (*s) { LCD_PutChar(*s); s++; } } void main() { LCD_Init(); // Khoi tao LCD 16 delay(1000); LCD_Gotoxy(3, 0); // Vi tri hang tren LCD_Puts("AAAAAAAAA"); // Hien thi ten delay(100); LCD_Gotoxy(1, 1); // Vi tri hang duoi LCD_Puts("111111111111111"); // Hien thi MSSV while (1) {} } 11.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô 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 chế độ 16 bit #include void Timer_init(); sbit LED1 = P1^1; unsigned char dem=0; int main() { EA = 1; ET0 = 1; Timer_init(); while(1) { if(dem==10) { LED1 = ~LED1; dem=0; } } } void Timer_init() { TMOD = 0x01; TH0 = 0x4B; TL0 = 0xFD; TR0 = 1; } 17 void Timer0_ISR() interrupt { dem=dem+1; TH0 = 0x4B; TL0 = 0xFD; } 12.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô 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 đơn vị sau chu kỳ 500ms, A=20 tên sinh viên lên LCD reset A=0 #include #define LCD_data P2 sbit RS = P3^0; sbit RW = P3^1; sbit EN = P3^2; void delay_ms(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } void LCD_cmd(unsigned char cmd) { LCD_data = cmd; RS = 0; RW = 0; EN = 1; delay_ms(1); EN = 0; delay_ms(1); } void LCD_init() 18 { LCD_cmd(0x38); LCD_cmd(0x0E); LCD_cmd(0x01); LCD_cmd(0x80); } void LCD_char(unsigned char dataa) { LCD_data = dataa; RS = 1; RW = 0; EN = 1; delay_ms(1); EN = 0; delay_ms(1); } void LCD_string(unsigned char *str) { while (*str) LCD_char(*str++); } void main() { unsigned char a = 0; unsigned char name[] = "Student Name"; unsigned char i; LCD_init(); while (1) { LCD_cmd(0x80); // Di chuyen tro ve dau dong LCD_string("A="); LCD_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) { 19 LCD_cmd(0x80); // Di chuyen tro ve dau dong LCD_string(name); delay_ms(500); // Delay 2s LCD_cmd(0x01); delay_ms(500); // Delay 2s a = 0; } } } 13 Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô Proteus, lập trình hiển thị ký tự “PROTEUS” qua chuẩn truyền thông UART; #include void delay(long time) { time = time * 25; while(time ) {} } void Uart_Init() { // Khoi tao UART o mode 1, 9600 baud SM0 = 0; SM1 = 1; // Chon UART mode TMOD = 0x20; // 0010 xxxx - Timer1 hoat dong o che 8bit tu dong nap lai TH1 = 0xFD; // Toc baud 9600 TR1 = 1; // Timer1 bat dau chay TI = 1; // San sang gui du lieu REN = 1; // Cho phep nhan du lieu } void Uart_Write_Char(char c) { while(TI == 0); TI = 0; SBUF = c; 20