Giải thuật led quay Phương pháp ý chữ: Dựa vào nguyên lý ma trận, chữ quét theo cột, led nối anot chung Led dung loại siêu sáng , dòng qua led 10mA, điện áp ~3V xuất liệu dạng xung nên nối chân- vào port ,chân + nối lên vcc, tín hiệu xung làm giảm điện áp dòng vđk 89s52 hút vào chịu đc 10mA nên led hoạt động bình thường Trên vòng quay, vị trí ngắt cột đầu tiên, vị trí cho ký tự địa add, sau hết 10 cột địa tăng lên tiếp tục hiển thị chữ Để chữ dịch chuyển sau vòng cho địa tăng lên nhiều đơn vị chữ phía sau tự độgn dịch theo Phương pháp tạo mã chữ: Dùng phần mềm sau tạo mã hex cho ký tự: Xuất bảng mã bit, ký tự gồm 10 cột, 16 hàng Phương pháp đọc liệu Mỗi ký tự có bảng mã hex riêg địa riêng, gọi địa chỉ,lần lượt byte mảng đọc để xuất port Phương pháp thực hiệu ứng Khi thực nhiều hiệu ứng sau hiệu ứng data0 data1, sau dung dung phép toán OR data lại với xuất port Thành phần mạch Mạch gồm: cụm mạch 89s52, cụm mạch xử lý ngắt cảm biến từ, cụm mạch nguồn 12 sang 5v,mạch remote,mạch thời gian thực Tính toán tốc độ Theo nguyên lý để mắt nhìn thấy ảnh hình phải xuất với tần số tối thiểu 24hình/s vong quay tốc độ động = 24vòng/s, tươgn đương 24x60 = 1440 vòng/min chọn loại độgn có tốc độ khoảng 1500vòng/min Với tốc độ 24vong/s => thời gian vòng = 1/24 = 0.0416 s ~ 42ms Trên vòng quay chia làm 250 cột khoảng cách cột = 42/250 = 0.168 ms ~ 168us Đây thời gian delay lần xuất liệu Giải thích phần mềm #include //chèn file biên dịch cho 89s52 #include //chèn file chứa bảng mã địa ký tự #define bd P3_6//khai báo led viền unsigned int colmax = 250; //khai bao biến số cột tối đa unsigned int colpre = 0; //số cột hiển thị unsigned char time1 = 0; //thời gian delay cột unsigned char nint = 0; //đếm số lần ngắt để thay đổi hiệu ứng unsigned int add1 = 0; //địa hiển thị ácc ký tự, địa địa ký tự ký tự unsigned int cir = 0; //đếm số vòng quay unsigned int cir_set = 0; //số vòng quay để thực hiệu ứng unsigned char kieu = 0; //biến chọn kiểu hiệu ứng unsigned char temp1 = 0; //biến chọn liệu cho kiểu hiệu ứng unsigned char count_move = 0; //biến cho phép chữ dịch chuyển unsigned char move_high = 0; //biến đếm cho chữ dịch từ xuống unsigned char code and[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0 ,0x0,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x0}; //bảng mã để OR với liệu đầu tạo hiệu ứng chữ từ xuống //khai báo bít bit move = 0; bit dis = 0; bit play = 0; bit endis = 0; //khai báo hàm sử dụng void out_port(unsigned char data0,unsigned char data1); void start(); void display(); void delay(unsigned char temp); void chop(unsigned char data0, unsigned char data1); void delay(unsigned char temp){while(temp );}//hàm delay, đơn vị chu kỳ máy void main(){ //chương trình colmax = 250; //gán giá trị ban đầu cho số cột time1 = index[index[0]+1]; //đọc thời gian delay bj nhớ kieu = 5; TMOD = 0; //khai báo ghi điều khiển timer EA = 1; //cho phéo ngắt toàn cục ET0=1;TR0=1; //khai bao ngat timer0 cho timer0 chạy TH0 = 0; TL0 = 0;// nạp giá trị vào ghi timer0 IT0 = 1;EX0 = 1; //khai báo ngắt ngoài, tín hiệu từ hồng ngoại báo vị trí cột đàu tiên add1 = 1; //địa cho ký tự hiển thị start();//gọi hàm cho led sáng từ vào while(1){if(play == 1){play = 0; endis = 1; display();}} //hàm gọi chương trình hiển thị led ngắt hông ngoại tác động } void ngat0(void)interrupt using 0{//hàm phục vụ ngắt endis = 0; //không cho xuất liệu TR0 = 1;//cho timer0 chạy, timer0 ngắt cho phép gọi chương trình hiển thị sau vòng quay } void int_timer0(void) interrupt {//hàm phục vụ ngắt timer0 TH0 = 0xc0;//nạp lại giá trị cho ghi TL0 = 0; TR0 = 0;//cho timer0 ngừng chạy play = 1; //cho phép gọi chương trình hiển thị hàm main bd = 0; //hiện led viền } void display(){//chương trình hiển thị chữ unsigned char x,data0,data1,index_location;//khai báo biến tạm thời unsigned int add2 = 0,add3 = 0; cir++; colpre = 0;//set lại giá trị ban đầu sau vòng quay if(cir >= 10*cir_set){//kiểm tra quay đủ số vòng chuyển sang hiệu ứng cir = ; if (kieu == 1){ // cho chu dich binh thuong temp1 = 1; move = 1; nint = 1; cir_set = (index[0] - 1); kieu = 2; }else if(kieu == 2){ //chu di xuong temp1 = 2; move = 0; add1 = 1; move_high = 0; nint = 1; cir_set = 20; kieu =3; }else if(kieu == 3){ out_port(0xff,0xff); //chu chop tai cho temp1 = 3; move = 0; dis = 0; cir_set = 10; kieu = 4; }else if (kieu == 4){ //hieu ung start kieu = 5; temp1 = 4; cir_set=0; start(); }else if(kieu == 5){ temp1 = 1; cir_set = 50; } //cho chu di move = 0; add1 = 1; kieu = 1; nint = 1; colmax = 1; } //ket thuc chon kieu hieu ung if(temp1 == 2){//tùy theo hiệu ứng mà cho liệu khác if (count_move >= 10){ if(move_high < 15){move_high++; count_move = 0;} else{out_port(0xff,0xff); count_move = 0;} }else{count_move++;} }else if(temp1 == 3){ if (count_move >= 4){ count_move = 0; dis = !dis; }else{count_move++;} } if(move == 1){ if(nint < symbol[index[add1]][20] - 1){nint++;} else{ nint = 0; if (add1 < index[0]){add1++;} else{add1 = 1;} } } //ket thuc chon che du lieu tuong ung voi tung hieu ung index_location = index[add1]; //tham chieu địa ký tự đến bảng mã hex for(x = nint; x < symbol[index[add1]][20]; x++){ //cho hiển thị cột ký tự colpre++; //sau số cột tăng lên if(temp1 == 1){//tùy theo kiểu hiệu ứng mà liệu kết hợp khác data0 = symbol[index_location][x]; data1 = symbol[index_location][x + 10]; }else if(temp1 == 2){ data0= symbol[index_location][x] | and[move_high]; data1 = symbol[index_location][x + 10] | and[move_high + 16]; }else if(temp1 == && dis == 1){ data0 = symbol[index_location][x]; data1 = symbol[index_location][x + 10]; }else{ data0 = 0xff; data1 = 0xff; } chop(data0,data1); } // ket thuc doc du lieu hien ky tu dau tien add3 = add1; //sao chép địa ký tự hiển thị để ký tự khác vòng quay while(colpre < colmax && endis == 1){ add2++;//hiện ký tự lại hết cột có ngắt hồng xảy if ( add3 + add2 ... hiển thị ácc ký tự, địa địa ký tự ký tự unsigned int cir = 0; //đếm số vòng quay unsigned int cir_set = 0; //số vòng quay để thực hiệu ứng unsigned char kieu = 0; //biến chọn kiểu hiệu ứng unsigned... //địa cho ký tự hiển thị start();//gọi hàm cho led sáng từ vào while(1){if(play == 1){play = 0; endis = 1; display();}} //hàm gọi chương trình hiển thị led ngắt hông ngoại tác động } void ngat0(void)interrupt... int add2 = 0,add3 = 0; cir++; colpre = 0;//set lại giá trị ban đầu sau vòng quay if(cir >= 10*cir_set){//kiểm tra quay đủ số vòng chuyển sang hiệu ứng cir = ; if (kieu == 1){ // cho chu dich