新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR內部EEPROM擦寫次數測試程序

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

        作者: 時間:2016-12-02 來源:網絡 收藏
        略作修改的程序,請再評測。

        /*****************************************************/
        /* 廣州天河雙龍電子公司北京分公司 */
        /* 測試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讀寫次數第三部分

        本文引用地址:http://www.104case.com/article/201612/324634.htm

        /***************************************
        串口輸出函數,用于發送記數結果
        ****************************************/
        void putCHAR(unsigned CHAR c)
        {
        while (!(UCSR0A&(1< UDR0=c;//數據寄存器
        }

        /**************************************
        串口初始化
        ***************************************/
        void uart_init(void)
        {
        UCSR0B=(1<UBRR0L=(fosc/(16*baud)-1)%256;//對波特率寄存器預置數
        UBRR0H=(fosc/(16*baud)-1)/256;
        UCSR0C=(0<}


        /***********************************
        主程序
        ***********************************/
        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<EEAR = uiAddress;
        EEDR = ucData;
        EECR |= (1<EECR |= (1<}

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 湖州市| 交城县| 星座| 永修县| 韶山市| 庐江县| 资源县| 山阴县| 博白县| 望城县| 韶山市| 麦盖提县| 德昌县| 湟源县| 双桥区| 靖远县| 本溪市| 多伦县| 莫力| 尉犁县| 那坡县| 漳平市| 二连浩特市| 安平县| 香格里拉县| 广元市| 保靖县| 阳西县| 宿迁市| 蓬莱市| 桓台县| 威远县| 和顺县| 方城县| 景洪市| 额尔古纳市| 洪洞县| 年辖:市辖区| 行唐县| 乌拉特中旗| 郯城县|