⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用普通io模拟i2c总线源代码.txt

📁 用普通IO模拟I2C总线源代码,C51源程序
💻 TXT
字号:
《用普通IO模拟I2C总线源代码》 (来自KEIL) [龙啸九天] [116次] 2001-2-16 1:33:05
//------------------------------------------------------------------------------
// Keil Software, Inc.
// 
// Project:  I2C EXAMPLE PROGRAM (BIT BANGED) FOR MCB517 MCU
//
// Filename:  MCB517_I2C_Example_Bit_Banged.c
// Version:  1.0.0
// Description: This file contains example code to print over the serial
// port of the MCB517 MCU and Evaultion 
Board (EVAL-MCB517QS).
// This example will test the I2C 
function of the MCB517.
// This will be done by writing and 
reading from
// a serial A/D & D/A (P8591).
// 
// This example will bit bang two 
general I/O ports for I2C
//
// The example work with communicate 
at: 9600, 8, N, 1.
//
// This code was tested using the mon-
51 connected through COM-1
// of the eval board.
// CPU Frequency: 11.0592 MHz
//
// Copyright 2000 - Keil Software, Inc.
// All rights reserved.
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Header files
//------------------------------------------------------------------------------
#include <REG517A.H> // 
Header file for the MCB517 MCU
#include <STDIO.H> 
// Standard I/O header file

sbit  P1_0  = 0x90; 
// Define the individual bit
sbit  P1_1  = 0x91; 
// Define the individual bit

//------------------------------------------------------------------------------
// 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_BLINK 1500 // 
Value for delay time - blink

//------------------------------------------------------------------------------
// I/O Port Defines
//------------------------------------------------------------------------------
#define   SDATA P1_0 // 
Serial data
#define   SCLK P1_1 // 
Serial clock

//------------------------------------------------------------------------------
// I2C Peripheral Function Prototypes
//------------------------------------------------------------------------------

// Reads the ADC value for a given 
channel
unsigned char read_adc_channel(unsigned char channel_number);
void write_dac (unsigned char voltage_out); // Writes a byte to the 
DAC

//------------------------------------------------------------------------------
// I2C Functions - Bit Banged
//------------------------------------------------------------------------------
void i2c_start (void); 
// Sends I2C Start Trasfer
void i2c_stop (void); //
Sends I2C Stop Trasfer
void i2c_write (unsigned char input_data); // Writes data over the I2C 
bus
unsigned char i2c_read (void); //
Reads data from the I2C bus

//------------------------------------------------------------------------------
// Support Function Prototypes
//------------------------------------------------------------------------------
void initialize_system (void); // Initializes 
MCU (RS-232)
void delay_time (unsigned int time_end);    // To pause execution for pre-
determined time

//------------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------------
unsigned int timeout_counter; // Variable 
used for delay routines 

