Tài liệu lập trình vi điều khiển 8051
Keywords

Latest topics
» Tại sao nên lựa chọn progeCAD?
Sun Jun 18, 2017 12:37 am by mrbuitu

» Tính năng mới progeCAD 2018 professional
Wed Jun 07, 2017 3:38 pm by mrbuitu

» Phần mềm thiết kế 2D progeCAD - 4Ctech
Wed May 10, 2017 11:39 am by mrbuitu

» https://www.youtube.com/watch?v=b2bvWArORSc
Thu Mar 03, 2016 1:48 pm by Admin

» RGB LED GLOBE - POV - 40 x 200
Thu Mar 03, 2016 1:47 pm by Admin

» đồng hồ led - led clock - led quay - led xoay
Thu Mar 03, 2016 1:46 pm by Admin

» Đồng hồ led
Thu Mar 03, 2016 1:45 pm by Admin

» mach trai tim 32 led
Thu Mar 03, 2016 1:44 pm by Admin

» Mạch Nguồn Đầu 19V của DELL INSPIRON 3537 Core I5
Thu Nov 12, 2015 9:42 am by Admin

September 2017
MonTueWedThuFriSatSun
    123
45678910
11121314151617
18192021222324
252627282930 

Calendar Calendar

Statistics
Diễn Đàn hiện có 3 thành viên
Chúng ta cùng chào mừng thành viên mới đăng ký: mrbuitu

Tổng số bài viết đã gửi vào diễn đàn là 27 in 27 subjects

Tài liệu lập trình vi điều khiển 8051

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

08112015

Bài gửi 

Tài liệu lập trình vi điều khiển 8051




III. Hiển thị ma trận Led
1. Thuật toán
2. Xây dựng chương trình
            Bài toán: Viết chương trình hiển thị ma trận LED bằng phương pháp quét cột hiển thị dong chữ "LAP TRINH VI DIEU KHIEN BANG NGON NGU C", với dong chữ chạy từ trái sang phải.
+ Chương trình:
// Khai bao chi thi tien xu ly
 #include<AT89x51.h>
 
// Dinh nghia cac cong va cac chan dieu khien
 #define CLOCK P3_2
 #define DATA P3_3
 #define CLEAR P3_4
 #define Pxanh P1
 #define Pdo P2
 
// Dinh nghia cac hang so
 #define Nhanh 10
 #define Trungbinh 25
 #define Cham 50
 #define Cuccham 75
 #define Sieucham 150
 #define Mxanh 1
 #define Mdo 2
 #define Mcam 3
// Khai bao mang chu hien thi
 unsigned char code Mcode[256]={
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
            0,255,1,1,1,1,/* L */
            0,63,72,136,72,63,/* A */
            0,255,144,144,144,96,/* P */
            0,
            0,128,128,255,128,128,/* T */
            0,255,144,144,144,111,/* R */
            0,129,129,255,129,129,/* I */
            0,255,96,24,6,255,/* N */
            0,255,16,16,16,255,/* H */
            0,
            0,252,2,3,2,252,/* V */
            0,129,129,255,129,129,/* I */
            0,
            0,255,129,129,129,126,/* D */
            0,129,129,255,129,129,/* I */
            0,255,145,145,145,129,/* E */
            0,254,1,1,1,254,/* U */
            0,
            0,255,24,36,66,129,/* K */
            0,255,16,16,16,255,/* H */
            0,129,129,255,129,129,/* I */
            0,255,145,145,145,129,/* E */
            0,255,96,24,6,255,/* N */
            0,        
            0,255,145,145,145,110,/* B */
            0,63,72,136,72,63,/* A */
            0,255,96,24,6,255,/* N */
            0,126,129,129,137,78,/* G */
            0,
            0,255,96,24,6,255,/* N */
            0,126,129,129,137,78,/* G */
            0,126,129,129,129,126,/* O */
            0,255,96,24,6,255,/* N */
            0,
            0,255,96,24,6,255,/* N */
            0,126,129,129,137,78,/* G */
            0,254,1,1,1,254,/* U */
            0,
            0,126,129,129,129,70,/* C */
            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
            };
 
// Khai bao bien toan cuc
 unsigned char data Start,End,Tocdolap,i,j,k;
 unsigned char data Mdata1[32],Mdata2[32],Mau;
 unsigned char data Dk1,Dk2,Dk3,Dk4,Dk5;
 
// Khai bao nguyen mau cac ham
 void delay(unsigned long time);
 unsigned char Mu2(unsigned char somu);
 
 void Do(unsigned char chiso);
 void Xanh(unsigned char chiso);
 void Cam(unsigned char chiso);
 void Dobyte(unsigned char chiso);
 void Xanhbyte(unsigned char chiso);
 void Cambyte(unsigned char chiso);
 
 void Chaychudo(void);
 void Chaychuxanh(void);
 void Chaychucam(void);
 void Chaychu(void);
 
 void Taomangnhapnhay(void);
 void Nhapnhayxanh(void);
 void Nhapnhaycam(void);
 void Nhapnhaydo(void);
 
 void Taomanglen(void);
 void Lxanh(void);
 void Ldo(void);
 void Lcam(void);
 void Len(void);
