<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        AVR內部EEPROM擦寫次數測試程序

        作者:陳永飛   來源:本站原創   點擊數:  更新時間:2014年03月25日   【字體:

        略作修改的程序,請再評測。
        /*****************************************************/
        /*            廣州天河雙龍電子公司北京分公司         */
        /*            測試EEPROM讀寫次數                        */
        /*            2004年12月21日                         */
        /*   目標MCU:MEGA48   晶振:內部RC(INT) 8MHZ          */
        /*****************************************************/
        #include    "iom48v.h"
        #include    "macros.h"
        #define     fosc 8000000 //內部8MHZ晶振
        #define        baud 19200     //波特率
        unsigned CHAR eep_r;//EEPROM讀出的數據
        unsigned CHAR N;//EEPROM讀寫次數第一部分
        unsigned CHAR kk;//EEPROM讀寫次數第二部分
        unsigned int count;//EEPROM讀寫次數第三部分

        /***************************************
        串口輸出函數,用于發送記數結果
        ****************************************/
        void putCHAR(unsigned CHAR c)
            {   
                  while (!(UCSR0A&(1<<UDRE0))); //置usart數據寄存器空,系統復位時,udre位置1,表示數據發送已準備好
              UDR0=c;//數據寄存器   
            }

        /**************************************
        串口初始化
        ***************************************/
        void uart_init(void)
        {
        UCSR0B=(1<<RXEN0)|(1<<TXEN0);//允許發送和接收
        UBRR0L=(fosc/(16*baud)-1)%256;//對波特率寄存器預置數
        UBRR0H=(fosc/(16*baud)-1)/256;
        UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);//8位數據+1位STOP位
        }


        /***********************************
        主程序
        ***********************************/
        void main(void)
        {
        PORTD=0xFF; //開放D口
        DDRD=0xFF;
        PORTB=0xFF;//開放B口
        DDRB=0xFF;
        uart_init();     
        CLI();    //關中斷,以免干涉EEPROM的寫入
        while(1)
        {
          EEPROM_write(0x00FD,0X5A);//寫地址和數據,可修改     
          eep_r=EEPROM_read(0x00FD);                 
          comp();
          EEPROM_write(0x00FD,0XA5);//寫地址和數據,可修改
          eep_r=EEPROM_read(0x00FD);
          comp();
          }
        }

        /*******************************************************************
        對讀出的數據進行比較 正確……LED顯示R,并從串口發送數據kk
                     錯誤……LED顯示F,并從串口發送數據kk,count

        讀寫總次數為:(N*256+kk)*4000+count
        ******************************************************************/
        void     comp(void)
        {
        unsigned CHAR eep_old,count_high,count_low;
        eep_old = eep_r&0x0f;     //取EEPROM的低4位
        eep_r = eep_r >> 4;    //取EEPROM的高4位
        if(eep_old+eep_r != 0x0f )    //低4位加高4位,結果和F比較
               {
                count_high =count >> 8;
                count_low=count&0xff;
                    putCHAR(N);//輸出最終記數值
                putCHAR(kk);    //輸出最終記數值
                putCHAR(count_high);    //輸出此時的已讀寫次數,總數為:(N*256+kk)*4000+count(次)
                putCHAR(count_low);
                PORTB=0x8E;      //點亮LED
                PORTD=0xEF;
                while(1);    //讀取數據,發生一次錯誤后,程序在此處掛起。
               }
             else
              {
                count++;          //每讀寫一次,count累加1
                if(count>=4000)    //每讀寫4000次,KK累加1
                    {        //并從串口送出KK
                    count=count-4000;
                    kk++;
                    if(kk>=255)
                       {
                       N++;
                       }
                    putCHAR(N);     
                    putCHAR(kk);
                        }               //點亮LED
                PORTB=0x88;
                PORTD=0x7F;
              }
        }

        /*********************************************
        EEPROM寫操作
        ********************************************/
        void EEPROM_write(unsigned int uiAddress, unsigned CHAR ucData)
        {
        while(EECR & (1<<EEWE));
        EEAR = uiAddress;
        EEDR = ucData;
        EECR |= (1<<EEMWE);
        EECR |= (1<<EEWE);
        }

        /********************************************
        EEPROM讀操作
        *******************************************/
        unsigned CHAR EEPROM_read(unsigned int uiAddress)
        {
        while(EECR & (1<<EEWE));
        EEAR = uiAddress;
        EECR |= (1<<EERE);
        return EEDR;
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