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

📄 demo_16_4__.c

📁 AVR单片机嵌入式系统原理与应用实践例码
💻 C
字号:
/*****************************************************
File name           : demo_16_4.c
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/
#include <mega16.h>
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x40
	.EQU __sm_mask=0xB0
	.EQU __sm_powerdown=0x20
	.EQU __sm_powersave=0x30
	.EQU __sm_standby=0xA0
	.EQU __sm_ext_standby=0xB0
	.EQU __sm_adc_noise_red=0x10
	.SET power_ctrl_reg=mcucr
	#endif
#include <stdio.h>				// 使用CVAVR的标准 Input/Output 函数
#include <delay.h>				// 使用CVAVR的延时函数

#define EEPROM_BUS_ADDRESS 0xa0

// TWSR values (not bits)
#define TWPS0 0
#define TWPS1 1
#define TWEN  2
#define TWIE  0
#define TWEA  6
#define TWINT 7
#define TWSTA 5
#define TWSTO 4

#define TW_START            0x08        // Master
#define TW_REP_START        0x10
#define TW_MT_SLA_ACK       0x18        // Master Transmitter
#define TW_MT_SLA_NACK      0x20
#define TW_MT_DATA_ACK      0x28
#define TW_MT_DATA_NACK     0x30
#define TW_MT_ARB_LOST      0x38
#define TW_MR_ARB_LOST      0x38        // Master Receiver
#define TW_MR_SLA_ACK       0x40
#define TW_MR_SLA_NACK      0x48
#define TW_MR_DATA_ACK      0x50
#define TW_MR_DATA_NACK     0x58

#define Page_size           64          // 24C256页字节数
#define Page_mask           Page_size-1 // 取页内地址屏蔽码

void I2C_init(void)
{
    TWSR=0x00;    // 2 Wire Bus initialization
    TWBR=0x00;    // Generate Acknowledge Pulse:On
    TWAR=0x00;    // 2 Wire Bus Slave Address:0h
    TWCR=0x44;    // General Call Recognition:Off,Bit Rate: 250.000 kHz
}

unsigned char I2C_start(void)               //产生启动信号
{
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while (!(TWCR & (1<<TWINT))){};
  return 1;
}

void I2C_stop(void)                         //产生停止信号
{
  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

unsigned char I2C_write(unsigned char c)    //向总线写一字节,并返回有无应答
{
    unsigned char ack=1;
    TWDR = c;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
    if((TWSR & 0xF8) != TW_MT_SLA_ACK)
        ack = 0;
    return ack;
}

unsigned char I2C_read(unsigned char ack)   //读一字节 ack: 1时应答,0时不应答
{
    if (ack)
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    else
        TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
    return(TWDR);
}

void EEprom_Page_write(unsigned int Addr,unsigned char n, unsigned char* arr)
{
    unsigned char i;
    I2C_start();					// 发起始信号
    I2C_write(EEPROM_BUS_ADDRESS);	// 发写从机写寻址字节
    I2C_write(Addr>>8);				// 发存储单元地址高字节
    I2C_write(Addr);				// 发存储单元地址低字节
    for (i=1;i<=n;i++)
    {
        I2C_write(*arr);			// 写一个字节数据到24C256
        arr++;
    }
    I2C_stop();				// 发停止信号
    delay_ms(10);			// 等待10ms,保证24C256内部写操作完成再进行新操作
}

void EEprom_Write(unsigned int Addr,unsigned char n, unsigned char* arr)
{
    unsigned char n_tmp;
    n_tmp=Page_size-(unsigned char)(Addr&Page_mask);
    if ((n>n_tmp)&&(n_tmp!=0))
    {
        EEprom_Page_write(Addr,n_tmp,arr);
        Addr += n_tmp;
        n -= n_tmp;
        arr += n_tmp;
    }
    while (n >= Page_size)
    {
        EEprom_Page_write(Addr,Page_size, arr);
        Addr += Page_size;
        n -= Page_size;
        arr += Page_size;
    }
    if (n!=0)
        EEprom_Page_write(Addr,n,arr);
}

void EEprom_read(unsigned int Addr,unsigned char n, unsigned char* arr)
{
    unsigned char i;
    I2C_start();						// 发起始信号
    I2C_write(EEPROM_BUS_ADDRESS);		// 发写从机写寻址字节
    I2C_write(Addr>>8); 				// 发存储单元地址高字节
    I2C_write(Addr);					// 发存储单元地址低字节
    I2C_start();   						// 发起始信号
    I2C_write(EEPROM_BUS_ADDRESS | 1);	// 发从机读寻址字节
    for (i=1;i<=n-1;i++)
    {
        *arr = I2C_read(1);			// 读一个字节数据,返回ACK
        arr++;
    }
    *arr=I2C_read(0);				// 读最后一个字节数据,返回NO ACK
    I2C_stop();						// 发停止信号
}

void main(void)
{
    unsigned char i,data[200];

    UCSRA=0x00;		// USART initialization
    UCSRB=0x18;		// Communication Parameters: 8 Data, 1 Stop, No Parity
    UCSRC=0x86;		// USART Receiver: On,USART Transmitter: On
    UBRRH=0x00;		// USART Mode: Asynchronous	,USART Baud Rate: 9600
    UBRRL=0x19;
    // ================================================
    I2C_init();		                    // initialize the I2C bus
    for (i=0;i<200;i++) {data[i]=i;}    // 数组赋值
    EEprom_Write(0x0aa,200,data);       // 从0x00aa起写200个字节
    for (i=0;i<200;i++) {data[i]=0;}    // 数组清零
    EEprom_read(0x0aa,200,data);        // 从0x00aa起读200个字节
    for (i=0;i<200;i++) {putchar(data[i]);} // 送PC检验
    while (1){};
}

⌨️ 快捷键说明

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