/******************Ma nguon cac ham*************************/
// Ham tao tre
 void delay(unsigned long time)
 {
            while(time--);
 }
 // Khoi ham hien thi chu chay tu trai sang phai
 void Xanh(unsigned char chiso)
 {         
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pxanh=Mcode[chiso];
            delay(12);
            Pxanh=0;
 }
 
 void Do(unsigned char chiso)
 {
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pdo=Mcode[chiso];
            delay(12);
            Pdo=0;
 }
 
 void Cam(unsigned char chiso)
 {                                             
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pxanh=Mcode[chiso];
            Pdo=Pxanh;
            delay(12);
            Pdo=0;
            Pxanh=0;
 }
 
 void Chaychucam(void)
 {
            for(i=Start+1;i<Dk1;i++)
            {
                        Tocdolap=Nhanh;
                        while(Tocdolap--)
                        {
                                    DATA=1;
                                    Dk2=i+32;
                                    for(j=i;j<Dk2;j++)Cam(j);
                        }
            }
 }
 void Chaychuxanh(void)
 {
            for(i=Start+1;i<Dk1;i++)
            {
                        Tocdolap=Nhanh;
                        while(Tocdolap--)
                        {
                                    DATA=1;
                                    Dk2=i+32;
                                    for(j=i;j<Dk2;j++)Xanh(j);
                        }
            }
 }
 void Chaychudo(void)
 {
            for(i=Start+1;i<Dk1;i++)
            {
                        Tocdolap=Nhanh;
                        while(Tocdolap--)
                        {
                                    DATA=1;
                                    Dk2=i+32;
                                    for(j=i;j<Dk2;j++)Do(j);
                        }                      
            }
 }
 
 void Chaychu(void)
 {         
            Dk1=End-31;
            if(Mau==Mxanh)Chaychuxanh();
            else if(Mau==Mdo)Chaychudo();
            else Chaychucam();           
           
 }
 
 // Khoi ham hien thi chu nhap nhay tai cho
 void Cambyte(unsigned char chiso)
 {                                             
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pxanh=Mdata2[chiso];
            Pdo=Pxanh;
            delay(12);
            Pdo=0;
            Pxanh=0;
 }
 
 void Dobyte(unsigned char chiso)
 {
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pdo=Mdata2[chiso];
            delay(12);
            Pdo=0;
 }
 
 void Xanhbyte(unsigned char chiso)
 {         
            CLOCK=1;
            DATA=0;                   
            CLOCK=0;
            Pxanh=Mdata2[chiso];
            delay(12);
            Pxanh=0;
 }
 
 void Nhapnhaydo(void)
 {                                 
            while(Tocdolap--){
                        DATA=1;
                        for(k=0;k<32;k++)Dobyte(k);
            }
 }
 void Nhapnhayxanh(void)
 {                                             
            while(Tocdolap--){
                        DATA=1;       
                        for(k=0;k<32;k++)Xanhbyte(k);
            }
 }
 void Nhapnhaycam(void)
 {                                                                     
            while(Tocdolap--){
                        DATA=1;
                        for(k=0;k<32;k++)Cambyte(k);
            }                                  
 }
 
 void Taomangnhapnhay(void)
 {
            for(i=0;i<32;i++)       
                        Mdata2=0;
            
            Dk4=End-Start;
            Dk5=(32-Dk4)/2;
            Dk4=32-Dk5;
            for(i=Dk5;i<Dk4;i++) 
                        Mdata2=Mcode[Start+i-Dk5];       
 }
 
 void Nhapnhay(void)
 {
            unsigned char demnhay;
            demnhay=10;
            Taomangnhapnhay();
            while(demnhay--)
            {
                        Tocdolap=Nhanh;                                        
                        if(Mau==Mxanh)Nhapnhayxanh();
                        else if(Mau==Mdo)Nhapnhaydo();
                        else Nhapnhaycam();                     
                        CLEAR=0;
                        delay(1250);
                        CLEAR=1;
            }           
 }
 // Khoi ham hien thi chu di tu duoi len
 unsigned char Mu2(unsigned char somu)
 {
            if(!somu) return 1;
            else return 2*Mu2(somu-1);
 }
 
 void Taomanglen(void)
 {
            for(i=0;i<32;i++)        
                        Mdata2[i]=0;
            
            Dk4=End-Start;
            Dk5=(32-Dk4)/2;
            Dk4=32-Dk5;
            for(i=Dk5;i<Dk4;i++) 
                        Mdata1[i]=Mcode[Start+i-Dk5];       
            i=8;
 }
 void Lcam(void)
 {          
            unsigned char data dem;
            Tocdolap=Trungbinh;
            while(Tocdolap--)
            {                                               
                        DATA=1;
                        for(dem=0;dem<32;dem++)
                        {                                  
                                    CLOCK=1;
                                    DATA=0;                                                                                
                                    CLOCK=0;                             
                                    Pxanh=Mdata2[dem];
                                    Pdo=Pxanh;
                                    delay(12);
                                    Pxanh=0;
                                    Pdo=0;
                        }
            }
 }
 void Ldo(void)
 {          
            unsigned char data dem;
            Tocdolap=Trungbinh;
            while(Tocdolap--)
            {                                               
                        DATA=1;
                        for(dem=0;dem<32;dem++)
                        {                                  
                                    CLOCK=1;
                                    DATA=0;                                                                                
                                    CLOCK=0;                             
                                    Pdo=Mdata2[dem];
                                    delay(12);
                                    Pdo=0;
                        }
            }
 }
 
 void Lxanh(void)
 {          
            unsigned char data dem;
            Tocdolap=Trungbinh;
            while(Tocdolap--)
            {                                               
                        DATA=1;
                        for(dem=0;dem<32;dem++)
                        {                                  
                                    CLOCK=1;
                                    DATA=0;                                                                                
                                    CLOCK=0;                             
                                    Pxanh=Mdata2[dem];
                                    delay(12);
                                    Pxanh=0;
                        }
            }
 }
 
 void Len(void)
 {
            Taomanglen();
            while(i--)
            {
                        for(j=Dk5;j<Dk4;j++)
                                    Mdata2[j]= Mdata1[j]/Mu2(i);           
                        if(Mau==Mxanh)Lxanh();
                        else if(Mau==Mdo)Ldo();
                        else Lcam();              
            }           
            
            for(i=0;i<7;i++)
            {
                        for(j=Dk5;j<Dk4;j++)
                                    Mdata2[j]= Mdata2[j]*2;        
                        if(Mau==Mxanh)Lxanh();
                        else if(Mau==Mdo)Ldo();
                        else Lcam();  
            }
 }
 /*Ham chinh*/
 void main(void)
 {
            TMOD=0x01; 
            Pxanh=0;
            Pdo=0;
            P3=16;
                                                                                     
            while(1)
            {                                                                                                           
                        Start=0;End=194;Mau=3;               
                        Chaychu();
 
                        Start=0;End=17;Mau=1;
                        Len();
                        Start=19;End=48;Mau=1;
                        Len();
                        Start=50;End=61;Mau=1;
                        Len();
                        Start=63;End=87;Mau=1;
                        Len();
                        Start=89;End=118;Mau=1;
                        Len();
                        Start=120;End=143;Mau=1;
                        Len();
                        Start=145;End=168;Mau=1;
                        Len();
                        Start=170;End=187;Mau=1;
                        Len();
                        Start=189;End=194;Mau=1;
                        Len();
 
                        Start=0;End=17;Mau=2;
                        Nhapnhay();
                        Start=19;End=48;Mau=2;
                        Nhapnhay();
                        Start=50;End=61;Mau=2;
                        Nhapnhay();
                        Start=63;End=87;Mau=2;
                        Nhapnhay();
                        Start=89;End=118;Mau=2;
                        Nhapnhay();
                        Start=120;End=143;Mau=2;
                        Nhapnhay();
                        Start=145;End=168;Mau=2;
                        Nhapnhay();
                        Start=170;End=187;Mau=2;
                        Nhapnhay();
                        Start=189;End=194;Mau=2;
                        Nhapnhay();
            }
 
[/i][/i]
}
Bài 5: Giao tiếp ADC - Xử lý ngắt

