Thông báo

Collapse
No announcement yet.

xin giúm đỡ về ngắt trong VDK

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • xin giúm đỡ về ngắt trong VDK

    em đang mò về lập trình c, em đang viết thử đoạn chương trình điều khiển led & đoạn cho đếm lên, xin các tiền bối chỉ dẫn giùm em về ngắt time dùng để quét led 7 đoạn. em có tham khảo ở các vidu mà làm hoài khong chạy mấy anh giúm em sửa lỗi và chỉ em cách dùng ngăt time với. đây là đoạn chương trình em viết:

    #include <REGX51.H>
    #define down P2_0
    #define mode P2_1
    #define up P2_2
    #define led_dv P2_3
    #define led_ch P2_4
    #define led_tr P2_5
    #define led_ng P2_6
    #define data_led P0
    unsigned char mang[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
    unsigned char don_vi=0, chuc=0, tram=0, ngan=0;
    unsigned int x=0;void delay_ms(unsigned int time);

    void delay_ms(unsigned int time);
    void tang_giam(void);
    void display(void);
    void init(void);

    void delay_ms(unsigned int n)
    {
    unsigned int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<100;j++);

    }

    void main(void)

    {
    init();
    while(1)
    {
    x++;
    delay_ms(10);
    if(x==10000)
    {
    x=0;
    }
    }
    }

    void display(void)
    {
    led_dv=0;
    data_led=mang[x%10];
    delay_ms(1);
    led_dv=1;
    data_led=255;

    led_ch=0;
    data_led=mang[(x%100)/10];
    delay_ms(1);
    led_ch=1;
    data_led=255;

    led_tr=0;
    data_led=mang[(x/100)%10];
    delay_ms(1);
    led_tr=1;
    data_led=255;

    led_ng=0;
    data_led=mang[x/1000];
    delay_ms(1);
    led_ng=1;
    data_led=255;
    }

    void init(void)
    {
    IE=0x82;
    TMOD=0x01;
    TH0=0x3C;
    TL0=0Xaf;
    TR0=1;
    }
    void time0(void) interrupt 1 using 0
    {
    TR0=0;
    TH0=0x3C;
    TL0=0Xaf;
    TR0=1;
    display();
    }



    đây là mô phỏng: mo phong.rar

  • #2
    Cái timer ấy có ngắt được rồi. Nhưng vấn đề là ở chỗ quét led thôi.TH này có 4 con led và tốc độ quét phải lớn hơn 24h/s một chút. Tức là một con led sẽ chỉ được bật trong thời gian tối đa là (1/24/4)s và sau đó là con led tiếp theo được bật. Tất nhiên là mỗi lần chuyển led thì phải suất giá trị hiển thị thích hợp cho con led đó. Chú ý là con led sẽ sáng liên tục cho tới khi con khác được bật. Không nên bật 1 ms rồi tắt một ms như cậu.
    Theo mình là một lần ngắt chỉ hiển thị một led.Không dùng delay vì tốn thời gian xử lí cho con 8051.Nội dung mỗi lần ngắt là hiển thị chữ số hiện tại, tắt led trước đó và tính toán giá trị cần hiển thị cho led tiếp theo.

    Còn mình học 8051 thì chỉ viết bằng asm nên chẳng biết tư vấn viết bằng C như thế nào cho thuân tiện cả.

    Comment


    • #3
      mo phong.zipTheo ý mình hiểu , bạn muốn dùng timer để tự động đếm tiến và hiển thị led 7 thanh bằng chuơng trình quyét led.
      Bạn koc ần dùng not , bạn hãy bỏ not đi và paste code mình vừa sửa ho bạn đây.
      Code:
      #include<at89x51.h>
      #define DATA  P0
      #define led4  P2_2
      #define led3  P2_3
      #define led2  P2_4
      #define led1  P2_5
      //==========================================
      unsigned char maled[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
      unsigned char i,k,chuc,donvi,tram,nghin;
      void delay(unsigned char ms)
          {
      	while(ms--)
      	   {
      	   for(i=0;i<125;i++);
      	   }
      	}
      void Display(unsigned char u)
          { 	nghin = u/1000;
      	    tram  = (u%1000)/100;
      		chuc  = ((u%1000)%100)/10;
      		donvi = ((u%1000)%100)%10;
      		led4 = 1;
      		DATA=maled[nghin];
      		delay(1);
      		led4=0;
      		DATA=0xFF;
      		//=============
      	    led3 = 1;
      		DATA=maled[tram];
      		delay(1);
      		led3=0;
      		DATA=0xFF;
      		//=============
      	    led2 = 1;
      		DATA=maled[chuc];
      		delay(1);
      		led2=0;
      		DATA=0xFF;
      		//=============
      	    led1 = 1;
      		DATA=maled[donvi];
      		delay(1);
      		led1=0;
      		DATA=0xFF;
      	}
      void main()
         {
         IE = 0x82;	 // hieu hoa ngat timer 0;
         TMOD = 0x01;	 // timer 0 che do 1-16 bit
         TH0 = 0x3C;
         TL0 = 0xB0;
         TR0=1;	 // khoi tao timer 0
         k=0;
         while(1)
            {
      	 //==========================
      	  Display(k);
      	  }
      }   
      void ISR_TIMER0(void) interrupt 1 
         {  
         int n;
         n++;
         if(n==15)
            {
      	  n=0;
      	  k++;
      	  if(k==9999) k=0;
      	  }
         }
      Hy vọng là đúng ý bạn, Chúc thành công
      mô phỏng lại nè :
      http://www.mediafire.com/file/s7gpup...y/mo_phong.rar
      Last edited by tiendientu; 13-11-2012, 09:04.

      Comment


      • #4
        Nguyên văn bởi tiendientu Xem bài viết
        [ATTACH]55447[/ATTACH]Theo ý mình hiểu , bạn muốn dùng timer để tự động đếm tiến và hiển thị led 7 thanh bằng chuơng trình quyét led.
        Bạn koc ần dùng not , bạn hãy bỏ not đi và paste code mình vừa sửa ho bạn đây.

        Hy vọng là đúng ý bạn, Chúc thành công
        mô phỏng lại nè :
        http://www.mediafire.com/file/s7gpup...y/mo_phong.rar
        dùng timer quét led chứ ko phải dùng timer để đếm

        Code:
        #include <REGX51.H>
        #define down P2_0
        #define mode P2_1
        #define up P2_2
        #define led_dv P2_3
        #define led_ch P2_4
        #define led_tr P2_5
        #define led_ng P2_6
        #define data_led	P0
        unsigned char mang[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
        unsigned char don_vi=0, chuc=0, tram=0, ngan=0,i=0;
        unsigned int x=0;void delay_ms(unsigned int time);
        
        void delay_ms(unsigned int time);
        void tang_giam(void);
        void display(void);
        void init(void);
        
        void delay_ms(unsigned int n)
        {
        unsigned int i,j;
        for(i=0;i<n;i++)
        for(j=0;j<100;j++);
        
        }
        
        void main(void)
        
        {
        init();	
        while(1)
        {
        x++;
        delay_ms(200);
        if(x==10000)
        {
        x=0;
        }
        }
        }
        
        void display(void)
        {
        i++;
        switch (i) {
            case 1:
        led_ng=0;
        led_dv=1;
        data_led=mang[x%10];
            break;
            case 2:
        led_dv=0;
        led_ch=1;
        data_led=mang[(x%100)/10];
            break;
        	case 3:
        led_ch=0;
        led_tr=1;
        data_led=mang[(x/100)%10];
            break;
        	case 4:
        led_tr=0;
        led_ng=1;
        data_led=mang[x/1000];
        i=0;
            break;
        };
        }
        
        void init(void)
        {
        IE=0x82;
        TMOD=0x01;
        TH0=0x3C;
        TL0=0Xaf;
        TR0=1;
        }
        void time0(void) interrupt 1 using 0
        {
        TH0=0xe7;
        TL0=0xc8;
        display();
        }
        Last edited by chung1608; 13-11-2012, 10:54.

        Comment


        • #5
          thank ban zerotohero nhé , mình đã sưa được rồi , bạn nói đúng thời gian quét led nhan quá led ko sáng dc. giờ mình muốn sử dụng cả 2 time ngắt .time0 dùng để quét led, time1 dùng để đếm thời gian để cài đạt thời gian hen giờ chạy 1 phút là dừng lại. các bạn chỉ giùm minh với . cho mình 1 code đơn giản cho dễ hiểu nhé thank

          Comment


          • #6
            Vậy chỉ cần một timer thôi. Vì mình hay thêm các phần điều khiển nữa nên cần phải tiết kiệm timer cho việc khác. các làm như sau nhé. co thì không đổi nhiều đâu.
            Cấu hình timer0 tràn sau mỗi 1ms để tạo cái mà mình hày gọi là systick( hay sysclock).Sau đó khai báo các biến đại điện cho các timer mềm. Các timer này được tăng mỗi lần timer0 tràn.
            mình demo cách làm cho yêu cầu là vừa quét led.Giá trị hiển thị tăng sau 100ms. Đếm thời gian trong 1 phút ( tức là từ 0->599) rồi đứng yên ở đó theo ý cậu.
            Các phần khác của cậu thì mình cố gắng giữ nguyên.

            Code:
            #include <REGX51.H>
            #define     down 		P2_0
            #define     mode 		P2_1
            #define     up 		        P2_2
            #define     led_dv 		P2_3
            #define     led_ch 		P2_4
            #define     led_tr 		P2_5
            #define     led_ng 		P2_6
            #define     DataPort	        P0
            #define     ControlPort	        P2
            
            
            code unsigned char mang[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
            data unsigned char Output[4]={0,0,0,0},LedHienTai=1;			//output[0] chua so hang don vi,output[1] chua hang chuc......
            data unsigned int x=0,led_timer=0,counter_timer =0;
            
            void tang_giam(void);
            void display(unsigned char);
            void init(void);
            
            
            void main(void)
            {
            	init();	
            	while(1);
            }
            
            void display(unsigned char LedNumber)
            {
            	ControlPort &= 0x07;	//tat tat ca cac led va giua nguyen trang thai cai pin P2.0->P2.2
            	DataPort =	mang[Output[LedNumber-1]];
            	ControlPort = 0x07 | (0x04<<LedNumber);//set bit tuong ung dieu khien lednumber va giu nguyen pin P2.0->P2.2
            	
            }
            
            void init(void)				//timer0 che d0 16 bit va ngat sau 1ms
            {				
            IE=0x82;
            TMOD=0x01;
            TH0=0xFC;				
            TL0=0X17;
            TR0=1;
            }
            
            void time0(void) interrupt 1 using 0
            {
            	TR0=0;
            	TH0=0xFC;		//hieu chinh lai gia tri nay cho dung 1ms nhe
            	TL0=0X17;
            	TR0=1;
            	led_timer++;
            	counter_timer++;
            	if (counter_timer ==100) 		//tang gia tri can hien thi sau moi 100ms
            	{
            		counter_timer	=0;		// reset 
            		if (x<600)				//dem tu 0 toi 599 tuong duong 60s nhu yeu cau
            		{
            			unsigned int temp;
            			x++;		
            			temp=x;
            			Output[2]=temp/100;
            			temp -=100*Output[2];
            			Output[1]=temp/10;
            			temp -=10*Output[1];
            			Output[0]=temp;
            		}
            		
            	}
            	if (led_timer ==10) 		//thay doi led duoc chieu sang sau 10ms
            	{
            		led_timer=0;		//reset led_timer
            		LedHienTai++;		//thay doi vi tri led muon hien thi
            		if(LedHienTai >4) LedHienTai =1;
            		display(LedHienTai);
            	}
            }
            còn thích dùng 2 timer thì tự chỉnh lại nhé
            file mô phỏng mo phong.zip

            Comment


            • #7
              ai có tài liều về ngắt timer gửi cho mình với

              Comment


              • #8
                Hihi thank fero nhìu mình làm dc ồi.

                Comment


                • #9
                  [ATTACH]55662[/ATTACH]
                  Nguyên văn bởi quanghuyc9dt Xem bài viết
                  ai có tài liều về ngắt timer gửi cho mình với
                  dọc thử cái này nhé
                  - Thanh ghi IE: Thanh ghi cho phép ngắt
                  -

                  * EA: Nếu EA=0, không cho phép bất cứ ngắt nào hoạt động. Nếu EA=1, mỗi nguồn
                  ngắt riêng biệt được phép hoặc không được phép hoạt động bằng cách đặt hoặc xoá bit
                  Enable của nó.
                  * -: Không dùng, người sử dụng không nên định nghĩa cho Bit này, bởi vì nó có thể
                  được dùng ở các bộ AT89 trong tương lai.
                  * ET2: Bit cho phép hoặc không cho phép ngắt bộ Timer 2.
                  * ES: Bit cho phép hoặc không cho phép ngắt cổng nối tiếp (SPI và UART).
                  * ET1: Bit cho phép hoặc không cho phép ngắt tràn bộ Timer 1
                  * EX1: Bit cho phép hoặc không cho phép ngắt ngoài 1.
                  * ET0: Bit cho phép hoặc không cho phép ngắt tràn bộ Timer 0
                  * EX0: Bit cho phép hoặc không cho phép ngắt ngoài 0.

                  - Thanh ghi TMOD: Thanh ghi điều khiển kiểu Timer/Counter
                  -

                  Dành cho Timer 1 Dành cho Timer 0
                  * GATE: Khi GATE=1 và TRx =1, bộ TIMER/COUTERx hoạt động chỉ khi
                  chân INTx ở mức cao. Khi GATE=0, bộ TIMER/COUNTERx sẽ hoạt động chỉ khi
                  TRx=1.
                  * C/(/T): Bit này cho phép chọn chức năng là Timer hay Counter.
                  - Bit này =0 thì thực hiện chức năng Timer
                  - Bit này =1 thì thực hiện chức năng Counter
                  * M0, M1: Bit chọn Mode, để xác định trạng thái và kiểu Timer/Counter:
                  - M1=0, M0=0: Chọn kiểu bộ Timer 13 bit. Trong đó THx dài 8 bit, còn TLx dài 5 bit.
                  - M1=0, M0=1: Chọn kiểu bộ Timer 16 bit. THx và TLx dài 16 bit được ghép tầng.
                  - M1=1, M0=0: 8 bit Auto reload. Các thanh ghi tự động nạp lại mỗi khi bị tràn. Khi
                  bộ Timer bị tràn, THx dài 8 bit được giữ nguyên giá trị, còn giá trị nạp lại được đưa vào TLx.
                  - M1=1, M0=1: Kiểu phân chia bộ Timer. TL0 là 1 bộ Timer/Counter 8 bit, được điều
                  khiển bằng các bit điều khiển bộ Timer 0, Còn TH0 chỉ là bộ Timer 8 bit, được điều
                  khiển bằng các bit điều khiển Timer 1.
                  - M1=1, M0=1: Timer/Counter 1 Stopped

                  Comment


                  • #10
                    tks bạn nhìu nhé

                    Comment


                    • #11
                      Các anh ơi giúp em cái này với ạ
                      So sánh 2 phương pháp lập trình tạo trễ trong 8051 là
                      1. Dùng Timer.
                      2. Dùng vòng lặp.
                      Cho em xin cái ví dụ nha.
                      Em cảm ơn các anh trước ạ.

                      Comment


                      • #12
                        HIx có ai không ạ giúp em với huhu

                        Comment

                        Về tác giả

                        Collapse

                        hahai1507 Tìm hiểu thêm về hahai1507

                        Bài viết mới nhất

                        Collapse

                        Đang tải...
                        X