在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C8051F單片機讀寫串行EEPROM程序

            C8051F單片機讀寫串行EEPROM程序

            作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
            //C8051F單片機讀寫串行EEPROM程序,查詢方式
            //------------------------------------------------------------------------------
            // Keil Software, Inc.
            //
            // Project: Cygnal 8051F000 I2C Example Program
            //
            // Filename: Cygnal_I2C_Example_Program.c
            // Version: 1.0.0
            // Description: This file contains example code that will communicate to a
            // serial EEPROM using I2C. Data will be printed over the
            // serial port.
            //
            // Copyright 2000 - Keil Software, Inc.
            // All rights reserved.
            //------------------------------------------------------------------------------
            //------------------------------------------------------------------------------
            // Header files
            //------------------------------------------------------------------------------
            #include // Header file for the Cygnal 8051F0X0
            #include // Header file for standard I/O
            //------------------------------------------------------------------------------
            // Value Definitions
            //------------------------------------------------------------------------------
            #define TRUE 0x01 // Value representing TRUE
            #define FALSE 0x00 // Value representing FALSE
            #define ON 0x01 // Value representing ON
            #define OFF 0x00 // Value representing OFF
            #define HIGH 0x01 // Value representing ON
            #define LOW 0x00 // Value representing OFF
            #define DELAY_WRITE 5000 // approx. 5 ms delay write time (about 1000 cycles / ms)
            #define DELAY_BLINK 50000 // Value for delay time - blink
            //------------------------------------------------------------------------------
            // Macros
            //------------------------------------------------------------------------------
            // Get high byte macro
            #define high_byte(x) ((x & 0xFF00) >> 8)
            //------------------------------------------------------------------------------
            // I/O Port Defines
            //------------------------------------------------------------------------------
            sbit P1_6 = 0x96; // Define the individual bit (P1.6)
            #define LED P1_6 // The eval board has an LED on P1.6
            //------------------------------------------------------------------------------
            // I2C Bus (SMBus) register bit definitions
            //------------------------------------------------------------------------------
            sbit BUS_BUSY = 0xC7; // SM Bus Busy (bit 7)
            sbit BUS_EN = 0xC6; // SM Bus Enable (bit 6)
            sbit BUS_START = 0xC5; // SM Bus Start (bit 5)
            sbit BUS_STOP = 0xC4; // SM Bus Stop (bit 4)
            sbit BUS_INT = 0xC3; // SM Bus Interrupt (bit 3)
            sbit BUS_AA = 0xC2; // SM Bus ACK (bit 2)
            sbit BUS_FTE = 0xC1; // SM Bus Clock timeout - high (bit 1)
            sbit BUS_TOE = 0xC0; // SM Bus Clock timeout - low (bit 0)
            //------------------------------------------------------------------------------
            // Rerserve Interrupt vector space (the 8051F000 has an IV table from 0x03 to 0xAB)
            //------------------------------------------------------------------------------
            unsigned char code iv_table [0xB0] _at_ 0x0003;
            //------------------------------------------------------------------------------
            // Function Prototypes
            //------------------------------------------------------------------------------
            void write_byte (unsigned char data_out, unsigned int address);
            unsigned char read_byte (unsigned int address);
            void i2c_write (unsigned char output_data);
            unsigned char i2c_read (void);
            void delay_time (unsigned int time_end);
            void i2c_start (void);
            unsigned char i2c_stop_and_read (void);
            void repeated_i2c_start_and_write (unsigned char output_data);
            void i2c_stop_and_write (unsigned char output_data);
            //------------------------------------------------------------------------------
            // MAIN FUNCTION
            //------------------------------------------------------------------------------
            void main (void)
            {
            unsigned int eeprom_address;
            unsigned char eeprom_data;
            // Disable the WDT (page 93 of data sheet)
            WDTCN = 0xDE;
            WDTCN = 0xAD;
            // Set internal oscilator to 16 MHz - Startup is 2 MHz (page 98 of data sheet)
            OSCICN = 0x07;

            // On the Cygnal processor there is a "Crossover" network that must
            // be initialized to establish the port pin assignements
            // (see page 101 of the data sheet)
            XBR0 = 0x05; // Set UART and SMBus to be enabled
            XBR1 = 0x00; // No functions routed in this register
            XBR2 = 0x40; // Pull-ups enabled, XBAR enabled, no ADC
            PRT1CF = 0x40; // Set port 1.6 to push/pull
            // (i.e the LED on the Eval board)
            // Initialize the serial port (9600, 8, N, 1)
            PCON &= 0x7F; // Clear bit 7 of the PCON register (SMOD1 = 0)
            SCON = 0x50; // 0101,0000 (Mode 1 and RxD enable)
            CKCON = 0x10; // Make T1M 1 (i.e. SysClk for Timer 1 not / by 12)
            // (see page 141 of the data sheet)
            TMOD |= 0x20; // Timer #1 in autoreload 8 bit mode
            TCON |= 0x40; // Set Timer #1 to run mode (TR = 1)
            TH1 = 0xCC; // Baud rate is determined by
            // Timer #1 overflow rate
            // Baud Rate = (Fcpu / 32) / (256 - TH1)
            // Fcpu = 16.00 MHz (see above setting of osc.)
            // TH1 = 252
            // (see page 130 of the data sheet)
            SCON |= 0x02; // Set UART to send first char (TI = 1)

            // Initialize the I2C Bus (SMBus)
            // (see page 111)
            SMB0CR = 0x60; // Set the clock to approx. 10 uS TH, TL (50 kHz)
            // (see page 117 of the data sheet)
            BUS_EN = TRUE; // Enable the bus

            printf("Keil Software, Inc."); // Display starup message
            printf("8051F0X0 MCU I睠 Example Test Program");
            printf("Version 1.0.0");
            printf("Copyright 2000 - Keil Software, Inc.");
            printf("All rights reserved.");
            printf("Writing data to EEPROM....");
            for (eeprom_address = 0; eeprom_address < 75; eeprom_address++)
            write_byte((unsigned char)eeprom_address + 0x30, eeprom_address);
            printf("Done!");

            while (TRUE)
            {
            for (eeprom_address = 0; eeprom_address < 75; eeprom_address++)
            {
            // Read data from eeprom and display it
            eeprom_data = read_byte(eeprom_address);
            printf("Address: %3u Character: %c", eeprom_address, eeprom_data);
            LED = HIGH; // Blink LED with delay
            delay_time(DELAY_BLINK);
            LED = LOW;
            delay_time(DELAY_BLINK);
            }
            }
            }
            //------------------------------------------------------------------------------
            // I2C Peripheral Function Prototypes
            //------------------------------------------------------------------------------
            //------------------------------------------------------------------------------
            // Procedure: write_byte
            // Inputs: data out, address
            // Outputs: none
            // Description: Writes a byte to the EEPROM given the address
            //------------------------------------------------------------------------------
            void write_byte (unsigned char data_out, unsigned int address)
            {
            i2c_start(); // Send start signal
            i2c_write(0xA0); // Send identifier I2C address
            i2c_write(high_byte(address)); // Send address to EEPROM
            i2c_write((unsigned char)address); // Send address to EEPROM
            i2c_stop_and_write(data_out); // Send low byte to EEPROM
            delay_time(DELAY_WRITE); // Delay a period of time to write
            }
            //------------------------------------------------------------------------------
            // Procedure: read_byte
            // Inputs: address
            // Outputs: none
            // Description: Reads a byte from the EEPROM given the address
            //------------------------------------------------------------------------------
            unsigned char read_byte (unsigned int address)
            {
            unsigned char data_in;
            i2c_start(); // Send start signal
            i2c_write(0xA0); // Send identifer I2C address
            i2c_write(high_byte(address)); // Send address to EEPROM
            // Send address to EEPROM
            // Send repeated start signal
            repeated_i2c_start_and_write((unsigned char)address);
            i2c_write(0xA1); // Send identifer I2C address
            data_in = i2c_stop_and_read(); // Read byte, send stop signal
            return data_in;
            }

            //------------------------------------------------------------------------------
            // Routine: i2c_start
            // Inputs: none
            // Outputs: none
            // Purpose: Sends I2C Start Trasfer - State "B"
            //------------------------------------------------------------------------------
            void i2c_start (void)
            {
            while (BUS_BUSY); // Wait until we are clear to write
            BUS_START = TRUE; // Perform I2C start
            while (!BUS_INT); // Wait until start sent
            BUS_START = FALSE; // Reset I2C start
            BUS_INT = 0; // Clear SI
            }
            //------------------------------------------------------------------------------
            // Routine: repeated_i2c_start_and_write
            // Inputs: none
            // Outputs: none
            // Purpose: Sends I2C Start Trasfer - State "B"
            //------------------------------------------------------------------------------
            void repeated_i2c_start_and_write (unsigned char output_data)
            {
            BUS_START = TRUE; // Perform I2C start
            SMB0DAT = output_data; // Put data into buffer
            while (!BUS_INT); // Wait unitl we are done with send
            BUS_INT = 0; // Clear SI
            BUS_START = FALSE; // Reset I2C start
            while (!BUS_INT); // Wait unitl we are done with reset
            BUS_INT = 0; // Clear SI
            }
            //------------------------------------------------------------------------------
            // Routine: i2c_stop_and_write
            // Inputs: output byte
            // Outputs: none
            // Purpose: Sends I2C Stop Trasfer - State "C" (also sends last byte)
            //------------------------------------------------------------------------------
            void i2c_stop_and_write (unsigned char output_data)
            {
            BUS_STOP = TRUE; // Perform I2C stop
            SMB0DAT = output_data; // Put data into buffer
            while (!BUS_INT); // Wait unitl we are done with send
            BUS_INT = 0; // Clear SI
            }
            //------------------------------------------------------------------------------
            // Routine: i2c_stop_and_read
            // Inputs: none
            // Outputs: input byte
            // Purpose: Sends I2C Stop Trasfer - State "C" (also reads last byte)
            //------------------------------------------------------------------------------
            unsigned char i2c_stop_and_read (void)
            {
            unsigned char input_data;
            BUS_STOP = TRUE; // Perform I2C stop
            while (!BUS_INT); // Wait until we have data to read
            input_data = SMB0DAT; // Read the data
            BUS_INT = 0; // Clear SI
            return input_data;
            }
            //------------------------------------------------------------------------------
            // Routine: i2c_write
            // Inputs: output byte
            // Outputs: none
            // Purpose: Writes data over the I2C bus
            //------------------------------------------------------------------------------
            void i2c_write (unsigned char output_data)
            {
            SMB0DAT = output_data; // Put data into buffer
            while (!BUS_INT); // Wait unitl we are done with send
            BUS_INT = 0; // Clear SI
            }
            //------------------------------------------------------------------------------
            // Routine: i2c_read
            // Inputs: none
            // Outputs: input byte
            // Purpose: Reads data from the I2C bus
            //------------------------------------------------------------------------------
            unsigned char i2c_read (void)
            {
            unsigned char input_data;
            while (!BUS_INT); // Wait until we have data to read
            input_data = SMB0DAT; // Read the data
            BUS_INT = 0; // Clear SI
            return input_data;
            }
            ////////////////////////////////////////////////////////////////////////////////
            // Routine: delay_time
            // Inputs: counter value to stop delaying
            // Outputs: none
            // Purpose: To pause execution for pre-determined time
            ////////////////////////////////////////////////////////////////////////////////
            void delay_time (unsigned int time_end)
            {
            unsigned int index;
            for (index = 0; index < time_end; index++);
            }


            關(guān)鍵詞: C8051單片機讀寫串行EEPRO

            評論


            技術(shù)專區(qū)

            關(guān)閉