I. Giao tiếp ADC


+Chương trình:
#include<regx51.h>
 #include<string.h>
 
/*===========khai bao bien toan cuc============*/
 sfr LCDdata = 0xA0; // cong P2, 8 bit du lieu.
 sbit BF = 0xA7; // co ban, bit DB7.
 sbit RS = 0xb0; // chon thanh ghi
 sbit RW = 0xb1; // doc/ghi
 sbit EN = 0xb2; //cho phep chot du lieu
 #include"Lcd.h"// Thu vien LCD tu xay dung
 #define RD P3_3
 #define WR P3_4
 #define INTR P3_5
/*-------- Ham tre ---------------*/
 void  delay(long  time)
 {
            while(time--);
 }
/*-------- ham doc phim nhan tu ma tran phim 4x4---------------*/
 
 void view(unsigned char val)
 {
            unsigned char var;
            if(val<10){
                        LCDwrite(val+48);
            }else if(val<100){
                        LCDwrite(val/10+48);
                        LCDwrite(val%10+48);
            }else{
                        var=val/10;
                        LCDwrite(var/10+48);
                        LCDwrite(var%10+48);
                        LCDwrite(val%10+48);
            }
 }
 void main(void)
 {
            unsigned char ADCval=0;
            RD=0;
            LCDinit();
            LCDcontrol(0x83);
            LCDwrites("ADC0804");
            while(1){                    
                        WR=1;
                        WR=0;
                        while(!INTR);
                        ADCval=P1;
                        LCDcontrol(0x01);
                        LCDcontrol(0x83);
                        LCDwrites("ADC0804");
                        LCDcontrol(0xC0);
                        view(ADCval);
                        delay(5000);
            }
}
II. Lập trình xử lý ngắt
1. Ngắt timer/counter.
   1.1. cơ chế tạo trễ của timer và cách tính toán giá trị nạp vào timer.
        a. chế độ 1:
            - ở chế độ 1 đó là bộ định thời 16 bit, do đó các giá trị trong khoảng từ 0000 đến FFFF có thể sử dụng để nạp cho TH và TL của bộ định thời.
            - Sau khi TH, TL được nạp giá trị ban đầu 16 bit thì bộ định thời phải được khởi động với lệnh TR0 = 1 với timer0 và TR1 = 1 với timer1, khi này bộ định thời bắt đầu đếm tăng theo xung clock từ giá trị ban đầu cho tới giá trị đỉnh là FFFF. Khi đó bộ định thời sẽ quay vong từ FFFF về 0000 và bật cờ báo tràn TF0 với timer0 và TF1 với timer1(ban dầu TFx=0) khi đó cần phải có thao tác để xoá cờ để lần sau còn biết được khi nào bộ đếm tràn.
            - khi bộ đếm tràn thì TH và Tl của bộ định thời sẽ mang giá trị 0 do đó phải có thao tác nạp lại giá trị ban đầu cho chúng và xoá cờ TF để bộ đếm được lặp lại.
            - Như vậy khoảng thời gian mà bộ định thời tạo trễ chính là khoangre thời gian nó đếm tăng từ giá trị ban đầu được nạp cho tới giá trị đỉnh FFFF.
            - tính toán giá trị nạp vào thanh ghi chứa của bộ định thời từ thời gian muốn tạo trễ(t): gọi N = 65536 – t/chu ki máy. Sau khi chuyển sang mã HEX được 1 số có 4 chữ số có dạng: x1x2y1y2. khi đó giá trị nạp cho thanh ghi chứa như sau: TH = x1x2, TL = y1y2.
            Ví dụ: muốn tạo trễ 500us thì:
  Giả sử chu kì máy là 1us: có  N = 65536 – 500/1 = 65036. chuyển sang mã HEX là FE0C, từ đó: TH = 0xFE, TL = 0x0C.
            - các bước lập trình cho bộ định thời để tạo trễ ở chế độ 1:
                        +B1: chọn chế độ 1 cho bộ định thời cần dung, từ đó xác định giá trị nạp cho thanh ghi TMOD.
                        + B2: tính toán giá trị ban đầu cần nạp cho TH và TL từ thời gian trễ mong muốn.
                        + B3: khởi động bộ định thời.
                        + B4: kiểm tra trạng thái bật của cờ TF.
                        + B5:dung bộ định thời.
                        + B6: xoá cờ TF cho vòng lặp kế tiếp.
                        + B7: quay trở về B2 để nạp lại giá trị cho TH và TL.
        b. Chế độ 2:
            - Ở chế độ này bộ định thời là 8 bit, do vậy chỉ cho phép các giá trị từ 00 đến FF được nạp vào thanh ghi TH của bộ định thời. sau khi nạp giá trị 8 bit thì vi điều khiển sẽ sao nội dung của TH sang TL và bộ định thời được khởi động bằng lệnh TRx=1.
            - Sau khi được khởi động thì bộ định thời bắt đầu đếm tăng trong thanh ghi TL từ giá trị ban đầu đến giá trị đỉnh FF. và khi quay vòng từ FF về 00 thì cờ TFx được bật lên 1, khi này thanh ghi TL mang giá trị 0 nhưng TL sẽ ngay lập tức được tự động nạp lại với giá trị ban đầu được lưu trong thanh ghi TH.
            - như vậy trong chế độ này mỗi khi bộ đếm tràn thì thanh ghi chứa sẽ được vi điều khiển nạp lại giá trị ban đầu, do đó chế độ này được gọi là chế độ tự động nạp lại.
            - tính giá trị nạp vào thanh ghi chứa của bộ định thời từ thời gian trễ (t): 
            Gọi N = 256 – t/chu kì máy. Sau khi chuyển sang mã HEX được 1 số, ta nạp số này vào thanh ghi TH và cả TL(nạp vào TL giá trị đếm lần 1 và nạp vào TH cho những lần sau để khi bộ đếm tràn thì phần cứng của vi điều khiển sẽ tự động sao TH sang TL).
            Ví dụ: tạo trễ 50usthì là: 
            Giả sử chu kì máy là 1us: có N = 256 – 50/1 = 205, chuyển sang mã HEX : 0CE 
            Từ đó: TH = 0xCE và TL = 0xCE.
            - các bước lập trình cho bộ định thời để tạo trễ ở chế độ 2.
                        + B1: nạp giá trị cho thanh ghi thiết lập chế độ TMOD với timer muốn sử dụng.
                        + B2: nạp vào TH giá trị đém ban đầu.
                        +B3: khởi động bộ định thời.
                        + B4: kiểm tra cờ báo tràn TFx.
                        + B5: xoá cờ tràn TFx, quay về B4.
        * lưu ý: 2 chế độ khác của bộ định thời là chế độ 0(chế độ bộ định thời 13 bit, bộ định thời/bộ đếm 8 bit, định tỷ lệ trước 5 bit ) và chế độ 3(chế độ bộ định thời chia tách) ở đay không giới thiệu.
   1.2. Ngắt của bộ định thời.
       - nguyên tắc sử dụng bộ định thời ở chế độ ngắt:
            + khai báo ngắt của bộ định thời muốn sử dụng
            + nguồn gây ngắt.
            + chương trình chính và chương trình phục vụ ngắt.
      - với ngắt định thời việc khai báo nguồn ngắt bao gồm việc khai báo ngắt toàn cục là EA = 1 và khai báo ngắt cho từng bộ định thời muốn dùng ET0 = 1(timer0) và ET1 = 1(timer1)
      - Nguồn báo ngắt định thời(với cả 2 chế độ) đều là khi bộ đếm tràn(khi cờ TFx = 1), khi cờ TFx = 1 thì vi điều khiển kết thúc công việc hiện tại ở chương trình chính và chuyển vào chương trình phục vụ ngắt căn cứ theo địa chỉ của chương trình phục vụ ngắt.khi thực hiện xong chương trình phục vụ ngắt vi điều khiển quay trở về chương trình tại nơi bị gián đoạn khi trước.
      - Tóm lại ngắt định thời là việc ta sử dụng bộ định thời tạo trễ một khoảng thời gian được tính toán trước, sau khoảng thời gian này 1 công việc ta mong muốn sẽ được thực hiện ở chương trình phục vụ ngắt. công việc đó có thể coi là độc lập với công việc ở chương trình chính
      - các công việc lập trình sử dung ngắt định thời :
            + tính toán thời gian trễ mong muốn và công việc muốn thực hiện sau khoảng thời gian đó.
            + khai báo ngắt định thời trong chương trình chính (EA=1, ETX=1).
            + lựa chon bộ định thời và chế độ của nó trong thanh ghi TMOD
            + khởi động bộ định thời.
            + Xây dựng chương trình chính và các chương trình con cần thiết.
            + xây dựng chương trình phục vụ ngắt thực hiện 1 công việc mong muốn (xác định rõ địa chỉ ngắt theo thứ tự ngắt trong bảng vector ngắt)
      - Chú ý: trong chương trình phục vụ ngắt các bạn phải xoá cờ báo tràn TFx và nạp lại giá trị cho bộ định thời với chế độ 1 còn chế độ 2 thì không cần.
   1.3. bài toán:
      Bài toán 1: sử dụng bộ định thời với ngắt của nó tạo một xung vuông với tần số 1kHZ đối xứng (50% mức 1 và 50% mức 0 ) trên chân P1.0.
