×
单片机 > 单片机程序设计 > 详情

IIC和韦根26的程序

发布时间:2020-06-23 发布时间:
|

终于完成了韦根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   //      //在此设定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  
// 
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查询法  串口通讯 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址