久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

IIC和韋根26的程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年06月02日   【字體:

終于完成了韋根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<config.h>
//#include<delay.h>
#ifndef MCU_MODEL
   #define  MCU_MODEL 51   //<----在此設定mcu類型, 51代表51系列; avr代表avr系列
#endif

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

//   #include<reg51.h>      //在此設定51類MCU的頭文件
//   #include<intrins.h>     //_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<iom16v.h>      //在此設定avr類MCU的頭文件
   #include<macros.h>
//   #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<<i)&0x80) // 判斷發送位(按位與,只要最高位為1則真)
SDA_H;
else
SDA_L;
DELAY_us;
SCL_H; //置時鐘線為高,通知被控器開始接收數據位*
DELAY_us; //保證時鐘高電平周期大于4μs*
}
SCL_L;
DELAY_us;
SDA_H; // 8位發送完后釋放數據線,準備接收應答位*
DELAY_us;
SCL_H;
DELAY_us;

SDA_TO_IN; //如果是avr單片機,就設SDA引腳位輸入狀態/

if(SDA_IF_L) //測試有無應答/
{ SDA_TO_OUT;
return(1); //有應答返回1
}
else
{ SDA_TO_OUT;
return(0); //無應答
}
}
void wt24c(uchar address,uchar date)
{

i2cstart();
i2cwt(0xa0);
i2cask();
i2cwt(address);
i2cask();
i2cwt(date);
i2cask();
i2cstop();
}
uchar rd24c(uchar address)
{
uchar temp;
i2cstart();
i2cwt(0xa0);
i2cask();
i2cwt(address);
i2cask();
i2cstart();
i2cwt(0xa1);
i2cask();
temp=i2crd();
return temp;
i2cstop();
}
查詢法讀韋根26程序
idata unsigned char 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;
} 
關閉窗口

相關文章

主站蜘蛛池模板: 日本在线看片 | 欧美性另类 | 国产成人精品一区二区三 | 精品欧美一区二区久久久伦 | 色婷婷久久 | 日韩精品在线视频 | 在线观看成人免费视频 | 7777精品伊人久久精品影视 | www久久| 欧美午夜精品 | 中国一级毛片免费 | 久久久久久国产 | 成人性视频免费网站 | 一区视频在线免费观看 | 国产色婷婷精品综合在线手机播放 | 欧美成人一区二区三区片免费 | 亚洲精品99999 | 成人免费精品视频 | 日韩一区二区三区视频 | 国产一级毛片视频 | 亚洲在线免费观看 | 亚洲欧美在线观看 | 91成人精品| 欧美视频免费在线 | 欧美爱爱视频 | 欧美日韩精品中文字幕 | 国精品一区二区 | 中文字幕亚洲一区二区三区 | 99re6在线视频精品免费 | 999久久久久久久久6666 | 在线a视频网站 | 欧美一级艳情片免费观看 | 日韩精品成人 | 亚洲精品久久久久中文字幕二区 | 欧美日韩亚洲一区 | 久久国产秒 | 国产区在线视频 | 欧美福利一区 | 欧美大片久久久 | 99精品视频在线观看免费播放 | 免费看爱爱视频 |