Bài giải:
   - ta có : f = 1kHZ → T =  1/1000s = 1000us → TON = TOFF = T/2 = 500us. Như vậy chu kì xung là đối xứng nên hai phần này bộ đếm đếm giống nhau(tạo trễ khoảng thời gian bằng nhau). nửa chu kì đầu bộ đếm tạo trễ 500us cho mức 0, sau khi bộ đếm đếm đến giá trị đỉnh của thanh ghi chứa là FFFF thì cờ báo TFx = 1 gây ngắt, vi điều khiển phải chuyển vào chương trình phục vụ ngắt và sẽ lật trạng thái xung ra. Trong nửa chu kì còn lại cũng như vậy và cứ như thế.
   - Do thời gian trễ là 500us do đó ta chọn chế độ 16 bit, sử dụng kết quả từ ví dụ trên để nạp giá trị ban đầu cho TH và TL.
   - Chương trình điều khiển:
      /*================khai bao thu vien===============*/
      #include<AT89x51.h>
 
      /*=============khai bao bien=====================*/
      sbit xung = P1^0;
      /*==============khai bao ham ==================*/
      /*--------------------------chuong trinh phuc vu ngat timer0 tao xung--------------------*/
      void  timer0_int(void) interrupt 1
       {
            TF0=0; // xoa co bao tran timer0
            xung = !xung; // tao muc 1 ra chan P1.0
            TH0 = 0xfe; // (65536-500)↔hex =0fe0c (thach anh 12MHz)
            TL0 = 0x0c;
       }
      /*=============chuong trinh chinh=============*/
      void main(void)
      {
            EA = 1; // cho phep ngat toan cuc
            ET0 = 1; // cho phep ngat T0
            TMOD = 0x01; // timer0 che do 1
            xung = 0; //gia tri ban dau cua xung muon tao
            TH0 = 0xfe; // (65536-500)↔hex =0fe0c (thach anh 12MHz)
            TL0 = 0x0c;
            TR0 = 1; // khoi dong timer
            while(1) PCON|=1; //khong lam gi ca de doi ngat.
      }
      Bài toán 2: sử dụng bộ định thời với ngắt của tạo đồng hồ số hiển thị lên LCD.


 
+ Chương trình:
/*================khai bao thu vien===============*/
 
 #include<regx51.h>
 #include<string.h>
 
 #define LCDdata P2
 sbit RS=P3^0;
 sbit RW=P3^1;
 sbit EN=P3^2;
 sbit BF=LCDdata^7;
 #include"lcd.h"
/*=============khai bao bien=====================*/
 unsigned char data Time[8];
 unsigned char data i;
 
/*==============khai bao ham ==================*/
 void T10ms(void) interrupt 1 using 0
 {
            TR0=0;
            TH0=0xD8;
            TL0=0xEF;
            TR0=1;
            if(Time[0]==9){
                        Time[0]=0;
                        if(Time[1]==9){
                                    Time[1]=0;
                                    if(Time[2]==9){
                                                Time[2]=0;
                                                if(Time[3]==5){
                                                            Time[3]=0;
                                                            if(Time[4]==9){
                                                                        Time[4]=0;
                                                                        if(Time[5]==5){
                                                                                    Time[5]=0;
                                                                                    if(Time[6]==9&&Time[7]<2){
                                                                                                Time[6]=0;
                                                                                                Time[7]++;
                                                                                    }else if(Time[6]==3&&Time[7]==2){
                                                                                                Time[6]=0;
                                                                                                Time[7]=0;
                                                                                    }else Time[6]++;
                                                                        }else Time[5]++;
                                                            }else Time[4]++;
                                                }else Time[3]++;
                                    }else Time[2]++;
                        }else Time[1]++;
            }else Time[0]++;        
            LCDwrite(Time[7]+48);LCDwrite(Time[6]+48);LCDwrite(':');
            LCDwrite(Time[5]+48);LCDwrite(Time[4]+48);LCDwrite(':');
            LCDwrite(Time[3]+48);LCDwrite(Time[2]+48);LCDwrite(':');
            LCDwrite(Time[1]+48);LCDwrite(Time[0]+48);
            LCDcontrol(0xC0);
 }
            /*==============Chuong trinh chinh ==================*/
 void main()
 {          
            TMOD|=1;
            EA=1;
            ET0=1;
            TH0=0xD8;
            TL0=0xEF;     
            for(i=0;i<8;i++)Time=0;
            LCDinit();
            LCDwrites("Dong ho so");
            LCDcontrol(0xC0);
            TR0=1;           
            while(1)PCON|=1;
 }
 
  2. Lập trình với các ngắt ngoài của vi điều khiển.
    2.1. Khái niệm:
       - bộ vi điều khiển 8051có hai ngắt ngoài là INT0 và INT1 với 2 chân tác động đầu vào tương ứng là P3.2 và P3.3.
      - Ngắt ngoài là ngắt của vi điều khiển mà tác động ngắt ở đây chính là các tác động bên ngoài của vi điều khiển tác động vào vi điều khiển thong qua các chân ngắt đưới dạng một tín hiệu điện áp dạng xung.
      - tác động ngắt ngoài có hai dạng là tác động theo dạng mức và dạng sườn.
            + kích hoạt theo mức: ở chế độ này các chân INT0 và INT1 bình thường ở mức cao giống như các chân khác của vi điều khiển, khi có tín hiệu mức thấp cấp tới thì tín hiệu này kích hoạt ngắt. lưu ý là trước khi thực hiện lệnh cuối cùng của chương trình phục vụ ngắt thì mức thấp tại các chân ngắt phải được chuyển lên mức cao, nếu không sẽ lại gây ra một ngắt ngay lập tức.
            + Kích hoạt theo sườn: bình thường các chân ngắt của vi điều khiển ở mức cao, khi có tín hiệu tác động vào chúng có dạng sườn xuống thì sẽ tác động ngắt.
      - Để sử dụng chế độ ngắt này thì phải tác động vào thanh ghi TCON cụ thể là TCON.1=1 hoặc IT0=1 thì cho phép ngắt ngoài 0 kích hoạt sườn, còn TCON.2=1 hoặc IT1=1 thì cho phép ngắt ngoài 1 kích hoạt sườn.
   2.2. cách lập trình:
      - Để lập trình cho ngắt của vi điều khiển ta phải thực sự hiệu bản chất của ngắt và quá trình thực hiện ngắt của vi điều khiển diễn ra.
      - mẫu viết hàm ngắt như sau:
            Void name(void)interrupt x(x là số thứ tự ngắt ngoài x = 0 hoặc 2)
              {
                                    //chương trình phục vụ ngắt
              }  
      - Trong chương trình chính ta phải có thao tác thiết lập việc cho phép các ngắt được sử dụng.
   2.3. bài toán:
            [i]sử dụng ngắt ngoài của vi điều khiển với nhiệm vụ là: bình thường vi điều khiển bật một Led đơn tại chân P1.0 và khi có ngắt ngoài thì tắt Led ở P1.0 và bật Led ở chân P1.1 sau 1s thì bật lại Led P1.0  và tắt Led P1.1.

