Thông báo

Collapse
No announcement yet.

Nhờ mọi người chỉ bảo giúp,

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

  • Nhờ mọi người chỉ bảo giúp,

    Hiện tại mình đang làm 1 cái project đếm sp, sử dụng 3 hàng led:

    1> hàng led 1 là 4 led hiển thị sp đếm được
    2> hàng led 2 là 4 led hiển thị số cài đặt sp
    3> hàng led 3 là 2 led hiênt hị thời gian trễ giữa các sp

    Hiện giờ mình đang bị mắc ở chỗ hàng led số 2 là chỉ cài đặt được lên đến 0255 có thay đổi thế nào đi chăng nữa cũng chỉ hiển thị được vậy,

    đây là đoạn code cài đặt sp:

    //setting
    int _task_setting(void)
    {
    if(reset_flag){

    //code here
    counter_sp=0;
    reset_flag = 0;

    }
    if(c_up_flag){

    //code here
    if(blk_led_sum_flag){
    counter_sl++;
    if(counter_sl>9999)
    counter_sl=0;
    }
    c_up_flag = 0;


    }
    if(c_set_flag){

    blk_led_sum_flag=!blk_led_sum_flag;;
    //code here
    c_set_flag = 0;
    write_eeprom(0x02,counter_sl);
    }
    if(c_down_flag){
    if(blk_led_sum_flag){
    counter_sl--;
    }
    //code here
    c_down_flag = 0;

    }


    Nhờ mọi người chỉ giúp, làm thế nào để tăng giá trị cài đặt, mình muốn cài đặt được 9999, nhưng hiện tại mới chỉ cài đặt được có 0255 thôi, nhờ mọi người tư vấn chỉ giúp, cảm ơn nhiều,

    mình gửi cả file code có gì mọi người giúp đỡ nhé,

    Cảm ơn nhiều,
    main.txt

  • #2
    Nguyên văn bởi hahai Xem bài viết
    Hiện tại mình đang làm 1 cái project đếm sp, sử dụng 3 hàng led:

    1> hàng led 1 là 4 led hiển thị sp đếm được
    2> hàng led 2 là 4 led hiển thị số cài đặt sp
    3> hàng led 3 là 2 led hiênt hị thời gian trễ giữa các sp

    Hiện giờ mình đang bị mắc ở chỗ hàng led số 2 là chỉ cài đặt được lên đến 0255 có thay đổi thế nào đi chăng nữa cũng chỉ hiển thị được vậy,

    đây là đoạn code cài đặt sp:

    //setting
    int _task_setting(void)
    {
    if(reset_flag){

    //code here
    counter_sp=0;
    reset_flag = 0;

    }
    if(c_up_flag){

    //code here
    if(blk_led_sum_flag){
    counter_sl++;
    if(counter_sl>9999)
    counter_sl=0;
    }
    c_up_flag = 0;


    }
    if(c_set_flag){

    blk_led_sum_flag=!blk_led_sum_flag;;
    //code here
    c_set_flag = 0;
    write_eeprom(0x02,counter_sl);
    }
    if(c_down_flag){
    if(blk_led_sum_flag){
    counter_sl--;
    }
    //code here
    c_down_flag = 0;

    }


    Nhờ mọi người chỉ giúp, làm thế nào để tăng giá trị cài đặt, mình muốn cài đặt được 9999, nhưng hiện tại mới chỉ cài đặt được có 0255 thôi, nhờ mọi người tư vấn chỉ giúp, cảm ơn nhiều,

    mình gửi cả file code có gì mọi người giúp đỡ nhé,

    Cảm ơn nhiều,
    [ATTACH]52354[/ATTACH]
    bạn xem lại phần khai báo biến, mình đoán bạn khai báo kiểu "int" hoặc "unsigned int" bạn có thể thay đổi kiểu khai báo biến để có giá trị lớn hơn : vd "unsigned long" kiểu này 32bit chiếm 4byte bộ nhớ, giá trị đếm từ 0--->+4294967295. signed long 32bit 4byte -2147483648 đến +2147483647

    Comment


    • #3
      Các bạn có ai có ý kiến ì nữa ko ? các bạn vào chỉ bảo giúp mình với, file code mình có gửi kèm theo các bạn ai biết lỗi như trên vào chỉ bảo hoặc sửa giúp mình với,

      Xin chân thành cảm ơn,

      Comment


      • #4
        [code\]unsigned char counter_sp = 0;
        unsigned char counter_sl = 0;
        unsigned char counter_settime = 0;
        unsigned char counter_flag = 0; [\code]
        bạn thay dòng đó bằng
        [code\]unsigned int counter_sp = 0;
        unsigned int counter_sl = 0;
        unsigned int counter_settime = 0;
        unsigned int counter_flag = 0;
        [\code]vì bạn sử dụng kiểu unsigned char ( 1 byte ) giá trị tối đa là 255. còn unsigned int (2 byte) giá trị tối đa 65535.
        lập trình vi điều khiển 8051 - avr - pic- thiết kế mạch điện tử

        Học Hiểu Nguyên Tắc - Tuân Theo Nguyên Tắc - Giải Trừ Nguyên Tắc

        Comment


        • #5
          Cảm ơn bạn Tan955 đã chỉ dẫn, tuy nhiên hàm:

          [code\]unsigned int counter_sp = 0;
          unsigned int counter_sl = 0;
          unsigned int counter_settime = 0;
          unsigned int counter_flag = 0;

          chỉ cho ra kết quả = 535 thôi,

          mình đã sử dụng cả hàm:

          unsigned long counter_sp = 0;
          unsigned long counter_sl = 0;
          unsigned long counter_settime = 0;
          unsigned long counter_flag = 0;

          tuy nhiên khi nạp vào cắm nguồn nó hiện luôn 0255, cái này mình chưa hiểu lắm, có bạn nào dành về cái này chỉ giúp mình với,

          cảm ơn nhiều,

          Comment


          • #6
            các bạn trong diễn đàn có ai có cao kiến gì ko giúp mình với,

            dưới đây là code mình đã chỉnh sửa tuy nhiên vẫn chưa được, các bạn xem rồi cho mình ý kiến đóng góp với nhé,

            cảm ơn các bạn nhiều,

            Code:

            /************************************************** *********
            FileName: main.c
            MCU: 8051
            Xtal: 24Mhz
            App: Product Counter
            ************************************************** **********/
            #include <at89x52.h>
            #include <stdlib.h>
            #include <stdio.h>
            /**********************define var,port*********************/
            ////////////////////////////////////////////////////////////
            // //
            // dieu khien chon led //
            // //
            ///////////////////////////////////////////////////////////
            // //
            // buzzer //
            // //
            ///////////////////////////////////////////////////////////
            sbit buzzer = P1^0;
            sbit c_up = P1^1;
            sbit c_set = P1^2;
            sbit c_down = P1^3;
            sbit t_up = P1^4;
            sbit t_set = P1^5;
            sbit t_down = P1^6;
            sbit rst = P1^7;
            sbit input = P3^2;
            #define DATA_PORT P2
            sbit led_t0 = P3^6;
            sbit led_t1 = P3^7 ;
            sbit led_c0 = P0^0 ;
            sbit led_c1 = P0^1 ;
            sbit led_c2 = P0^2 ;
            sbit led_c3 = P0^3 ;
            #define LED_T0() sel_led(0)
            #define LED_T1() sel_led(1)

            #define LED_R0() sel_led(2)
            #define LED_R1() sel_led(3)
            #define LED_R2() sel_led(4)
            #define LED_R3() sel_led(5)

            #define LED_C0() sel_led(6)
            #define LED_C1() sel_led(7)
            #define LED_C2() sel_led(8)
            #define LED_C3() sel_led(9)

            unsigned char sw_led = 0;


            unsigned long counter_sp = 0;
            unsigned long counter_sl = 0;
            unsigned char counter_settime = 0;
            unsigned long counter_flag = 0;
            /*********************sub program**************************/

            //================================================== ========//
            // //
            // other //
            //================================================== ========//
            void check_key(void);
            int write_eeprom(unsigned char add,unsigned char dat);
            unsigned char read_eeprom(unsigned char add);
            int i2c_stop();
            int i2c_send_start(unsigned char dat);
            int i2c_send(unsigned char dat);
            unsigned char i2c_read();

            void delay(int time);
            int TIMER0_ini();
            int TIMER1_ini();
            int sel_led(char led);
            int _task_setting();
            bit c_up_flag = 0;
            bit c_set_flag = 0;
            bit c_down_flag = 0;
            bit t_up_flag = 0;
            bit t_set_flag = 0;
            bit t_down_flag = 0;
            bit reset_flag = 0;
            bit sp_delay_flag = 0;
            bit blk_led_t_flag= 0;
            bit blk_led_sum_flag=0;
            bit t_visible = 0;
            bit c_visible = 0;
            int sp_delay = 0;
            int blk_led_t=0,blk_led_sum=0;
            int t_delay[7] = {'\0'};
            int full_delay=0;
            int cycle_write = 0;
            bit write_flag = 0;
            char m_count=0;
            char time_setting=0;
            #define cv 700
            unsigned char code _7_segment[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
            unsigned char code HELLO[] = {
            0x00,0x00,0x00,0x00,
            0x00,0x76,0x79,0x38,0x38,0x3f,
            0x00,0x00,0x00,0x00};
            unsigned char MONITOR[10] = {
            0x01,0x02,/*t1,t0*/
            0x03,0x04,0x05,0x06,/*c0,c1,c2,c3*/
            0x07,0x08,0x09,0x00 /*r0,r1,r2,r3*/};
            /************************************************** ***/
            sbit I2CSDA = P3^1; //data I2c line
            sbit I2CSCL = P3^0; //CLOCK i2c line


            void intro()
            {
            unsigned int shift_time, index, count,sel=0;
            for(index=0;index<10;index++)
            {
            for(shift_time=0;shift_time<90;shift_time++) // toc do chay chu Hello
            {
            sel = 0;
            for(count=index;count<index+4;count++)
            {
            switch(sel)
            {
            case 0: DATA_PORT=0x00;LED_R3();DATA_PORT = HELLO[count];break;
            case 1: DATA_PORT=0x00;LED_R2();DATA_PORT = HELLO[count];break;
            case 2: DATA_PORT=0x00;LED_R1();DATA_PORT = HELLO[count];break;
            case 3: DATA_PORT=0x00;LED_R0();DATA_PORT = HELLO[count];break;
            default: break;
            }
            sel++;
            delay(50);
            }

            }


            }

            }
            /************************************************** ******/
            /* Main Program */
            /************************************************** ******/
            int main(void)
            {
            int i;
            buzzer = 1;

            // P2 = 0x4f;
            // P0 = 0x00;
            // led_t0 = 0;
            // led_t1 = 0;
            // while(1);
            intro();
            delay(1000);
            I2CSDA = 1;
            I2CSCL = 1;
            TIMER1_ini();
            TIMER0_ini();
            //enable global interrupt
            EX1 = 1;
            IT1 = 1; //hight to low
            EX0 = 1; //enable external interrupt 0
            IT0 = 1; //hight to low
            PT1 = 1;//interrupt priority timer 1 //UPS
            // PT0 = 1;//interrupt priority timer 0 //UPS

            EA = 1;

            // if(read_eeprom(0x00)!=0x01)
            // {
            // for(i=0;i<10;i++)
            // write_eeprom(i,0x00);
            // write_eeprom(0x00,0x01);
            // }
            //user code here


            counter_sp = read_eeprom(0x01);
            counter_sl = read_eeprom(0x02);
            counter_settime = read_eeprom(0x03);
            counter_flag = 1;

            TR1 = 1;
            TR0 = 1;

            while(1)
            {
            if(counter_flag&(!sp_delay_flag))
            {
            EX0 = 0;
            IE0 = 0;
            sp_delay = 120*counter_settime;
            sp_delay_flag = 1;
            counter_flag = 0;
            }

            check_key();
            _task_setting();
            if(write_flag)
            write_eeprom(0x01,counter_sp);

            }
            }


            //intro hello


            ////////////////////////
            void check_key(void){

            int i;
            if(rst==0){while(rst==0); write_eeprom(0x01,0);reset_flag = 1;} //reset
            if(t_down==0){while(t_down==0);t_down_flag =1;} //t_down
            if(t_set==0){while(t_set==0);t_set_flag = 1;} //t_set
            if(t_up==0){while(t_up==0);t_up_flag = 1;} //t_up
            if(c_down==0){while(c_down==0);c_down_flag =1;} //c_down
            if(c_set==0){while(c_set==0);c_set_flag = 1;} //c_set
            if(c_up==0){while(c_up==0);c_up_flag = 1;} //c_up




            }

            //setting
            int _task_setting(void)
            {
            if(reset_flag){

            //code here
            counter_sp=0;
            reset_flag = 0;

            }
            if(c_up_flag){

            //code here
            if(blk_led_sum_flag){
            counter_sl++;
            if(counter_sl>9999)
            counter_sl=0;
            }
            //code here
            c_up_flag = 0;


            }
            if(c_set_flag){

            blk_led_sum_flag=!blk_led_sum_flag;;
            //code here
            c_set_flag = 0;
            write_eeprom(0x02,counter_sl);
            }
            if(c_down_flag){
            if(blk_led_sum_flag){
            counter_sl--;
            if(counter_sl==0xff)
            counter_sl=9999;
            }
            //code here
            c_down_flag = 0;

            }
            if(t_up_flag){
            if(blk_led_t_flag){
            counter_settime++;
            if(counter_settime>99)
            counter_settime=0;
            }
            //code here
            t_up_flag = 0;

            }
            if(t_set_flag){

            blk_led_t_flag=!blk_led_t_flag;
            //code here
            t_set_flag = 0;
            write_eeprom(0x03,counter_settime);
            }
            if(t_down_flag){
            if(blk_led_t_flag){
            counter_settime--;
            if(counter_settime==0xff)
            counter_settime=99;
            }
            //code here
            t_down_flag = 0;
            }


            return 0;
            }

            int sel_led(char led)
            {
            switch(led){
            case 0: P3&=0x7f;P3|=0x40;P0=0xff;led_t1|=t_visible;break ;
            case 1: P3&=0xbf;P3|=0x80;P0=0xff;led_t0|=t_visible;break ;
            case 2: P0=0xef;P3|=0xc0;break;
            case 3: P0=0xdf;P3|=0xc0;;break;
            case 4: P0=0xbf;P3|=0xc0;break;
            case 5: P0=0x7f;P3|=0xc0;break;
            case 6: P0=0xfe;P3|=0xc0;led_c0|=c_visible;break;
            case 7: P0=0xfd;P3|=0xc0;led_c1|=c_visible;break;
            case 8: P0=0xfb;P3|=0xc0;led_c2|=c_visible;break;
            case 9: P0=0xf7;P3|=0xc0;led_c3|=c_visible;break;
            default: break;

            }
            return 0;
            }
            //================================================== ========//
            // //
            // delay //
            //================================================== ========//
            void delay(int time)
            {
            int i;
            i = time;
            while(i>0)i--;
            }
            //================================================== ========//
            // //
            // Timer0_ini //
            //================================================== ========//
            int TIMER0_ini(void)
            {
            TMOD = 0x01; //timer 1 16bit reload
            TH0 = 0x00;
            TL0 = 0x00;
            TF0 = 0;
            TR0 = 0;
            ET0 = 1; //enable interrupt timer1
            return 0;
            }
            //================================================== ========//
            // //
            // Timer1_ini //
            //================================================== ========//
            int TIMER1_ini(void)
            {
            TMOD |= 0x10; //timer 1 16bit reload
            TH1 = 0x00;
            TL1 = 0x00;
            TF1 = 0;
            TR1 = 0;
            ET1 = 1; //enable interrupt timer1
            return 0;
            }

            //================================================== ========//
            // //
            // Timer1_interrupt //
            //================================================== ========//
            void TIMER1_interrupt() interrupt 3
            {
            TR1 = 0; //stop timer1
            TF1 = 0; //clear TF1
            TH1 = 0;
            TL1 = 0;
            switch(m_count){
            case 0: MONITOR[0] = _7_segment[counter_settime/10];break;
            case 1: MONITOR[1] = _7_segment[counter_settime%10];break;
            case 2: MONITOR[2] = _7_segment[counter_sl%1000%100%10];break;
            case 3: MONITOR[3] = _7_segment[counter_sl%1000%100/10];break;
            case 4: MONITOR[4] = _7_segment[counter_sl%1000/100];break;
            case 5: MONITOR[5] = _7_segment[counter_sl/1000]; break;
            case 6: MONITOR[6] = _7_segment[counter_sp%1000%100%10];break;
            case 7: MONITOR[7] = _7_segment[counter_sp%1000%100/10];break;
            case 8: MONITOR[8] = _7_segment[counter_sp%1000/100]; break;
            case 9: MONITOR[9] = _7_segment[counter_sp/1000] ; break;
            default: break;
            }
            m_count++;
            if(m_count>9)
            m_count=0;
            if(full_delay>0&&counter_sp==counter_sl)
            full_delay--;
            else if(full_delay==0&&counter_sp==counter_sl) {
            buzzer = 1;
            counter_sp=0;
            }

            if(blk_led_t_flag)
            {
            if(blk_led_t>0)
            blk_led_t--;
            else {
            t_visible=!t_visible;
            blk_led_t=50;

            }
            }
            else
            t_visible=0;
            if(blk_led_sum_flag)
            {
            if(blk_led_sum>0)
            blk_led_sum--;
            else{
            c_visible=!c_visible;
            blk_led_sum=50;
            }
            }
            else
            c_visible=0;


            if(sp_delay_flag)
            {
            if(sp_delay>0)
            sp_delay --;
            else{
            IE0 = 0;
            EX0 = 1;
            sp_delay_flag = 0;
            write_flag = 1;

            }
            }

            TR1 = 1;

            }
            //================================================== ========//
            // //
            // Timer0_interrupt //
            //================================================== ========//
            void TIMER0_interrupt(void) interrupt 1
            {
            TR0 = 0; //stop timer1
            TH0 = 0xff;
            TL0 = 0x00;
            switch(sw_led)
            {
            case 0: DATA_PORT=0x00;LED_T0();DATA_PORT = MONITOR[sw_led];break;
            case 1: DATA_PORT=0x00;LED_T1();DATA_PORT = MONITOR[sw_led];break;
            case 2: DATA_PORT=0x00;LED_C0();DATA_PORT = MONITOR[sw_led];break;
            case 3: DATA_PORT=0x00;LED_C1();DATA_PORT = MONITOR[sw_led];break;
            case 4: DATA_PORT=0x00;LED_C2();DATA_PORT = MONITOR[sw_led];break;
            case 5: DATA_PORT=0x00;LED_C3();DATA_PORT = MONITOR[sw_led];break;
            case 6: DATA_PORT=0x00;LED_R0();DATA_PORT = MONITOR[sw_led];break;
            case 7: DATA_PORT=0x00;LED_R1();DATA_PORT = MONITOR[sw_led];break;
            case 8: DATA_PORT=0x00;LED_R2();DATA_PORT = MONITOR[sw_led];break;
            case 9: DATA_PORT=0x00;LED_R3();DATA_PORT = MONITOR[sw_led];break;
            default: break;
            }
            sw_led++;
            if(sw_led>9)
            sw_led=0;
            //user code here
            TF0 = 0; //clear TF1
            TR0 = 1;
            }
            //================================================== ========//
            // //
            // External Interrupt 1 //
            //================================================== ========//
            void EX1_interrupt(void)interrupt 2
            {
            EX1 = 0; // disable ex interrupt 1
            //user code here
            IE1 = 0;//clear external interrupt 1 flag
            EX1 = 1;
            }
            //================================================== ========//
            // //
            // External Interrupt 0 //
            //================================================== ========//
            void EX0_interrupt()interrupt 0
            {
            EX0 = 0; // disable ex interrupt 0
            if(counter_flag==0&&full_delay==0)
            {
            counter_sp++;
            if(counter_sp==counter_sl)
            {
            full_delay=150; // thoi gian loa keu
            counter_flag=0;
            buzzer = 0;
            }
            else
            counter_flag=1;
            }
            IE0 = 0;//clear external interrupt 1 flag
            EX0 = 1;//enable ext 0
            }
            //===================================
            //i2c_stop
            //===================================
            int i2c_stop()
            {
            I2CSDA = 0;
            I2CSCL = 1;
            I2CSDA = 1;
            delay(700);
            return 0;
            }

            //==================================
            // write_eeprom
            //==================================
            int write_eeprom(unsigned char add,unsigned char dat)
            {
            //=========================send Byte control write;
            i2c_send_start(0xa0);
            //=========================send Byte add
            i2c_send (add);
            //=========================send Byte data
            i2c_send (dat);
            i2c_stop();
            return 0;

            }
            //==================================
            // read_eeprom
            //==================================
            unsigned char read_eeprom(unsigned char add)
            {
            unsigned char GetByte;
            //=========================send Byte control write;
            i2c_send_start(0xa0);
            //=========================send Byte add
            i2c_send (add);
            //=========================send Byte data
            i2c_send_start (0xa1);
            GetByte = i2c_read();
            i2c_stop();

            return GetByte;
            }

            //=================================
            //i2c_send_start
            //=================================
            int i2c_send_start (unsigned char dat)
            {
            unsigned char i;
            I2CSDA = 1;
            I2CSCL = 1;
            I2CSDA = 0;
            I2CSCL = 0;
            for(i = 0;i<8;i++)
            {
            if ( dat & 0x80)
            {
            I2CSDA = 1; // MSB first -> LSB last
            }
            else
            {
            I2CSDA = 0;
            }

            I2CSCL = 1;
            dat=dat<<1;
            I2CSCL = 0;
            }
            I2CSDA = 1;
            I2CSCL = 1;
            I2CSCL = 0;
            return 0;
            }
            //=================================
            //i2c_send
            //=================================
            int i2c_send (unsigned char dat)
            {
            unsigned char i;
            for(i = 0;i<8;i++)
            {
            if ( dat & 0x80)
            {
            I2CSDA = 1; // MSB first -> LSB last
            }
            else
            {
            I2CSDA = 0;
            }
            I2CSCL = 1;
            dat=dat<<1;
            I2CSCL = 0;
            }
            I2CSDA = 1;
            I2CSCL = 1;
            I2CSCL = 0;
            return 0;
            }
            //=================================
            //i2c_read
            //=================================
            unsigned char i2c_read ()
            {
            unsigned char i, res;

            I2CSDA = 1;
            res = 0;
            for (i=0;i<8;i++) // each bit at a time, MSB first
            {
            I2CSCL = 0;
            I2CSCL = 1;
            res = res << 1;
            if (I2CSDA) res++;

            }
            I2CSDA = 1; // BIT STOP , =0 LA BIT START
            I2CSCL = 1;
            I2CSCL = 0;
            return res ;
            }

            Comment


            • #7
              chỉ đếm được đến 255 mình nghĩ là do bạn khai báo biến đếm kiểu char. thử đổi thành long xem sao
              Nguyễn Huy Biên - 01649 802 694
              gmail :

              Comment


              • #8
                hình như bạn có lưu vào Epprom ! nhưng bạn nên nhớ là 1 lần lưu bạn lưu bao nhiêu byte ! char = 1byte ! int = 2 byte do vậy bạn phải lưu cả 2 byte thấp và byte cao ! ok?
                lập trình vi điều khiển 8051 - avr - pic- thiết kế mạch điện tử

                Học Hiểu Nguyên Tắc - Tuân Theo Nguyên Tắc - Giải Trừ Nguyên Tắc

                Comment


                • #9
                  Có bạn nào có ý kiến nào nữa ko vào cho mình ý kiến với, rất mong nhận được sự góp ý của các bạn,

                  Xin chân thành cảm ơn,

                  Comment


                  • #10
                    cái lỗi này theo mình có 2 khả năng xảy ra
                    1. là do kiểu biến lưu giá trị đếm được, có thể bạn đã dùng kiểu biến dạng unsigned char nên mới có giá trị max là 255. dùng các loại như int hay long thì thoải mái
                    2. là do eeprom bạn dùng. có thể bạn đang dùng loại 8 bit nên nó chỉ lưu đc tối đa 255 thôi. bạn nên dùng các loại có thể lưu giá trị lớn hơn như 16bit hoặc chia 16 bit ra thành 2 byte 8 bit có thể lưu thoải mái
                    Website chính thức đổi địa chỉ website thành
                    Mời các bạn ghé thăm !!!

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X