GIỚI THIỆU CHUNG VỀ VI ĐIỀU KHIỂN 8051
LẬP TRÌNH ĐỒNG HỒ SỐ
Sơ đồ vẽ mạch mô phỏng
Mạch mô phỏng sử dụng các linh kiện gồm: IC AT89C51, Led 7 thanh, Led đơn, điện trở, điện trở băng, nút bấm.
Lập trình
#define tat 1 char so[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; void delay(int ms)
} void hienthi(unsigned char gio, unsigned char phut)
{ unsigned char chuc0, donVi0, chuc1, donVi1, i; chuc0 = gio/10; donVi0 = gio%10; chuc1 = phut/10; donVi1 = phut % 10; for(i=0;i23) gio=1; if(min==0) { delay(1); if(min == 0) phut++;
Kết quả
Sau khi lập trình xong chúng ta chuyển đổi để lấy file hex phục vụ cho việc chạy mô phỏng:
Khi ta bấm nút tính giờ vi điều khiển bắt đầu hoạt động việc đếm thời gian:
+ Hai đèn led đơn sẽ sáng màu vàng 1s và tắt trong vòng 1s
+ Dựa trên thanh đếm thời gian sau 1 phút, đồng hồ phút sẽ nhảy lên 1
+ Khi ta bấm giữ cài đặt giờ đồng hồ tự nhảy giờ +1 và cho đến khi 23 giờ sẽ lập tức chuyển về 1
Khi bạn giữ nút cài đặt phút trên đồng hồ cho đến khi hiển thị 59 phút, đồng hồ phút sẽ tự động quay về 0 và đồng hồ giờ sẽ tăng thêm 1.
Biên dịch assembly
39: unsigned char gio, phut, giay;
C:0x088E 751201 MOV 0x12,#0x01 //gán nội dung ô nhớ được trỏ bởi giá trị 0x12 bằng giá trị 0x01
C:0x0892 F513 MOV 0x13,A //chép dữ liệu trong thanh ghi a vào ô nhớ với giá trị 0x13
C:0x0894 F514 MOV 0x14,A //chép dữ liệu trong thanh gi a vào ô nhớ với giá trị 0x14
C:0x0896 0514 INC 0x14 //Tăng nội dung ô nhớ được
C:0x0898 B2B0 CPL P3_0(0xB0.0) //Đảo giá trị của p3
AD13 MOV R5,0x13 //chép nội dung từ ô nhớ vào
AF12 MOV R7,0x12 //chép nội dung từ ô nhớ vào
1208E3 LCALL hienThi(C:08E3) if(giay=Y) phut++;
//chép giá trị 0x14 vào thanh
//So sánh và nhảy đến nhãn nếu A#0x3b
C:0x08A6 0513 INC 0x13 //tăng giá trị thanh ghi lên 1 đơn vị
C:0x08AA B43B02 CJNE A,#0x3B,C:08AF //So sánh và nhảy đến nhãn nếu A#0x3b
C:0x08AD 0512 INC 0x12 //tăng giá trị thanh ghi lên 1 đơn vị
C:0x08AF 20B60C JB P3_6(0xB0.6),C:08BE //Nhảy đến nhãn nếu bit = 1
C:0x08B2 7F01 MOV R7,#0x01 //chép giá trị 0x01 vào thanh ghi r7
C:0x08B4 7E00 MOV R6,#0x00 //chép giá trị 0x00 vào thanh ghi r6
C:0x08B6 120936 LCALL delay(C:0936) //Gọi chương trình con
C:0x08B9 20B602 JB P3_6(0xB0.6),C:08BE //Nhảy đến nhãn
C:0x08BC 0512 INC 0x12 //tăng giá trị thanh ghi lên 1
E512 MOV A,0x12 //chép giá trị 0x12 vào thanh
C:0x08C1 9417 SUBB A,#0x17 //Cộng nội dung thanh ghi A và 0x17 + cờ nhớ c, kq cất vào A
C:0x08C3 4003 JC C:08C8 //Nhảy đến nhãn nếu cờ C =1 C:0x08C5 751201 MOV 0x12,#0x01 //gán nội dung ô nhớ được trỏ bởi giá trị 0x12 bằng giá trị 0x01
C:0x08C8 20B70C JB P3_7(0xB0.7),C:08D7 //nhảy đến nhãn
C:0x08CB 7F01 MOV R7,#0x01 //gán giá trị 0x01 vào thanh ghi r7
C:0x08CD 7E00 MOV R6,#0x00 //gán giá trị 0x00 vào thanh ghi r6
C:0x08CF 120936 LCALL delay(C:0936) //Gọi chương trình con
C:0x08D5 0513 INC 0x13 //tăng giá trị thanh ghi lên 1
C:0x08D7 E513 MOV A,0x13 //chép giá trị 0x13 vào thanh ghi A
C:0x08DA 943B SUBB A,#0x3B //Cộng nội dung thanh ghi a và 0x3B+ cờ nhớ c, kết quả nhét vào thanh ghi a
C:0x08DC 40B8 JC C:0896 // nhảy đến nhãn nếu c=1C:0x08DE E4 CLR A //gán a =0
C:0x08DF F513 MOV 0x13,A //gán dữ liệu của thanh ghi A với giá trị 0x13
24: void hienthi(unsigned char gio, unsigned char phut)
26: unsigned char chuc0, donVi0, chuc1, donVi1, i;
C:0x08E3 EF MOV A,R7 //chép giá trị thanh ghi r7 vào thanh ghi a
C:0x08E4 75F00A MOV B(0xF0),#0x0A //gán 0x0A vào giá trị của b
C:0x08E8 F515 MOV 0x15,A //gán thanh ghi a với giá trị 0x15
C:0x08EA EF MOV A,R7 //chép giá trị thanh ghi r7 vào thanh ghi a
C:0x08EB 75F00A MOV B(0xF0),#0x0A //gán 0x0A vào giá trị của b
C:0x08EE 84 DIV AB //chia a cho b
C:0x08EF A9F0 MOV R1,B(0xF0) //chép giá trị của b vào thanh ghi r1
C:0x08F1 ED MOV A,R5 //chép giá trị thanh ghi r5 vào thanh ghi a
C:0x08F2 75F00A MOV B(0xF0),#0x0A //gán 0x0A vào giá trị của b
C:0x08F6 FB MOV R3,A //gán dữ liệu của thanh ghi a với thanh ghi r3
C:0x08F7 ED MOV A,R5 //chép giá trị thanh ghi r5 vào thanh ghi a
C:0x08F8 75F00A MOV B(0xF0),#0x0A //gán 0x0A vào giá trị của b
ADF0 MOV R5,B(0xF0) //chép giá trị của b vào thanh
31: led1 = sang; P0 = so[chuc0]; delay(10); led1 = tat;
C:0x0902 7408 MOV A,#so(0x08) // chép giá trị 0x08 vào thanh ghi a
C:0x0904 2515 ADD A,0x15 //cộng nội dung của a và ô nhớ giá trị 0x15
32: led2 = sang; P0 = so[donVi0]; delay(10); led2 = tat;
C:0x090D 7408 MOV A,#so(0x08) //chép giá trị 0x08 vào thanh ghi a
C:0x090F 29 ADD A,R1 //cộng nội dung thanh ghi a và r1 C:0x0910 12092E LCALL L?0023(C:092E)
33: led3 = sang; P0 = so[chuc1]; delay(10); led3 = tat;
C:0x0917 7408 MOV A,#so(0x08) //chép giá trị 0x08 vào thanh ghi a
C:0x0919 2B ADD A,R3 //cộng nội dung thanh ghi a và r3, lưu vào a
34: led4 = sang; P0 = so[donVi1]; delay(10); led4 = tat;
//gán p2.3 =0 //chép giá trị 0x08 vào thanh
C:0x0923 2D ADD A,R5 //cộng nội dung thanh ghi a và r5, lưu vào a
C:0x0936 EF MOV A,R7 //Chép dữ liệu từ thanh r7 vào thanh ghi a C:0x0937 1F DEC R7 //Giảm nội dung thanh r7 đi 1 đơn vị
C:0x0938 AC06 MOV R4,0x06 //gán giá trị 0x06 vào thanh ghi r4
C:0x093C 1E DEC R6 //Giảm nội dung thanh r6 đi 1 đơn vị
C:0x093D 4C ORL A,R4 // thực hiện OR nội dụng thanh ghi a và r4, kết quả cất vào a