[/i]

Bài giải:
            /*==================Bo tien xu li===================*/
                        #include<AT89x51.h>   // Dinh kem file thu vien
                        #define  bat  1               // Dinh nghia gia tri bat den Led
                        #define  tat  0                // Dinh nghia gia tri tat den Led
                        /*==================khai bao bien==================*/
                        sbit  Led1 = P1^0;  // Khai bao bi?n Led ki?u bit chan P1.0
                        sbit  Led2 = P1^1;  // Khai bao bi?n Led ki?u bit chan P1.0
                        /*================= Khai bao hàm==================*/
                        /*------------------------------ham tre -------------------------------------*/
                        void  delay(long  time)
                         {
                                    while(time--);
                         }
                        void INT_0(void) interrupt 0  // chuong trinh phuc vu ngat
                        {
                                    Led1=tat;
                                    Led2=bat;
                                    delay(25000);
                                    Led1=bat;
                                    Led2=tat;
                        }
                        /*--------------------------------ham chinh--------------------------------*/
                        void main(void)
                        {
                                    EA=1;  // cho phep ngat toan cuc
                                    EX0=1;  // cho phep ngat ngoai 0
                                    IT0=1; //ngat kich phat suon
                                    Led1=bat;
                                    Led2=tat;
                                    while(1);
                        }  



Bài 6: Điều khiển động cơ DC, động cơ Servo, động cơ bước

1. Đông cơ DC
2. Động cơ Servo
3. Động cơ bước (Step motor)
            Điều khiển động cơ bước với tốc độ tăng dần từ 5 đến 100 v/p, mỗi lần chuyển tốc độ tăng 5v/p thời gian chuyển 1s, hiển thị tốc độ trên LCD.


+ Chương trình:
#include<regx51.h>
 #include<string.h>
 
 #define LCDdata P2
 sbit RS=P3^0;
 sbit RW=P3^1;
 sbit EN=P3^2;
 sbit BF=LCDdata^7;
 #include"lcd.h"
 
 unsigned char data Bytecao1,Bytethap1;
 unsigned char data Buoc,Nbuoc;
 unsigned char data Mbuoc[4]={144,192,96,48};
 
 void viewspeed(unsigned char speed);
 void Xuly(unsigned char Nspeed);
 
 
 void Dkdongco(void) interrupt 1 using 0
 {
            TR0=0;           
            TH0=Bytecao1;
            TL0=Bytethap1;
            TR0=1;           
            P1=Mbuoc[Buoc];
            Buoc++;
            if(Buoc==4)Buoc=0;
 }
 
 void Xuly(unsigned char speed)
 {
            unsigned int data Chuki1,Chuki2;
            unsigned int data tam1,tam2;
            TR0=0;
            viewspeed(speed);
            Nbuoc=200;
            tam2=10000/Nbuoc;
            tam1=6000/speed;   
            Chuki1=tam1*tam2;
            Chuki2=65535-Chuki1;
            Bytecao1=Chuki2/256;
            Bytethap1=Chuki2%256;
            TR0=1;
 }
 
 void delay(unsigned long time)
 {
            while(time--);
 }
 void viewspeed(unsigned char speed)
 {
            unsigned char data a1,a2;
            LCDcontrol(0xc0);
            a1=speed%10;
            speed=speed/10;
            a2=speed%10;
            speed=speed/10;     
            LCDwrite(speed+48);
            LCDwrite(a2+48);
            LCDwrite(a1+48);
            LCDwrites("(vong/phut)");
 }
                                                                                                               
 void main()
 {                                  
            unsigned char data i;
            TMOD=17;                 
            EA=1;
            LCDinit();
            ET0=1;
            LCDcontrol(0x80);
            LCDwrites("CT DK DC buoc" );
            LCDcontrol(0xc0);
            LCDwrites("V:5-100(v/p)");
            delay(100000);
            while(1){
                        Buoc=2;
                        for(i=5;i<101;i=i+5){                         
                                    LCDcontrol(0x01);
                                    LCDcontrol(0x80);
                                    LCDwrites("CT DK DC buoc" );
                                    Xuly(i);
                                    delay(500000);
                        }                       
            }           

}
Bài 7: Giao tiếp Vi điều khiển với Máy tính

I. Cổng truyền thông nối tiếp
            
1. Thanh ghi SCON – SBUF
II. Xây dựng chương trình
1. Chương trình VB
            + Giao diện


            + Thuật toán
            + Chương trình:
 
Option Explicit
Dim Mau As Byte
Private Sub cbcolor_Click()
    If (cbcolor.Text = "Mau do") Then
        Mau = 1
        txtchu.ForeColor = &HFF&
        lbHienthi.ForeColor = &HFF&
    ElseIf (cbcolor.Text = "Mau xanh") Then
        Mau = 2
        txtchu.ForeColor = vbGreen
       lbHienthi.ForeColor = &HFF00&
    ElseIf (cbcolor.Text = "Mau cam") Then
        Mau = 3
        txtchu.ForeColor = &H80FF&
      lbHienthi.ForeColor = &H80FF&
    End If
End Sub
 
Private Sub cbcolor_GotFocus()
    SendKeys "%{DOWN}"
End Sub
 
Private Sub cmdCode_Click()
    MsgBox Code(txtchu)
End Sub
 
Private Sub cmdExit_Click()
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
    End
 
End Sub
Function Code(s As String) As String
   Dim i As Integer
       s = Replace(s, " ", "")
    For i = 1 To Len(s)
       Code = Code & " " & Asc(Mid(s, i, 1))
    Next
    
End Function
Private Sub OpenPort()
    Dim s As String
    MSComm1.Settings = "57600,N,8,1"
    MSComm1.CommPort = 1
    MSComm1.PortOpen = True
    MSComm1.InputLen = 0
    s = MSComm1.Input
    MsgBox "Port did open"
End Sub
Private Sub cmdOpenport_Click()
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
    OpenPort
       
End Sub
 
Private Sub cmdSend_Click()
 
Dim s As String
 
If MSComm1.PortOpen = False Then
    MsgBox "Port did not open"
    OpenPort
End If
 
If MSComm1.PortOpen Then
    txtchu.Text = UCase(txtchu.Text)
    s = Chr(Mau) & Chr(Len(txtchu.Text)) & txtchu.Text & Chr(255)
    Do While (MSComm1.OutBufferCount > 0)
    Loop
    MSComm1.Output = s
End If
    
End Sub
 
Private Sub cmdStop_Click()
    MSComm1.Output = Chr(250)
    MsgBox "Port Stoped"
End Sub
 
Private Sub Form_Load()
   
    txtchu.ForeColor = vbRed
    txtchu.Text = "DO AN GHEP NOI"
    Mau = 1
    
End Sub
 
Private Sub Form_Resize()
    If (Me.WindowState = 1) Then
        Me.Height = 4000
        Me.Width = 7230
    End If
End Sub
 
Private Sub txtchu_GotFocus()
    txtchu.SelStart = 0
    txtchu.SelLength = Len(txtchu)
End Sub
 
2. Chương trình vi điều khiển
            + Thuật toán
            + Chương trình:
/************Khai bao tien xy ly***************/
 #include<regx51.h>
/*********Dinh nghia hang so mau**********/
 #define Mdo 1
 #define Mxanh 2
 #define Mcam 3
/*****Khai bao mang ki tu gom chu so va chu cai****/
 unsigned char code Mchar[36][7]={
            48,0,126,129,129,129,126,/*0*/
            49,0,0,33,65,255,1,/*1*/
            50,0,99,135,137,145,97,/* 2 */
            51,0,66,129,145,145,110,/* 3 */
            52,0,24,40,72,255,8,/* 4 */
            53,0,226,145,145,145,142,/* 5 */
            54,0,118,137,137,137,70,/* 6 */
            55,0,128,135,136,144,224,/* 7 */
            56,0,110,145,145,145,110,/* 8 */
            57,0,102,145,145,145,110,/* 9 */
            65,0,63,72,136,72,63,/* A */
            66,0,255,145,145,145,110,/* B */
            67,0,126,129,129,129,70,/* C */
            68,0,255,129,129,129,126,/* D */
            69,0,255,145,145,145,129,/* E */
            70,0,255,144,144,144,128,/* F */
            71,0,126,129,129,137,78,/* G */
            72,0,255,16,16,16,255,/* H */
            73,0,129,129,255,129,129,/* I */
            74,0,2,129,130,252,128,/* J */
            75,0,255,24,36,66,129,/* K */
            76,0,255,1,1,1,1,/* L */
            77,0,255,64,32,64,255,/* M */         
            78,0,255,96,24,6,255,/* N */
            79,0,126,129,129,129,126,/* O */
            80,0,255,144,144,144,96,/* P */
            81,0,126,129,133,130,125,/* Q */
            82,0,255,144,144,144,111,/* R */
            83,0,98,144,144,144,78,/* S */
            84,0,128,128,255,128,128,/* T */
            85,0,254,1,1,1,254,/* U */
            86,0,252,2,3,2,252,/* V */
            87,0,255,12,3,12,255,/* W */
            88,0,199,40,16,40,199,/* X */
            89,0,224,16,15,16,224,/* Y */
            90,0,131,133,153,161,193/* Z */
            };
 /*******Dinh nghia cac chan va cac cong dieu khien*****/
 sfr Pxanh=0x90;
 sfr Pdo=0xA0;
 
 sbit Clear=P3^4;
 sbit Data=P3^3;
 sbit Clock=P3^2;
 /**************Khai bao bien toan cuc*************/
 unsigned char data Ktnhan,nhanmau,j,i,Maxc,Count,nLap;
 unsigned char data Mau,Chay,tam,dem;
 unsigned char data            MC[76],MQ[32];
