⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c21-2.c

📁 C51单片机模拟I2C传输协议进行数据的读取写入
💻 C
字号:
#include <REG51.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
#define STATUS_KEY 0xdf
#define INC_KEY 0xfb
#define DEC_KEY 0xf7
#define OK_KEY 0xef
#define ON 0
#define OFF 1
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
sbit SDA=P3^7;
sbit SCL=P3^6;
sbit OUT=P1^0;
uchar cnt1,cnt2,sec,min,hour,status;
uchar set1_m,set1_h,set2_m,set2_h;
uchar bdata com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
bit set1_flag,set2_flag;
//==============================================================================
void pout(void);
uchar scan_key(void);
uchar rd_2401(char a);
void wr_2401(char a,uchar b);
void ic_delay(uint n);
void delay(uint k);
//==============================================================================
void initial(void)
{
  uchar rd_val;
  rd_val=rd_2401(100);
  if(rd_val==88)
  {
     set1_m=rd_2401(80);ic_delay(250);
     set1_h=rd_2401(81);ic_delay(250);
     set2_m=rd_2401(90);ic_delay(250);
     set2_h=rd_2401(90);ic_delay(250);
     set1_flag=rd_2401(70);ic_delay(250);
     set2_flag=rd_2401(71);ic_delay(250);
  }
  TMOD=0x11;
  TH0=-(50000/256);
  TL0=-(50000%256);
  TR0=1;ET0=1;
  TH1=-(1000/256);
  TH1=-(1000%256);
  TR1=1;ET1=1;EA=1;
}
//===============================================================================
void main(void)
{
  uchar key_val;
  initial();
  for(;;)
  {
    pout();
    key_val=scan_key();
    if(key_val==STATUS_KEY)
    {
      status++;
      if(status==5)
      {
         status=0;
         EA=0;
         wr_2401(80,set1_m);ic_delay(250);
         wr_2401(81,set1_h);ic_delay(250);
         wr_2401(90,set2_m);ic_delay(250);
         wr_2401(91,set2_h);ic_delay(250);
         wr_2401(70,set1_flag);ic_delay(250);
         wr_2401(71,set2_flag);ic_delay(250);
         wr_2401(100,88);ic_delay(250);
         EA=1;
      }
      delay(300);
    }  
/********************************************************************************/
   if(key_val==INC_KEY)
   {
     switch(status)
     {
       case 1:if(set1_m<59)set1_m++;delay(300);break;
       case 2:if(set1_h<23)set1_h++;delay(300);break;
       case 3:if(set2_m<59)set2_m++;delay(300);break;
       case 4:if(set2_h<23)set2_h++;delay(300);break;
       default:break;
     }
   }
/********************************************************************************/
   if(key_val==DEC_KEY)
   {
     switch(status)
     {
       case 1:if(set1_m>0)set1_m--;delay(300);break;
       case 2:if(set1_h>0)set1_h--;delay(300);break;
       case 3:if(set2_m>0)set2_m--;delay(300);break;
       case 4:if(set2_h>0)set2_h--;delay(300);break;
       default:break;
     }
   }
/********************************************************************************/
   if(key_val==OK_KEY)
   {
     if((status==1)||(status==2))set1_flag=~set1_flag;delay(300);
     if((status==3)||(status==4))set2_flag=~set2_flag;delay(300);
   }
  }
}
//================================================================================
uchar scan_key(void)
{
  uchar temp;
  P3=0xff;
  temp=P3;
  if(temp!=0xff)
  {
    delay(30);
    temp=P3;
    if(temp!=0xff)
    return temp;
  }
  return 0;
}
//=================================================================================
void pout(void)
{
  if(set1_flag)
  {
   if((min==set1_m)&&(hour==set1_h))OUT=ON;
	else OUT=OFF;
  }
  if(set2_flag)
  {
   if((min==set2_m)&&(hour==set2_h))OUT=ON;
	else OUT=OFF;
  }
}
//=================================================================================
void serve1(void) interrupt 1
{
  TH0=-(50000/256);
  TL0=-(50000%256);
  cnt1++;
  if(cnt1>=20){sec++;cnt1=0;}
  if(sec>=60){min++;sec=0;}
  if(min>=60){hour++;min=0;}
  if(hour>=24)hour=0;
}
//================================================================================
void delay(uint k)
{
  uint i,j;
  for(i=0;i<k;i++)
  {
    for(j=0;j<121;j++)
    {;}
  }
}
//=================================================================================
void serve_2(void) interrupt 3
{
  static bit bit_flag;
  TH1=-(1000/256); 
  TL1=-(1000%256);
  cnt2++;
  if(status==0){if(cnt2>5)cnt2=0;}
  else {if(cnt2>29)cnt2=0;}
  if(status==0)
  {
    switch(cnt2)
    {
      case 0:P0=SEG7[sec%10];P2=ACT[0];break;
      case 1:P0=SEG7[sec/10];P2=ACT[1];break;
      case 2:P0=SEG7[min%10];P2=ACT[2];break;
      case 3:P0=SEG7[min/10];P2=ACT[3];break;
      case 4:P0=SEG7[hour%10];P2=ACT[4];break;
      case 5:P0=SEG7[hour/10];P2=ACT[5];break;
      default:break;
    }
  }
/**********************************************************************************/
  if(status==1)
  {
    switch(cnt2)
    {
      case 0:P0=SEG7[status];P2=ACT[0];break;
      case 1:if(set1_flag)P0=0x01;
             else P0=0x00;P2=ACT[1];break;
      case 2:P0=SEG7[set1_m%10];P2=ACT[2];break;
      case 3:P0=SEG7[set1_m/10];P2=ACT[3];break;
      case 4:P0=SEG7[set1_h%10];P2=ACT[4];break;
      case 5:P0=SEG7[set1_h/10];P2=ACT[5];break;
      default:if(bit_flag){P0=SEG7[set1_m%10];P2=ACT[2];bit_flag=~bit_flag;}
              else {P0=SEG7[set1_m/10];P2=ACT[3];bit_flag=~bit_flag;}break;
    }
  }
/**********************************************************************************/
  if(status==2)
  {
    switch(cnt2)
    {
      case 0:P0=SEG7[status];P2=ACT[0];break;
      case 1:if(set1_flag)P0=0x01;
             else P0=0x00;P2=ACT[1];break;
      case 2:P0=SEG7[set1_m%10];P2=ACT[2];break;
      case 3:P0=SEG7[set1_m/10];P2=ACT[3];break;
      case 4:P0=SEG7[set1_h%10];P2=ACT[4];break;
      case 5:P0=SEG7[set1_h/10];P2=ACT[5];break;
      default:if(bit_flag){P0=SEG7[set1_h%10];P2=ACT[4];bit_flag=~bit_flag;}
              else {P0=SEG7[set1_h/10];P2=ACT[5];bit_flag=~bit_flag;}break;
    }
  }
/**********************************************************************************/
  if(status==3)
  {
    switch(cnt2)
    {
      case 0:P0=SEG7[status];P2=ACT[0];break;
      case 1:if(set2_flag)P0=0x01;
             else P0=0x00;P2=ACT[1];break;
      case 2:P0=SEG7[set2_m%10];P2=ACT[2];break;
      case 3:P0=SEG7[set2_m/10];P2=ACT[3];break;
      case 4:P0=SEG7[set2_h%10];P2=ACT[4];break;
      case 5:P0=SEG7[set2_h/10];P2=ACT[5];break;
      default:if(bit_flag){P0=SEG7[set2_m%10];P2=ACT[2];bit_flag=~bit_flag;}
              else {P0=SEG7[set2_m/10];P2=ACT[3];bit_flag=~bit_flag;}break;
    }
  }
/*********************************************************************************/
  if(status==4)
  {
    switch(cnt2)
    {
      case 0:P0=SEG7[status];P2=ACT[0];break;
      case 1:if(set2_flag)P0=0x01;
             else P0=0x00;P2=ACT[1];break;
      case 2:P0=SEG7[set2_m%10];P2=ACT[2];break;
      case 3:P0=SEG7[set2_m/10];P2=ACT[3];break;
      case 4:P0=SEG7[set2_h%10];P2=ACT[4];break;
      case 5:P0=SEG7[set2_h/10];P2=ACT[5];break;
      default:if(bit_flag){P0=SEG7[set2_h%10];P2=ACT[4];bit_flag=~bit_flag;}
              else {P0=SEG7[set2_h/10];P2=ACT[5];bit_flag=~bit_flag;}break;
    }
  }
}
//================================================================================
void start(void)
{
  SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void stop(void)
{
  SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void ack(void)
{
  SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void shift8(uchar a)
{
  uchar data i;
  com_data=a;
  for(i=0;i<8;i++)
  {
    SDA=mos_bit;
    SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    com_data=com_data*2;
  }
}
//================================================================================
uchar rd_2401(char a)
{
  uchar data i,command;
  SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  start();
  command=160;
  shift8(command);
  ack();
  shift8(a);
  ack();
  start();
  command=161;
  shift8(command);
  ack();
  SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  for(i=0;i<8;i++)
  {
    com_data=com_data*2;
    SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    low_bit=SDA;
    SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  }
  stop();
  return com_data;
}
//=================================================================================
void wr_2401(char a,uchar b)
{
  uchar data command=160;
  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  start();
  shift8(command);
  ack();
  shift8(a);
  ack();
  shift8(b);
  ack();
  stop();
  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//=================================================================================
void ic_delay(uint n)
{
  uint i;
  for(i=0;i<n;i++)
  {;}
}

  
  
  

  
  




  






    
    
  




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -