娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月20日(星期二)

2018年05月20日 | 用51模擬I2C從機程序

發布者:qiuxubiao 來源: eefocus關鍵字:模擬I2C  從機程序 手機看文章 掃描二維碼
隨時隨地手機看文章

/********************************************************************/
//宏觀聲明
#include
#include
#define nop() _nop_()
#define uchar unsigned char
#define uint unsigned int
/*
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;
/********************************************************************/
//EEPROM 聲明文件
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83
/********************************************************************/
//紅外學習聲明
uchar data IRcode[4],IRcode2[4];
uchar CodeTemp;
uchar i,j,k,p,studyi,num;
uchar IRS_STATE=0;
uchar idata key_ircode[30][4];
sbit IRsignal=P3^2;
sbit LED1=P1^6; 
sbit LED2=P1^7;
/********************************************************************
sbit Skey=P2^7;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit key5=P2^4;
/********************************************************************/ 
//I2C聲明文件
sbit SDA=P3^3;
sbit SCL=P3^7; 
/********************************************************************/ 
uchar data keynum;
/********************************************************************/
//-----------------------------------------------------
//static bit OP;        //紅外發射管的亮滅
//static unsigned int count;       //延時計數器
//static unsigned int endcount; //終止延時計數
static unsigned char Flag;      //紅外發送標志
char iraddr1;  //十六位地址的第一個字節
char iraddr2;  //十六位地址的第二個字節
sbit IR_SEND=P1^3;
uchar cnt;
uint value;
//------------------------------------------------------------
#define FOSC    11059200
#define T38KHz (FOSC / 4 / 37900)
/********************************************************************/
void Delay0_9ms(void)//0.9毫秒延遲
{
unsigned char i, j;
 _nop_();
 _nop_();
 _nop_();
 i = 10;
 j = 170;
 do
 {
  while (--j);
 } while (--i);
}
void Delay1ms(void)//1毫秒延遲
{
/*********************************************************************/
unsigned char i, j;

 _nop_();
 i = 11;
 j = 190;
 do
 {
  while (--j);
 } while (--i);
}
/********************************************************************/
void Delay4ms(void)//4毫秒延遲
{
unsigned char i, j;

 _nop_();
 _nop_();
 _nop_();
 i = 44;
 j = 3;
 do
 {
  while (--j);
 } while (--i);
}
/********************************************************************
void Delay500us()//0.5毫秒延遲  //@11.0592MHz
{
 unsigned char i, j;

 i = 6;
 j = 93;
 do
 {
  while (--j);
 } while (--i);
}
********************************************************************/
void Delay(void)//  普通延遲
{
uchar i,j,k;
  for(i=200;i>0;i--)
  for(j=200;j>0;j--)
  for(k=3;k>0;k--);
}
/*****************************************************************/
void putchar(unsigned char data1)//字符發送函數 
{
SBUF = data1; //將待發送的字符送入發送緩沖器
while(TI == 0); //等待發送完成
TI = 0; //發送中斷標志請0
}
/*****************************************************************/
void putstring(unsigned char *dat)//字符串發送函數
{
for(i=0;i<4;i++) //判斷字符串是否發送完畢
{
putchar(*dat); //發送單個字符
dat++; //字符地址加1,指向先下一個字符
}
}
/****************************************************************/
void initUart(void)//串口初始化
{
    TMOD=0x20;     //用定時器設置串口波特率
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 REN=1;          //串口初始化
 SM0=0;
 SM1=1;
 EA=1;           //開啟總中斷
 ES=1;
}

