AVR单片机IO仿真I2C

发布者:jingyun最新更新时间:2016-09-22 来源: eefocus关键字:AVR单片机  仿真I2C 手机看文章 扫描二维码
随时随地手机看文章
#include

#define EEP_PORT PORTC   //定义是使用PROTC口
#define EEP_DDR DDRC     //定义是使用PROTC口
#define SDA 0X10         //定义sda连接的是portd1
#define SCL 0X20         //定义scl连接的是portd0
//#define WP 0X04          //定义wp连接的是portd2
#define EEP_ADD_R 0xa1   //写I2C从器件地址和读方式 a0,a1接地
#define EEP_ADD_W 0xa0   //写I2C从器件地址和写方式 a0,a1接地

void delay(unsigned int us)
{
     while(us--);
}

void eep_init(void)
{
EEP_DDR|= SDA | SCL ;//| WP ;
EEP_PORT|=SDA | SCL ;//| WP ;
}

void send(void)
{
      EEP_PORT|=SCL;
      asm("nop");
      EEP_PORT&=~SCL;
}
/********************************************
内部函数,I2C开始
********************************************/
void Start(void)

    EEP_PORT|=SDA; //sda
    EEP_PORT|=SCL; //scl
    asm("nop");
    EEP_PORT&=~SDA;
    asm("nop");
    EEP_PORT&=~SCL;
}
/********************************************
内部函数,I2C结束
********************************************/
void Stop(void)
{
    EEP_PORT&=~SDA;
    EEP_PORT&=~SCL;
    asm("nop");
    EEP_PORT|=SCL;
    asm("nop");
    EEP_PORT|=SDA;
    asm("nop");
}

/********************************************
内部函数,等待ACK
********************************************/
void ACK(void)

   unsigned char errtime=20;
   EEP_PORT|=SDA;       //上拉
   EEP_DDR&=~SDA;   //设置为输入口
   EEP_PORT|=SCL;       
   asm("nop");
   while(PINC&SDA)
  {  errtime--;
     if(!errtime)
  {
  Stop();
  EEP_PORT&=~SDA; //超时,给他个离开的理由
  }
   }
   EEP_PORT&=~SCL;
   asm("nop");
   EEP_DDR|=SDA;   //设置为输出口
}
/********************************************
内部函数.输出数据字节
********************************************/
void writebyte(unsigned char wdata)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      if((wdata&0x80)){EEP_PORT|=SDA;}else{EEP_PORT&=~SDA;}
   wdata<<=1;
      send(); //发送一个位
   
   }
}
/********************************************
内部函数.输入数据
********************************************/
unsigned char Readbyte(void)
{
   unsigned char i,bytedata;
   EEP_DDR&=~SDA;   //设置为输入?
   for(i=0;i<8;i++)
   {
      EEP_PORT|=SCL;
      bytedata<<=1;
   if(PINC&SDA){
      bytedata|=0X01;
   }else{
   bytedata&=~0X01;
   }
      EEP_PORT&=~SCL;
      asm("nop");
   }
   EEP_DDR|=SDA;
    return(bytedata);
 
}

/********************读24cxx--外部调用********************/
unsigned char read_eep(unsigned char add1,unsigned char add2)
{  unsigned char mdata;
   Start();                   //起始位
   writebyte(EEP_ADD_W);      //写eeprom地址+1个写命令
     ACK();                   //等待应答信号
   writebyte(add1);           //写如访问地址
     ACK();                   //等待应答信号
   writebyte(add2);           //写入访问地址
     ACK();                   //等待应答信号
   Start();                   //起始位
   writebyte(EEP_ADD_R);      //写eeprom地址+1个读命令
     ACK();                   //等待应答信号
   mdata=Readbyte();          //获取数据
     Stop();          //发送停止位置
   asm("nop");               //此处延时根据实际情况,如果不延时,可能会不正常
   return(mdata);
}
/********************写24cxx--外部调用********************/
void write_eep(unsigned char add1,unsigned char add2,unsigned char udata)
{
//EEP_PORT&=~WP;                //关闭写保护
   Start();                   //起始位
   writebyte(EEP_ADD_W);   //写eeprom地址+1个写命令
   ACK();       //等待应答信号
   writebyte(add1);        //写如访问地址
   ACK();       //等待应答信号
   writebyte(add2);        //写如访问地址
   ACK();       //等待应答信号
   writebyte(udata);    //写入数据
   ACK();       //等待应答信号
   Stop();                    //发送停止位
   delay(24000);
   //delay_nms(4);              //此处延时根据实际情况,大多EEPROM都需要3毫秒的写入时间,如果不延时,可能会不正常
   //EEP_PORT|=WP;                 //打开写保护
}

void main(void)
{
    unsigned char tmp;
 eep_init();
 DDRC|=(1<<0);
 PORTC&=~(1<<0);
 write_eep(0,2,7);
 tmp=read_eep(0,2);
 if(tmp==7)
    PORTC|=(1<<0);
 while(1);
}

关键字:AVR单片机  仿真I2C 引用地址:AVR单片机IO仿真I2C

上一篇:基于物流运输过程监测的振动测量系统
下一篇:ATMEGA16用IO模拟SPI驱动ADS7843

推荐阅读最新更新时间:2024-03-16 15:11

立讯精密遭美337调查,涉高速外部IO连接器产品
商务部官网显示,1月21日,美国国际贸易委员会(ITC)投票决定对特定电气连接器和保持架及其组件和下游产品启动337调查(调查编码:337-TA-1241)。中国广东立讯精密工业股份有限公司、中国广东东莞立讯精密工业股份有限公司、中国香港香港立讯有限公司、美国Luxshare-ICT Inc., Milipitas, CA为列名被告。巧合的是,ITC决定发起调查的时间点恰是美国总统拜登就任第二天。 该起调查始于2020年12月18日,由美国安费诺公司(Amphenol Corp. of Wallingford, CT)向ITC发起立案申请。该公司主张,立讯精密特定电气连接器和保持架及其组件和下游产品侵犯了其专利权(美国注册专利号7
[手机便携]
关于stm32自由控制io口的笔记
刚入手stm32,想从最简单的控制io口做起,仿照历程,书写了一个控制PA15口持续输出低电平的程序,可是无论怎么样就是不能将IO口拉低,始终输出3.3V,那个纠结啊!后来仔细问了同学才明白原因: PA15为复用端口, 作者为了在学员使用JLINK调试时产生不必要的麻烦,在包含某些system文件时已经将该口的复用功能默认打开了。 所以在软件编写的时候要先禁用JTAG功能才能把这个IO口当成普通IO口使用。也就是在程序开始的时候加上这一句话:JTAG_Set(JTAG_SWD_DISABLE); 因为stm32功能强悍,但引脚有限,所以大部分的引脚都有复用功能,所以使用IO口是要特别注意这点:例如某些IO与LCD功
[单片机]
关于stm32自由控制<font color='red'>io</font>口的笔记
Linux系统对IO端口和IO内存的管理
一、I/O端口 端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为 I/O端口 ,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。 二、IO内存 例如,在PC上可以插上一块图形卡,有2MB的存储空间,甚至可能还带有ROM,其中装有可执行代码。 三、IO端口和IO内存的区分及联系 这两者如何区分就涉及到硬件知识,X86体系中,具有两个地址空间:IO空间和内存空间,而RISC指令系统的CPU(如ARM、Po
[单片机]
Linux系统对<font color='red'>IO</font>端口和<font color='red'>IO</font>内存的管理
零基础入门单片机(2)学会控制IO引脚你就入门啦
【一】单片机引脚介绍 1.电源引脚 ●VSS:接地。 ●VCC:外接5V电源。 2.外接晶振引脚 ●XTAL1:当单片机使用内部振荡电路时,接外部晶体的一端和微调电容。当单片机采用外部时钟信号时,此引脚接地。 ●XTAL2:当单片机使用内部振荡电路时,接外部晶体的一端和微调电容。当单片机采用外部时钟信号时,用来输入时钟脉冲。 3.控制引脚 ●RST/VPD:复位信号输入端,高电平有效。当此引脚保持两个机器周期的高电平时,进行复位操作。该引脚的第二功能是备用电源。 ●ALE/PROG:地址锁存允许信号端。当MCS-51单片机上电后,ALE引脚不断向外输出振荡器频率fosc 1/6的正脉冲信号。此引脚具有第二功能PROG,其作为
[单片机]
STM32 PB4不能做普通IO解决方法
PB4默认是JTAG引脚,并置于上拉模式,所以没法直接当做普通的IO口拉低。可以复用为SWD下载方式,那么PB4就可以“省出来了 1 (RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);打开时钟 复用时钟 .执行端口重映射时,复用功能时钟得使能:RCC_APB2Periph_AFIO 2. GPIO_Remap_SWJ_Disable Full SWJ Disabled (JTAG-DP + SW-DP)此时PA13|PA14|PA15|PB3|PB4都可作为普通IO用了 为了保存某些调试端口,GPIO_R
[单片机]
AVR单片机汇编器的部分伪指令详解
伪指令不属于单片机的指令系统,而是由汇编器提供的指令,用于调整存储器中程序的位置、定义宏、初始化存储器等。AVR单片机的汇编器共提供18条伪指令(见附表)。 其中,ORG、DB、DW、EQU读者比较熟悉,这里不再赘述。下面对部分伪指令加以说明。 BYTE-保存单字节数据到SRAM中。BYTE伪指令仅用在数据存储器。为提供数据保存的位置,在BYTE前应有标号。在由CSEG、ESEG定义的代码段和E2PROM段中不能使用BYTE伪指令。 格式LABEL:.BYTE表达式 CSEG-定义程序存储器代码段的起始位置一个汇编文件可以包括若干个代码段,汇编时这些代码段被连成一个代码段。在代码段中不能使用BYTE伪指令。 格式.CS
[单片机]
<font color='red'>AVR单片机</font>汇编器的部分伪指令详解
基于AVR单片机的安全工器具监控系统设计
众所周知,安全是电力企业一个永恒的主题,而安全工器具的好坏,将直接影响着电力企业在生产过程中的人身和设备安全。笔者提出了一种基于AVR单片机的安全工器具监控系统的设计方案,主要是对安全工器具的离就位状态信息、有效使用期限和安全工器具柜内的温湿度状况等进行监控,可以根据实现安全工器具柜内温湿度的自动调节,能够自动记录安全工器具的相关信息。本文首先阐述了系统的总体结构,然后详细论述了系统的硬件设计和软件设计。 1 安全工器具监控系统的总体结构 1.1 系统结构 本文所设计的安全工器具监控系统主要分为下位机数据采集和上位机数据管理两个部分,两者之间通过网络进行通信。 系统首先通过数据采集板对安全工器具柜的相关量进行采集,然后将
[单片机]
基于<font color='red'>AVR单片机</font>的安全工器具监控系统设计
简单全能的AVR单片机高压解锁器
简单全能的AVR单片机高压解锁器(制作方法,以MEGA16为例,附电路与C源程序,注:不是高压编程器)AVR高压解锁 概述: 利用常用的AVR单片机ATmega16制作的高压解锁器,可以解开所有芯片锁死的情况(除非芯片损坏、烧毁)。制作作品经实验验证,解开了山东大学物理学院AVR单片机实验室所有近40片锁死的单片机以及许多同学锁死的单片机。制作方法简单,保证你一小时之内做完。 所需元件极少(如电路图所示):仅一只三极管、一片7805,三支电阻、一只LED、三个小电容,一片可用的单片机,一个12V电源。 程序与电路连接可方便的移植到其它型号单片机上(凡支持高压编程的,都可以)。 希望能对初学单片机的同学有所帮助,特别
[单片机]
简单全能的<font color='red'>AVR单片机</font>高压解锁器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved