IIC和韦根26的程序

发布者:幸福家庭最新更新时间:2012-08-22 来源: 51hei关键字:IIC  韦根26查询法  串口通讯 手机看文章 扫描二维码
随时随地手机看文章

终于完成了韦根26查询法的程序了,IIC和串口通询昨天改好,因为现在没做到联网部分,所以没做联网方面的通讯协议和程序。
串口通讯程序

void Init(void)
{
  
   TMOD|=0x21;//定时器1为方式2,定时器0方式1
   TL1=0xfd;  //初始值设置波特率为9600    //
   TH1=0xfd;
   ET0=1;
   TR1=1;     //开定时器1
   REN=1;   //允许接收数据//
   SM0=0;
   SM1=1;
   EA=1;      //开所有中断
   ES=1;

        
}
void SEND(unsigned char *a)
{
      uchar b;
      for(b=0;b<8;b++)
      {
        
         SBUF=*a;
          while(TI==0);
         TI=0;
         a=a+1;
        
      }
}
IIC总线24cxx读写通用程序
#include
//#include
#ifndef MCU_MODEL
   #define  MCU_MODEL 51   //<----在此设定mcu类型, 51代表51系列; avr代表avr系列
#endif

//-----------------------51类MCU-------------------------------------------
#if MCU_MODEL==51  

//   #include      //在此设定51类MCU的头文件
//   #include     //_nop_()函数需要
//   #include"xd.h"
//   #include"xdprj.h"
  
   //---------定义I2总线端口, 可根据实际使用改变-----------
   sbit SCL=P2^0;      //I2总线时钟线
   sbit SDA=P2^1;      //I2总线数据线
  
   #define SCL_L SCL=0
   #define SCL_H SCL=1
   #define SDA_L SDA=0
   #define SDA_H SDA=1
  
   #define SDA_TO_IN      //为配合avr共用次程序而空定义的宏
   #define SDA_TO_OUT      //为配合avr共用次程序而空定义的宏
  
   #define SDA_IF_L SDA==0   //如果sda为低
   #define SDA_IF_H SDA==1   //如果sda为高
  
   //------------------------------------------------------
   #define DELAY_us _nop_(); _nop_(); _nop_(); _nop_(); _nop_()   
//延时用,如果要加长延时,可增加或减少 _nop_();
  
//------------------------avr类MCU-------------------------------
#elif MCU_MODEL==avr  

   #include      //在此设定avr类MCU的头文件
   #include
//   #include"xd.h"
//   #include"xdprj.h"
  
   //-----定义I2总线端口, 可根据实际使用改变----
   #define SCL_L PORTC&=~BIT(0)   //I2总线时钟线
   #define SCL_H PORTC|=BIT(0)
   #define SDA_L PORTC&=~BIT(1)   //I2总线数据线
   #define SDA_H PORTC|=BIT(1)
  
   #define SDA_TO_IN DDRC&=~BIT(1); _NOP()   //设数据线位输入
   #define SDA_TO_OUT DDRC|=BIT(1); _NOP()   //设数据线位输出
  
   #define SDA_IF_L (PINC&BIT(1))==0      //如果sda为低
   #define SDA_IF_H (PINC&BIT(1))==BIT(1)   //如果sda为高
   //-------------------------------------------

   #define DELAY_us tus(7)   
//avr单片机在晶振为8MHz时,延时5us, 可根据实际情况改变
  
#endif
//---------------------------------------------------------------



//------在此设定芯片型号------
#define e2prom 2  
// <---在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512

#if e2prom==1
   #define PAGE_SIZE 8       //芯片页写缓冲器大小,单位:字节/
   #define SIZE 0x007f       //   芯片内含有多少个8位的字节/
#elif e2prom==2
   #define PAGE_SIZE 8
   #define SIZE 0x00ff
#elif e2prom==4
   #define PAGE_SIZE 16
   #define SIZE 0x01ff
#elif e2prom==8
   #define PAGE_SIZE 16
   #define SIZE 0x03ff
#elif e2prom==16
   #define PAGE_SIZE 16
   #define SIZE 0x07ff
#elif e2prom==32
   #define PAGE_SIZE 32
   #define SIZE 0x0fff
#elif e2prom==64
   #define PAGE_SIZE 32
   #define SIZE 0x1fff
#elif e2prom==128
   #define PAGE_SIZE 64
   #define SIZE 0x3fff
#elif e2prom==256
   #define PAGE_SIZE 64
   #define SIZE 0x7fff
#elif e2prom==512
   #define PAGE_SIZE 128
   #define SIZE 0xffff
#endif
//--------------------------

//--------在此设定芯片地址-------
#define W_ADD_COM 0xa0   //写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
#define R_ADD_COM 0xa1   //读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
//-------------------------------


//-----在此改变预置错误号-----
//#define I2C_ERR   ERR_10   //写字节命令及器件地址错, 在此也就是读写器件错!!
//---------------------------

//-------------------------------以下为其它I2总线器件可调用的函数----------------
//起始信号
void i2cstart(void)
{  
   //SCL_L;
   //DELAY_us;
    SDA_H;        //发送起始条件的数据信号*/
   DELAY_us;
    SCL_H;
   DELAY_us;   //起始条件建立时间大于4.7us,延时*/
    SDA_L;       //发送起始信号*/
   DELAY_us;  //起始条件锁定时间大于4μs*
    SCL_L;       //钳住I2C总线,准备发送或接收数据/
   DELAY_us;
}  

//停止信号 /
void i2cstop(void)
{  
   //SCL_L;
   //DELAY_us;
    SDA_L;        //发送结束条件的数据信号*
   DELAY_us;    
    SCL_H;        
   DELAY_us;     //    结束条件建立时间大于4μs
   SDA_H;        //   发送I2C总线结束信号*
   DELAY_us;
}
//等待从器件应答/
void i2cask()  
{
   uchar i;
   SCL_H;
   DELAY_us;
   while((SDA==1)&&(i<250))i++;
   SCL_L;
   DELAY_us;
}
/*/MCU应答信号/
void i2cack()
{
  
   SDA_L;
   DELAY_us;
   SCL_H;
   DELAY_us;
   SCL_L;
   DELAY_us;
}              */
//i2c读要调用的函数
//从器件读出一个字节
uchar i2crd(void)
{   uchar i,temp;
//i2c读要调用的函数
//从器件读出一个字节
uchar i2crd(void)
{   uchar i,temp;
  
     SCL_L; DELAY_us;     // 准备接收数据位*时钟低电平周期大于4.7μs
     SDA_H; DELAY_us;    //置数据线接上内部上拉(数据输入方式),此为必须/
              
    for(i=0;i<8;i++)
    {    
      SCL_H;           //   置时钟线为高使数据线上数据有效/
      DELAY_us;
        temp<<=1;
        
        SDA_TO_IN;         //如果是avr单片机,就设SDA引脚位输入状态
        
      if(SDA_IF_H)
      temp=temp+1; //读数据位,接收的数据位放入temp中;
      SCL_L;
        DELAY_us;
        
        SDA_TO_OUT;         //如果是avr单片机,就设SDA引脚位输出状态
   }
//    SCL_L;
//   DELAY_us;      //主器件应答脉冲
//   SDA_L; DELAY_us;
//   SCL_H; DELAY_us;
    return(temp);
}//把一个字节数据输入器件,并以收到应答信号为止/
//写入成功返回1,失败返回0
uchar i2cwt(uchar a)
{ uchar i;

for(i=0;i<8;i++) //要写入的数据长度为8位*
{
SCL_L;
DELAY_us;
if((a<
WGDATA[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//接收韦根数据26位
idata unsigned char WG[8]={0xaa,0xbb,0,0,0,0,0xcc,0xdd};
//存韦根ID卡卡号的HID和PID码,其中HID码为8位即一字节,PID码16位两字节
uchar a,x,j,LL,II,YY;

void ys100us(uint u)
{ uint y;
uchar x;
for(y=u;y>0;y--)
{

for(x=20;x>0;x--)
_nop_();

}


}





void DATA(void)
{
if(DATA0!=DATA1)
{
if(DATA0==0)
{
WGDATA[Cnt]=0;

if(Cnt==25)
a=1;
Cnt++;
ys100us(15);
}
if(DATA1==0)
{
WGDATA[Cnt]=1;

if(Cnt==25)
a=1;
Cnt++;
ys100us(15);
}


}

}
bit re(void)
{
if(Read_Card())
{
WG[3]=WGDATA[1];
WG[4]=WGDATA[2];
WG[5]=WGDATA[3];
return 1;
// SEND(&WG[0]);
}
DATA();
if(a==1)
{

EA=0; //关中断以免外部中断的干扰
a=0;
Cnt=0;
// rd24c(ptr,0,10);
// WG[0]=*ptr;
for(x=1;x<9;x++)
LL=(LL<<1)|WGDATA[x];
for(x=9;x<17;x++)
II=(II<<1)|WGDATA[x];
for(x=17;x<25;x++)
YY=(YY<<1)|WGDATA[x];
//WG[0]=rd24c(0);
//ysms(100);
WG[3]=LL;
WG[4]=II;
WG[5]=YY;
EA=1;
// SEND(&WG[0]);
return 1;
}
return 0;
} 
关键字:IIC  韦根26查询法  串口通讯 引用地址:IIC和韦根26的程序

上一篇:单片机控制1602液晶显示万年历
下一篇:流量传感器测量车辆瞬时耗油量的程序实验

推荐阅读最新更新时间:2024-03-16 13:06

IIC关键词解读微软嵌入式部门下一步发展战略
有业内人士预计,到2011年,中国嵌入式软件的整体销售有望达到4,650亿人民币。毫无疑问,中国乃至整个亚洲嵌入式软件市场的蓬勃发展,正在为众多软件供应商提供机遇。以微软为例,仅去年一年,其在亚太区的利润增长了40%,在中国市场的增长率更是达到了170%。正如微软Windows Embedded事业部总经理Kevin Dallas所言:“我们认为中国是充满激情、澎湃、有活力的市场,它会持续发展,尤其在带动消费类电子产品方面。”正是看到了嵌入式产业的广阔前景,微软公司计划将嵌入式部门本财年的全球研发投资提升为7,500万美元;作为计划的一部分,微软亚洲首个Windows Embedded区域研发中心——微软嵌入式系统开发中心(
[嵌入式]
STM32F103单片机IIC从机模式调试记录
STM32从机,接收到IIC信号,依次触发的事件为: 1.I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED 0x00820000 2.I2C_EVENT_SLAVE_BYTE_RECEIVED 0x00020040 3.I2C_EVENT_SLAVE_STOP_DETECTED 0x00000010
[单片机]
MSP430F5529硬件IIC驱动IIC接口的OLED
//****************************************************************************** // MSP430F552x Demo - USCI_B0, I2C Master multiple byte TX/RX // // Description: I2C master communicates to I2C slave sending and receiving // 3 different messages of different length. I2C master will enter LPM0 mode // while waiting
[单片机]
【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用。 但是在我们的HAL库中,对硬件IIC做了全新的优化,使得之前软件IIC几百行代码,在HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处 这可能是目前关于STM32CubeMX的硬件iic 讲的最全面和详细的一篇文章之一了 所用工具: 1、芯片: STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5、II
[单片机]
【STM32】HAL库 STM32CubeMX教程十二---<font color='red'>IIC</font>(读取AT24C02 )
深藏不露的'NUL'(51单片机串口通讯是遇到的错误之一)
NUl的定义: C语言中规定以字符 \0'作为字符串结束标志。 \0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是 空操作字符 , 它不引起任何控制动作,也不是一个可显示的字符 这是本人在用单片机做串口通讯时遇到的小问题,因为那个电子设备比较特殊,发送的数据也是比较的特殊,所以我便遇到了这个问题。一开始按照预定的指令和电子设备通讯,总是不行,后来通过串口调试器才发现,发送的数据只能发送一半。于是我返回去看代码,这才发现了症结所在。 以下便是我的程序出错的原因: 出错的程序代码段: void Send_data(char p ) { a=0; while(
[单片机]
基于HAL库 Stm32虚拟IIC总线
此源码可用于嵌入式单片机虚拟IIC和IIC芯片通信 /** ****************************************************************************** * @file hal_iic.c * @author kyj * @version V1.0 * @date * @brief IO模拟IIC ****************************************************************************** * @attention * *****************************
[单片机]
IIC总线通讯接口器件的CPLD实现
IIC总线是PHILIPS公司开发的一种简单、双向、二线制、同步串行总线。它只需两根线(串行时钟线和串行数据线)即可在连接于总线上的器件之间传送信息。该总线是高性能串行总线,具备多主机系统所需要的裁决和高低速设备同步等功能,应用极为广泛。 目前市场上虽然有专用IIC总线接口芯片,但是地址可选范围小、性能指标固定、功能单一、使用不方便。根据IIC总线的电气特性及其通讯协议,采用ALteRA公司的FLEX10K系列ISP器件EPF10K10LC84-3可以方便地实现IIC总线的通讯接口,且具有高速、易调试、可以灵活地实现地在线配置等优点,同时大大地减少了系统的开发周期。 1 IIC总线的数据传输规范 IIC总线主从机之间的
[嵌入式]
IIC总线通讯接口器件的CPLD实现
摘要:介绍了采用ALTERA公司的可编程器件EPF10K10LC84-3实现IIC总线的通讯接口的基本原理,并给出了部分的VHDL语言描述。该通讯接口与专用的接口芯片相比,具有使用灵活、系统配置方便的特点。 关键词:IIC总线 CPLD VHDL ISP IIC总线是PHILIPS公司开发的一种简单、双向、二线制、同步串行总线。它只需两根线(串行时钟线和串行数据线)即可在连接于总线上的器件之间传送信息。该总线是高性能串行总线,具备多主机系统所需要的裁决和高低速设备同步等功能,应用极为广泛。 目前市场上虽然有专用IIC总线接口芯片,但是地址可选范围小、性能指标固定、功能单一、使用不方便。根据IIC总线的电气特性及其通讯协议,采用ALT
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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