/****************************************************************/
void IRinit()//紅外學習聲明初始化
{
    IT0=1;
 EX0=0;
 EA=1;
 CodeTemp=0;
}
void IICinitSteve()//I2C從總線初始化
{
 IT1=0;
 EX1=1;
 EA=1;
}
/****************************************************************/
void PCAinit()//PCA定時器0初始化
{
 CCON = 0;                       //Initial PCA control register
                                    //PCA timer stop running
                                    //Clear CF flag
                                   //Clear all module interrupt flag
    CL = 0;                         //Reset PCA base timer
    CH = 0;
    CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2
                                    //Disable PCA timer overflow interrupt
    value = T38KHz;
    CCAP0L = value;                 //P1.3 output 100KHz square wave
 CCAP0H = value >> 8;            //Initial PCA module-0
    value += T38KHz;            //Initial PCA module-0
    CCAPM0 = 0x4d;                  //PCA module-0 work in 16-bit timer mode and enable PCA interrupt, toggle the output pin CEX0(P1.3)

    CR = 0;                         //PCA timer start run
    EA = 1;
    cnt = 0; 
}
/****************************************************************/
void T0init()
{
  Flag = 0;
  P3_4 = 1;
  EA = 1; //允許CPU中斷 
  TMOD |= 0x01; //設定時器0和1為16位模式1 
  ET0 = 1; //定時器0中斷允許
}
/****************************************************************/
void IapIdle()//EEPROM初始化
{
 IAP_CONTR=0;
 IAP_CMD=0;
 IAP_TRIG=0;
 IAP_ADDRH=0X80;
 IAP_ADDRL=0;
}
/****************************************************************/
uchar IapReadByte(uint addr)//EEPROM讀取命令
{
 uchar dat;
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_READ;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 dat=IAP_DATA;
 IapIdle();

 return dat;
}
/****************************************************************/
void IapProgramByte(uint addr,uchar dat)//EEPROM 寫入命令
{
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_PROGRAM;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_DATA=dat;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 IapIdle();
}
/****************************************************************/
void IapEraseSector(uint addr)//EEPROM清除命令
{
 IAP_CONTR=ENABLE_IAP;
 IAP_CMD=CMD_ERASE;
 IAP_ADDRL=addr;
 IAP_ADDRH=addr>>8;
 IAP_TRIG=0x5a;
 IAP_TRIG=0xa5;
 nop();

 IapIdle();
}
/****************************************************************
void keycan()
{
 if(key1==0)
 {
  Delay();
  if(key1==0)
  {
   while(key1==0);
   keynum=0;
  }
 }
 else if(key2==0)
 {
  Delay();
  if(key2==0)
  {
   while(key2==0);
   keynum=1;
  }
 } 
 else if(key3==0)
 {
  Delay();
  if(key3==0)
  {
   while(key3==0);
   keynum=2;
  }
 } 
 else if(key4==0)
 {
  Delay();
  if(key4==0)
  {
   while(key4==0);
   keynum=3;
  }
 } 
 else if(key5==0)
 {
  Delay();
  if(key5==0)
  {
   while(key5==0);
   keynum=4;
  }
 }

 
}
/****************************************************************/
void int0(void) interrupt 0 using 2//紅外學習命令
{  
 EA=0; 
 for(k=0;k<10;k++)
 {
  Delay0_9ms();
  if(IRsignal==1)
  {
  k=10;break;
  }
  else if(k==9)
  {
   while(IRsignal==0);
   Delay4ms();
   Delay1ms();
//   Delay500us();
   for(i=0;i<4;i++)
   {
    for(j=1;j<=8;j++)
    {
     while(IRsignal==0);
     Delay0_9ms();
     
     if(IRsignal==1)
     {
      Delay1ms();
      CodeTemp=CodeTemp|0x80;
      if(j<8) CodeTemp=CodeTemp>>1;
     }
     else
     if(j<8)CodeTemp=CodeTemp>>1;
    }
    IRcode[i]=CodeTemp;
    CodeTemp=0; 
   }
   
   Delay();
    studyi++;
  }
 }
 if(studyi==1)
 {
  for(i=0;i<4;i++)
  {
  IRcode2[i]=IRcode[i]; 
  }
 }
 if(studyi==2)
 {
  for(i=0;i<4;i++)
  {
  if(IRcode2[i]!=IRcode[i])
  {
   studyi=0;
   break;
  }
  if(i==3)
  {
  for(i=0;i<4;i++)
  {
  key_ircode[keynum][i]=IRcode[i];
  }
  EX0=0;
  LED2=1;
  } 
  }
  studyi=0;
 }
 EA=1;
}
void SendIRdata(uchar IR[])
{
  int i;       
  char irdata;
  //---發紅外碼
  CR = 1;
  //發送9ms的起始碼
  TH0 = 0xDF; 
  TL0 = 0x98; //設定時值0為38K 也就是每隔26us中斷一次  
  TR0 = 1;//開始計數
  Flag=1;
  P3_4=0;  
  do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
  //發送4.5ms的結果碼
  TH0 = 0xEF; 
  TL0 = 0xcb; //設定時值0為38K 也就是每隔26us中斷一次  
  TR0 = 1;//開始計數
  Flag=1;
  P3_4=1;
  do{}while(Flag!=0);

  //發送十六位地址的前八位
  irdata=IR[0];
  for(i=0;i<8;i++)
  {

     //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止發送紅外信號(即編碼中的高電平
     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次  
       TR0 = 1;  //1為寬的高電平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次  
     TR0 = 1;   //0為窄的高電平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //發送十六位地址的后八位
  irdata=IR[1];
  for(i=0;i<8;i++)
  {
    //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止發送紅外信號(即編碼中的高電平)
     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次  
       TR0 = 1;  //1為寬的高電平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次  
     TR0 = 1;   //0為窄的高電平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //發送八位數據
  irdata=IR[2];
  for(i=0;i<8;i++)
  {
     //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止發送紅外信號(即編碼中的高電平)
     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次  
       TR0 = 1;  //1為寬的高電平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次  
     TR0 = 1;   //0為窄的高電平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }

  //發送八位數據的反碼
  irdata=IR[3];
  for(i=0;i<8;i++)
  {
    //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
     CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次  
    TR0 = 1;
     Flag=1;
  P3_4=0;
     do{}while(Flag!=0);
  CR=0;
  IR_SEND=1;
    //停止發送紅外信號(即編碼中的高電平)
     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
     {
       TH0 = 0xf9; 
       TL0 = 0xee; //設定時值0為38K 也就是每隔26us中斷一次  
       TR0 = 1;  //1為寬的高電平
     }
    else
     {
      TH0 = 0xfd; 
     TL0 = 0xfa; //設定時值0為38K 也就是每隔26us中斷一次  
     TR0 = 1;   //0為窄的高電平
     }
    Flag=1;
 P3_4=1;
    do{}while(Flag!=0);

    irdata=irdata>>1;
  }
    CR=1;
    TH0 = 0xfd; 
    TL0 = 0xf6; //設定時值0為38K 也就是每隔26us中斷一次  
    TR0 = 1;
  Flag=1;
   P3_4=0;
 do{}while(Flag!=0);
 CR=0;
 IR_SEND=1;
  P3_4=1;
  Flag=0;
}
/****************************************************************/
 bit iic_start_decide()////IIC 開始判斷
{
 while(SCL==0);////開始不滿足條件
 while((SCL==1)&&(SDA==1));///開始條件
 if((SCL==1)&&(SDA==0))////開始
 {
  while(SCL==1);///等待到時鐘開始低跳變
  return 1;
 }
 else
 return 0;
}
/****************************************************************/
bit iic_stop_decide()////IIC 結束判斷
{
 while(SCL==0);////結束不滿足條件
 if((SCL==1)&&(0==SDA))////結束
 {
  while(SDA==0);///等待到數據開始高跳變
  return 1;
 }
 else
 {
 return 0;}
}
/****************************************************************/
uchar iic_receive()
{
 uchar i;
 uchar rdata='0';
 SDA=1;
 for(i=0;i<8;i++)
 {
  rdata<<=1;
  while(SCL==0);///當時鐘為低時,數據無效,等待
  if(SDA==1)
  rdata++;
  while(SCL==1);///防止在一個高電平時讀8次
 }
 return (rdata);
}
/****************************************************************/
bit iic_ack_decide()
{
bit ack_flag;///局部變量
SDA=0;////8位發送完畢,釋放數據線SDA,準備接收應答位
while(SCL==0);///等待SCL變高電平
//ack_flag=0;
while(SCL==1);///等待SCL變高電平
SDA=1;
ack_flag=1;
return(ack_flag);
}
void keynum_receive()
{
     iic_start_decide();
  iic_receive();
  iic_ack_decide();
  iic_receive();
  iic_ack_decide();
  keynum=iic_receive();
  iic_ack_decide();
  iic_stop_decide();
}
/****************************************************************/
void main()//主程序
{

/*******************************************************************/
//初始化動作    
 studyi=0;     //紅外學習狀態
   initUart();   //串口初始化
 IRinit();   //紅外學習初始化
 IICinitSteve();
 PCAinit();
 T0init();              
 keynum=0xff;   //按鍵初始化
/********************************************************************/
 for(p=0;p<30;p++)
 {
 for(i=0;i<4;i++)
 {
  key_ircode[p][i]=IapReadByte(0x0000+(p*4)+i);
 }
 } 
/*******************************************************************/ 
  while(1)
  { 
//   keycan();
 while(keynum==0xff);
   if(IRS_STATE==0)//遙控狀態
 {
 /********************************************************************
  if(Skey==0)//觸發學習鍵
  {
   Delay();
   if(Skey==0);
   {
   while(Skey==0);
   LED1=0;
   IRS_STATE=1;
   } 
  }
 /********************************************************************/ 
  if(keynum==16)//觸發學習鍵
  {
   LED1=0;
   IRS_STATE=1; 
  }
  else if(keynum!=0xff)
  {
  putstring(key_ircode[keynum]);
  SendIRdata(key_ircode[keynum]); 
  }
 }
 else if(IRS_STATE==1)//學習狀態
 {
/********************************************************************/ 
  if((keynum!=0xff)&&(keynum!=16))
  {
    EX0=1;
    LED2=0;
    while(LED2==0); 
  }
/********************************************************************/     
  if(keynum==16)//觸發學習鍵
  {
   LED1=1;
   LED2=1;
   EX0=0;
   IapEraseSector(0x0000);
   for(p=0;p<30;p++)
    {
    for(i=0;i<4;i++)
     {
       IapProgramByte((0x0000+(p*4)+i), key_ircode[p][i]);
     }
    }
   IRS_STATE=0;
   } 
 }
 keynum=0xff;
  }

}
/****************************************************************/
void ser() interrupt 4 //串口中斷
{
 RI=0;
 num=1;
}
void PCA_isr() interrupt 7 using 1
{
    CCF0 = 0;                       //Clear interrupt flag
    CCAP0L = value;
 CCAP0H = value >> 8;            //Update compare value
    value += T38KHz;                     //Clear interrupt flag
}
void timeint(void) interrupt 1 

  Flag=0;
  TR0=0;
}
void II2C_INT1(void) interrupt 2
{
 EX1=0;
 keynum_receive();
 EX1=1;
}


關鍵字:模擬I2C  從機程序 引用地址:用51模擬I2C從機程序

上一篇:I2C模擬程序----匯編語言格式
下一篇:最后一頁

推薦閱讀

貝達藥業丁列明團隊獲余杭區人才科技突出貢獻獎,獎勵1000萬元;省級領軍型創新創業團隊杭州暖芯迦電子科技有限公司,獲獎500萬元;榮獲浙江省科技進步一等獎的浙江運達風電股份有限公司,獎勵100萬元……昨天,余杭舉行科技創新大會暨2018“創新余杭”人才科技活動周啟動儀式。會議現場,最受關注的當數發放創新獎勵:依據現行產業扶持政策、人才新政等規...
在2018年第五屆世界互聯網大會上,Arm中國全新人工智能平臺“周易”首次公開亮相,并獲得第五屆世界互聯網大會“世界互聯網領先科技成果”。半年時間過去,客戶對周易平臺有了進一步了解,無論IP還是軟件框架都獲得了廠商的認可。在此前提下,近日,Arm中國生態發展副總裁、OPEN AI LAB創始人兼CEO金勇斌及Arm中國產品經理高錦煒解讀了周易平臺的更多細...
1.新建一個DEMO文件夾2.KeilC51中點擊新建文件3.命名工程,并保存到DEMO文件夾中4.選擇芯片設備(我們選擇AT89C52芯片)5.添加啟動文件(STARTUP.A51)6.整個工程建好了,但是這個時候工程沒有東西,需要添加文件7.新建main.c文件7.1點擊左上方新建文件圖標(或者使用快捷鍵CTRL+N)7.2出現一個不知名的Text1文件7.3保存該Text1為main.c文件(點擊左上角工...
新浪數碼訊 5月19日上午消息,去年9月天風國際分析師郭明錤的一份報告稱,今年的Apple Watch將迎來外觀上的革新,而近日海外博主Jon Prosser在博客中透露了關于這款產品的新信息?! on Prosser認為Apple Watch Series 7將會采用與iPhone 12相同的設計語言,更扁平的邊框和平面的玻璃。畢竟從iPhone 12、iPad Air/Pro再到新推出的iMa...

史海拾趣

問答坊 | AI 解惑

NULL的定義問題?

請哪位高手指導一下,如何看下面的定義: #ifndef NULL #define NULL ((void *) 0) #endif 主要是“   ((void *) 0)  ”,為什么這么復雜?…

查看全部問答∨

大俠都進來啊,單片機怎么解密

我現在有個新茂的SM5964C40P   0909C    N11952CMN  型單片機,由于不想編程,想直接把里面的程序燒出來,那位大俠能告訴我這個型號的能燒出來嗎,…

查看全部問答∨

GPIO 設置成省電模式

大家好! 關于不用的GPIO設置成睡眠模式更省電呢?有的說是輸入、有的輸出或高阻,為什么呢?…

查看全部問答∨

【急】怎么才能知道設備加載了那個驅動?

我插上2.4GRF無線鼠標,可以使用,但是我想知道它加載的什么驅動,怎么辦?插上和拔下串口都無打印信息,用驅動調試助手查看加載的驅動,停用相關的都沒發現,幫幫我?!?

查看全部問答∨

【散分】:昨天、今天跑通了51+12864液晶字符、圖形顯示程序!

液晶型號CA12864A(帶字庫,7920控制器),C51單片機。程序C、ASM的都有。兩個早上,所有問題迎刃而解,高興中!…

查看全部問答∨

想問問有什么工具能檢測板子焊接的是否正確?

我用Protel99畫的板子,做出來焊接之后發現有問題,用萬用表量的好辛苦才發現有個引腳焊短路了,不知道有什么工具可以檢測板子焊接的是否跟原理圖一致呢? 不怕花錢,2萬以下的設備公司還是能承受的…

查看全部問答∨

為什么仿真出現負值?

作了一個串口發送。仿真出現負值。頂層模塊為——module read_txd(clkin,addr_read//,num2     );input          clkin;output  [ 7:0] addr_read;//output [4:0]num2;reg  &nbs ...…

查看全部問答∨

求助KEIL MDK 邏輯分析儀的使用,仿真M3的PWM

求助KEIL MDK 邏輯分析儀的使用,仿真M3的PWM  是不是symbol 里面POARTA 右邊的地址沒有???!  …

查看全部問答∨

并網發電中,分析電網,用什么來代替電網

大家好,最近在看并網發電的知識,請教一下大家,我們在做理論分析時,拿什么元器件或電路來代替電網? [ 本帖最后由 secondlife110 于 2012-8-28 11:43 編輯 ]…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 慈溪市| 治县。| 呼图壁县| 安陆市| 昌江| 遂川县| 新源县| 临朐县| 理塘县| 邵武市| 宣威市| 葫芦岛市| 苍梧县| 东丽区| 定南县| 保山市| 南投市| 台州市| 红安县| 明溪县| 夹江县| 肇州县| 沙坪坝区| 新营市| 师宗县| 阳山县| 吉隆县| 葵青区| 长子县| 邢台市| 昔阳县| 仙游县| 信阳市| 邵阳县| 三亚市| 独山县| 富平县| 师宗县| 潢川县| 涿州市| 库尔勒市|