/**********Khoi ham chuong trinh**********/
// Ham ngat noi tiep
 void Ngatnoitiep(void) interrupt 4 using 0
 {
            if(RI){
                        RI=0;
                        tam=SBUF;               
                        if(tam==250){
                                    Chay=1;i=j=77;dem=8;
                                    Count=0;
                                    Clear=0;
                        }else{
                                    if(nhanmau){
                                                Mau=tam;
                                                Chay=1;i=j=77;dem=8;
                                                Count=nhanmau=0;
                                                P1=P2=0;
                                                Clear=0;
                                    }else if(tam==255){                                       
                                                Clear=1;
                                                Chay=0;
                                                Ktnhan=nhanmau=1;
                                    }else{
                                                if(Ktnhan){
                                                            Maxc=tam;
                                                            Ktnhan=0;
                                                }else if(Count<76&&Count<Maxc){
                                                            MC[Count]=tam;
                                                            Count++;
                                                }
                                    }
                        }
            }
 }
 void Khoitao(void)
 {          
            PCON|=128;
            EA=1;
            ES=1;
            SM0=0;
            SM1=1;
            Ktnhan=nhanmau=1;
            Chay=1;         
            P0=P1=P2=0;
            P3_0=1;
            nLap=1;
 }
 // Ham tao tre
 void delay(void)
 {
            unsigned char data i;
            i=10;
            while(i--);
 }
 // Ham hien thi mau cam
 void Cam(void)
 {
            while(nLap--)
            {
                        Data=1;
                        for(j=0;j<32;j++){
                                    Clock=1;
                                    Data=0;                      
                                    Clock=0;
                                    Pdo=Pxanh=MQ[j];
                                    delay();
                                    Pxanh=Pdo=0;
                        }
            }
 
 }
 // Ham hien thi mau xanh
 void Xanh(void)
 {
            while(nLap--)
            {
                        Data=1;
                        for(j=0;j<32;j++){
                                    Clock=1;
                                    Data=0;                      
                                    Clock=0;
                                    Pxanh=MQ[j];
                                    delay();
                                    Pxanh=0;
                        }
            }
            
 }
 // Ham hien thi mau do
 void Do(void)
 {
            while(nLap--)
            {
                        Data=1;
                        for(j=0;j<32;j++){
                                    Clock=1;
                                    Data=0;                      
                                    Clock=0;
                                    Pdo=MQ[j];
                                    delay();
                                    Pdo=0;
                        }
            }
 }
 // Ham thay doi mang hien thi
 void change(void)
 {
            MQ[0]=MQ[1];MQ[1]=MQ[2];MQ[2]=MQ[3];MQ[3]=MQ[4];
            MQ[4]=MQ[5];MQ[5]=MQ[6];MQ[6]=MQ[7];MQ[7]=MQ[8];
            MQ[8]=MQ[9];MQ[9]=MQ[10];MQ[10]=MQ[11];MQ[11]=MQ[12];
            MQ[12]=MQ[13];MQ[13]=MQ[14];MQ[14]=MQ[15];MQ[15]=MQ[16];
            MQ[16]=MQ[17];MQ[17]=MQ[18];MQ[18]=MQ[19];MQ[19]=MQ[20];
            MQ[20]=MQ[21];MQ[21]=MQ[22];MQ[22]=MQ[23];MQ[23]=MQ[24];
            MQ[24]=MQ[25];MQ[25]=MQ[26];MQ[26]=MQ[27];MQ[27]=MQ[28];
            MQ[28]=MQ[29];MQ[29]=MQ[30];MQ[30]=MQ[31];
 }
 // Ham tim vitri ki tu hien thi trong bang chu cai va chu so
 unsigned char Chiso(unsigned char chr)
 {
            unsigned char data End,Start,Mid,Mctam;
            if(chr==Mchar[0][0]){
                        return 0;
            }else if(chr==Mchar[35][0]){
                        return 35;
            }else{
                        End=35;
                        Start=0;
                        while(1){
                                    Mid=(End+Start)/2;
                                    Mctam=Mchar[Mid][0];
                                    if(chr==Mctam){
                                                return Mid;
                                    }else if(chr<Mctam){
                                                End=Mid;
                                    }else{
                                                Start=Mid;
                                    }
                        }
            }
 }
 void Chaychu(void)
 {
            unsigned char vitri;
            
            for(j=0;j<32;j++){
                        MQ[j]=0;
            }
            for(i=0;i<Count;i++)
            {                       
                        if(MC==32){
                                    change();
                                    MQ[31]=0;
                                    if(Mau==Mxanh)Xanh();
                                    else if(Mau==Mdo)Do();
                                    else Cam();                            
                                    change();
                                    MQ[31]=0;
                                    if(Mau==Mxanh)Xanh();
                                    else if(Mau==Mdo)Do();
                                    else Cam();
                        }else{
                                    vitri=Chiso(MC[i]);
                                    for(dem=1;dem<7;dem++){
                                                change();
                                                MQ[31]=Mchar[vitri][dem];
                                                if(Mau==Mxanh)Xanh();
                                                else if(Mau==Mdo)Do();
                                                else Cam();
                                    }
                        }
            }
            if(!Chay){
                        for(i=0;i<32;i++){
                                    change();
                                    MQ[31]=0;
                                    if(Mau==Mxanh)Xanh();
                                    else if(Mau==Mdo)Do();
                                    else Cam();
                        }
            }
 }
// Chuong trinh chinh
 void main()
 {
            Khoitao();
            REN=1;
            while(1){
                        while(Chay);
                        Chaychu();
            }
 }

 
[/i]
[/hide]

[/hide]

_________________
Electronicsolid.forumvi.com: shock:
avatar
Admin
Administrator
Administrator

Tổng số bài gửi : 24
Points : 6959
Reputation : 0
Join date : 07/11/2015
Age : 25
Đến từ : Viet Nam

http://electronicsolid.forumvi.com

Về Đầu Trang Go down

- Similar topics
Share this post on: Excite BookmarksDiggRedditDel.icio.usGoogleLiveSlashdotNetscapeTechnoratiStumbleUponNewsvineFurlYahooSmarking

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết