Tà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 ngồ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 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 đượ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ấ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, L3 lầ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. 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ển thị 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 ngồ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
1
9.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. #include <regx52.h> #define LED_PORT P3 unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void main()
void tangdan(unsigned int i) { for (i=0; i<10; i++) { LED_PORT = Code7Seg[i]; Delay(800); } } 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 ngồ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). #include <regx52.h> #define LED_PORT P2 sbit button = P3^3; void delay(int time) { int i, j; for (i = 0; i < time; i++) 3
} } void externalInterruptHandler() interrupt 2 { unsigned char k = 0; while (1) { if (button == 0) { delay(100); if (button == 0) { k++; delay(100); if (k > 9) { k = 0; } LED_PORT = Code7Seg[k]; } } } } 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. #include <regx52.h> #define LED_PORT P3 unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void main() { 4
while(1) { LED_PORT = Code7Seg[1]; } } Bai3.b #include <regx52.h> #define LED_PORT P3 /* 0 1 2 3 4 5 6 7 8 9 */ unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void Delay(int time); void main() { unsigned int i = 0; while (1) { if (i == 6) { break; //continue; } LED_PORT = Code7Seg[i]; Delay(800); i++; } } void Delay(int time) { int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } 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 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 đượ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). #include <regx52.h>
5
#define LED_PORT P0 sbit button = P3^2; void delay(int time) { int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void main() { EA = 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 while (1) { } } void externalInterruptHandler() interrupt 0 { unsigned char k = 0; while (1) {
if (button == 0) { delay(100); if (button == 0) { k++; delay(100); if (k > 6) { k = 0; } LED_PORT = Code7Seg[k]; } } } }
6
5. 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, L3 lầ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. #include <regx52.h> sbit B1 = P2^0; sbit B2 = P2^1; sbit B3 = P2^2; sbit L1 = P0^0; sbit L2 = P0^1; sbit L3 = P0^2; void delay(int time) {
int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } void main() { while (1) { if (B1 == 0) { delay(50); if (B1 == 0) { L1 = ~L1; while (B1 == 0); } } if (B2 == 0) { delay(50); if (B2 == 0) { L2 = ~L2; while (B2 == 0); } } 7
if (B3 == 0) { delay(50); if (B3 == 0) { L3 = ~L3; while (B3 == 0); } }
} } 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ển thị trên LCD “Return to 0” sau đó reset số lần đếm về 0 và lặp lại quá trình trên. #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) { int i,j; for(i=0; ifor(j=0; j<123; j++); } void LCD_cmd(unsigned char cmd) // Ham gui lenh den LCD { 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); 8
EN = 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 RW = 0; // Che do ghi EN = 1; // Bat dau gui du lieu delay(1); EN = 0; // Ket thuc gui du lieu delay(1); } void LCD_string(unsigned char *str) // Ham gui chuoi den LCD { 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 9
{ LCD_cmd(0x01); // Xoa man hinh delay(1000); if (count == 1) { LCD_char('1'); // Hien thi so lan nhan nut } else { LCD_char(count + '0'); // Hien thi so lan nhan nut } } } void main() { LCD_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. #include <reg52.h> sbit Button = P1^0; sbit LED = P0; char so[] ={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; int i, j; void Delay(time); void main() { while (1) { if (Button == 0) { if (Button == 0) { for (i = 0; i < 8; i++) { P0 = so[i]; Delay(1000); 10
if (Button == 1) { P0 = 0xFF; break; } } } } } } void Delay(int time) { int i,j; for(i=0; i for(j=0; j<123; j++); } 8. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mơ phỏng trên Proteus sử dụng ngắt ngồ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 #include <reg52.h> #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 11
} void UART_send_byte(uchar dat) { SBUF = dat; // Gui du lieu while (!TI); // Cho cho den khi gui xong TI = 0; // Reset lai co TI
} void UART_send_string(uchar *s) { while (*s) { 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 while (1) { if (count == 9) // Neu so lan nhan dat 9 lan { UART_send_string(" PHAN CHI CONG "); // Hien thi "PHAN CHI CONG" tren UART count = 0; // Reset lai bien dem } // Them mot do tre nho de tranh vong lap chay qua nhanh delay(100); }
{ delay(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 } } void delay(int time) { int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } 9.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. #include <reg52.h> sbit LED = P0; char so[] ={0xff, 0xfe, 0xfc, 0xf8, 0xf0,0xe0,0xc0,0x80, 0x00}; int i; void Delay(int time); void main() { while (1) {
for (i = 0; i < 9; i++) { P0 = so[i]; Delay(100); P0 = 0xFF; } } } 13
void Delay(int time) { int i, j; for (i = 0; i < time; i++) for (j = 0; j < 123; j++); } 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. #include <REGX52.H> // Khai bao ham thu vien // Khai bao chan giao tiep cho den nhap nhay khi su dung #define LED_FLASH P1_0 // Khai bao chan giao tiep cho LCD #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_D4 P2_4 #define LCD_D5 P2_5 #define LCD_D6 P2_6 #define LCD_D7 P2_7 void delay(unsigned int t) // Ham tao tre voi thoi gian lon
{ unsigned int i, j; for (i = 0; i < t; i++) { for (j = 0; j < 125; j++) { } } } // Cac ham dieu khien LCD void LCD_Enable(void) { 14
LCD_EN = 1; delay(3); LCD_EN = 0; delay(50); } void LCD_Send4Bit(unsigned char Data) // Ham gui 4 Bit du lieu ra LCD { LCD_D4 = Data & 0x01; LCD_D5 = (Data >> 1) & 1; LCD_D6 = (Data >> 2) & 1; LCD_D7 = (Data >> 3) & 1; } // Ham gui 1 lenh ra LCD void LCD_SendCommand(unsigned char command) {
LCD_Send4Bit(command >> 4); // Gui 4 bit cao LCD_Enable(); LCD_Send4Bit(command); // Gui 4 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 4 bit, hien thi 2 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 1 ky tu { LCD_RS = 1; LCD_SendCommand(Data); LCD_RS = 0; } void LCD_Puts(char *s) // Ham gui 1 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 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 while (1) {} } 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. #include<REGX52.h> void Timer_init(); sbit LED1 = P1^1; unsigned char dem=0; int main() { EA = 1; ET0 = 1; Timer_init(); while(1) { if(dem==10) {
void Timer0_ISR() interrupt 1 { dem=dem+1; TH0 = 0x4B; TL0 = 0xFD; } 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. #include <reg52.h> #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
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 con tro ve dau dong 1 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 con tro ve dau dong 1 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ô phỏng trên Proteus, lập trình hiển thị ký tự “PROTEUS” qua chuẩn truyền thông UART; #include <REGX51.H> 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 1 TMOD = 0x20; // 0010 xxxx - Timer1 hoat dong o che do 8bit tu dong nap lai TH1 = 0xFD; // Toc do 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