//------------------------------------------------------------------------------
// MAIN FUNCTION 
//------------------------------------------------------------------------------
void main (void)
{
unsigned char index, voltage_out;

initialize_system();

printf("\n\rKeil Software, Inc.\n\r"); // Display starup message
printf("MCB517 MCU I睠 Example Test Program\n\r");
printf("Version 1.0.0\n\r");
printf("Copyright 2000 - Keil Software, Inc.\n\r");
printf("All rights reserved.\n\n\r");

printf("P8591 Test Program....Reading from ADC channel 0, Writing to 
DAC!\n\r");

while (TRUE)
{
for (voltage_out = 0; voltage_out < 0xFF; voltage_out++)
{

write_dac(voltage_out); 
// Write voltage value to DAC


// Blink LEDs in sequence
for (index = 0x01; index < 0x80; index <<=1)
{
P4 = index;
delay_time(DELAY_BLINK);
}
   for (index = 0x80; index > 0x01; index >>=1)
{
P4 = index;
delay_time(DELAY_BLINK);
    }


// Read voltage (ADC 0) and display 
results
    printf("DAC output: %3bu     ADC Channel 0: %
3bu\n\r", voltage_out, read_adc_channel(0x00));
}
}
}

//------------------------------------------------------------------------------
// I2C Peripheral Function Prototypes
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Procedure: write_dac
// Inputs: voltage_out
// Outputs: none
// Description: Writes a byte to the DAC
//------------------------------------------------------------------------------
void write_dac (unsigned char voltage_out) 
{
   i2c_start();                   // Send I2C 
Start Transfer
    i2c_write(0x90);               // Send 
identifier I2C address - Write
    i2c_write(0x40);   
// Send control byte to device
    i2c_write(voltage_out);             // Send voltage 
to DAC
    i2c_stop();                    // Send I2C 
Stop Transfer
}

//------------------------------------------------------------------------------
// Procedure: read_adc_channel
// Inputs: channel
// Outputs: none
// Description: Reads the ADC value for a given channel
//------------------------------------------------------------------------------
unsigned char read_adc_channel(unsigned char channel_number)
{
    unsigned char data_in;

   i2c_start();                   // Send I2C 
Start Transfer
    i2c_write(0x90);   
// Send identifier I2C address - Write
    i2c_write(0x40 | channel_number); // Send control 
byte to device (last 2 bits is the channel)
    i2c_stop();                    // Send I2C 
Stop Transfer

    i2c_start();                   // Send I2C 
Start Transfer
    i2c_write(0x91);               // Send 
identifier I2C address - Read
data_in = i2c_read(); // 
Read the channel number

    return data_in;                 
}

//------------------------------------------------------------------------------
// I2C Functions - Bit Banged
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//  Routine: i2c_start
// Inputs: none
// Outputs: none
// Purpose: Sends I2C Start Trasfer - State "B"
//------------------------------------------------------------------------------
void i2c_start (void)
{
SDATA = HIGH; 
// Set data line high
SCLK = HIGH; 
// Set clock line high
SDATA = LOW; 
// Set data line low (START SIGNAL)
SCLK = LOW; 
// Set clock line low
}

//------------------------------------------------------------------------------
//  Routine: i2c_stop
// Inputs: none
// Outputs: none
// Purpose: Sends I2C Stop Trasfer - State "C"
//------------------------------------------------------------------------------
void i2c_stop (void)
{
unsigned char input_var;

SCLK = LOW; 
// Set clock line low
SDATA = LOW; 
// Set data line low
SCLK = HIGH; 
// Set clock line high
SDATA = HIGH; 
// Set data line high (STOP SIGNAL)
input_var = SDATA; 
// Put port pin into HiZ
}

//------------------------------------------------------------------------------
//  Routine: i2c_write
// Inputs: output byte
// Outputs: none
// Purpose: Writes data over the I2C bus
//------------------------------------------------------------------------------
void i2c_write (unsigned char output_data)
{
unsigned char index;

for(index = 0; index < 8; index++)   // Send 8 bits to the I2C 
Bus
{
                                  // Output the 
data bit to the I2C Bus
SDATA = ((output_data & 0x80) ? 1 : 0);
       output_data  <<= 1;             // Shift the byte by one 
bit
SCLK = HIGH;             // 
Clock the data into the I2C Bus
SCLK = LOW; 

}

index = SDATA; 
// Put data pin into read mode
SCLK = HIGH;             // 
Clock the ACK from the I2C Bus
SCLK = LOW; 
}

//------------------------------------------------------------------------------
//  Routine: i2c_read
// Inputs: none
// Outputs: input byte
// Purpose: Reads data from the I2C bus
//------------------------------------------------------------------------------
unsigned char i2c_read (void)
{
unsigned char index, input_data;

    index = SDATA; 
// Put data pin into read mode

input_data = 0x00;
for(index = 0; index < 8; index++)   // Send 8 bits to the I2C 
Bus
{
input_data <<= 1; 
// Shift the byte by one bit
SCLK = HIGH;            
// Clock the data into the I2C Bus
       input_data |= SDATA;      // Input the 
data from the I2C Bus
SCLK = LOW; 

}

   return input_data;
}

//------------------------------------------------------------------------------
// SUPPORT FUNCTIONS
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Procedure: initialize_system
// Inputs: none
// Outputs: none
// Description: Initializes embedded system MCU LPC764
//------------------------------------------------------------------------------
void initialize_system (void)
{
// Initialize the serial port (9600, 8, N, 1) [see page 32 of data sheet]
PCON |= 0x80; 
// Set bit 7 of the PCON register (SMOD = 1)  
S0CON = 0x50; 
// 0101,0000 (Mode 1 and RxD enable) 

ADCON0 |= 0x80; 
// Turn on Baud Rate Gen.
S0RELH = 0x03; 
// Set baud rate in registers
S0RELL = 0xD9;
S0CON = 0x52; 
// Set UART to send first char (mode 1, RXD, and T0I)
}

////////////////////////////////////////////////////////////////////////////////
//  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++);
}




完全下载地址!!! [龙啸九天] [84次] 2001-2-16 1:35:39 
<a href=http://www.keil.com/download/c51/MCB517_I2C.zip target=_blank>http://www.keil.com/download/c51/MCB517_I2C.zip</a> 

有普通IO口模拟I2C Slave方式的例子吗? [lhsw] [11次] 2001-2-17 15:25:00 
传输开始的条件挺难判别的,主要是下降/上升沿的判别。 

有普通IO口模拟I2C Slave方式的例子吗? [lhsw] [3次] 2001-2-17 15:28:23 
传输开始的条件挺难判别的,主要是下降/上升沿的判别。 

有普通IO口模拟I2C Slave方式的例子吗? [lhsw] [2次] 2001-2-17 15:30:03 
传输开始的条件挺难判别的,主要是下降/上升沿的判别。 

有普通IO口模拟I2C Slave方式的例子吗? [lhsw] [6次] 2001-2-17 15:30:52 
有普通IO口模拟I2C Slave方式的例子吗?传输开始的条件挺难判别的,主要是下降/
上升沿的判别。 

有普通IO口模拟I2C Slave方式的例子吗? [lhsw] [11次] 2001-2-17 15:32:49 
有普通IO口模拟I2C Slave方式的例子吗?传输开始的条件挺难判别的,主要是下降/
上升沿的判别。 

我有 [waitmoney] [7次] 2001-2-25 20:57:08 
请看书吧! 

是朋友捣乱,且勿轻信 [waitmoney] [3次] 2001-2-25 20:58:28 

您什么意思,我听不懂 [lhsw] [2次] 2001-2-27 15:18:53 

真不错 [飞天] [0次] 01-7-1 上午 03:55:30 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -