立即注册 登录
返回首页

uid:108531的个人空间

日志

发一个源程序

已有 972 次阅读2016-3-12 18:23 | 源程序

本来这个方案在去年就要完成的,没想一拖再拖,没有条件没有时间,直到依附今天才完成,决定开源


#include <reg51.H>
#include <intrins.h>
sbit SDA=P3^7;/*定义数据线*/
sbit SCL=P3^6;/*定义时钟线*/

bit ACK;
unsigned char Addwr=0xA0;/*器件地址及写信号*/
unsigned char Addrd=0xA1;/*器件地址及读信号*/
unsigned char  code zhifu [15]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x92,0x0E,0x09,0xFE,0xF7};
/*LED字符定义数组:0,1,2,3,4,5,6,7,8,9,S,F,H,-,_*/
unsigned char *p1;
sbit P2_7=P2^7;
sbit P2_6=P2^6;
sbit P2_5=P2^5;
sbit P2_4=P2^4;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
unsigned char shi=0;/*做为设定时间的变量*/
unsigned char fen=0;
unsigned char miao=0;
unsigned char temp=20;
unsigned char key_a;
unsigned char shi_T;/*存储LED显示字符,时,分,秒高低各2位*/
unsigned char shi_T;
unsigned char shi_L;
unsigned char fen_T;
unsigned char fen_L;
unsigned char miao_T;
unsigned char miao_L;
bit panduan=1;
void delay(unsigned int t)/*延时子程序*/
{unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<600;j++);
}

void  key()/*按键处理程序*/
{
if(P1_0==0)
   {delay(20);
  shi++;
  while(P1_0==0)
  {}
     if(shi>23)
       {shi=0;}
  delay(20);
  }

    if(P1_1==0)
    {delay(20);
  fen++;
   while(P1_1==0)
   {}
      if(fen>59)
        {fen=0;}
   delay(20);
   }

if(P1_2==0)
     {delay(20);
    miao++;
  while(P1_2==0)
   {}
  if(miao>59)
  {miao=0;}
  delay(5);
    }

}

void  table_data(unsigned char a1,unsigned char a2,unsigned char a3)
{unsigned char d;
p1=zhifu;
d=a1/10;
p1=p1+d;
shi_T=*p1;

p1=zhifu;
d=a1%10;
p1=p1+d;
shi_L=*p1;
p1=zhifu;
d=a2/10;
p1=p1+d;
fen_T=*p1;
p1=zhifu;
d=a2%10;
p1=p1+d;
fen_L=*p1;
p1=zhifu;
d=a3/10;
p1=p1+d;
miao_T=*p1;
p1=zhifu;
d=a3%10;
p1=p1+d;
miao_L=*p1;
}

void led6(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f)
{P0=a;
P2=0x7F;
delay(1);
P0=b;
P2=0xBF;
delay(1);
P0=c;
P2=0xDF;
delay(1);
P0=d;
P2=0xEF;
delay(1);

P0=e;
P2=0xF7;
delay(1);
P0=f;
P2=0xFB;
delay(1);
}
void start_iic()/*开始信号函数*/
{
  SDA=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SDA=0;/*IIC总线起动*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL=0;/*总线忙碌*/
}
  
void stop_iic()/*总线停止函数*/
{SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void send_data(unsigned char a)/*送字节函数*/
{ unsigned char b;
   unsigned char conbit=8;/*送出8位数据的控制变量*/
   b=a;
       while(conbit)
        {  
          if(b&0x80)
             {SDA=1;}/*求出最高位*/
      else
         {SDA=0;}
          _nop_();
         _nop_();
      _nop_();
      _nop_();
    _nop_();
       SCL=1;/*将最高位数值送出*/
      _nop_();
      _nop_();
    _nop_();
          _nop_();
      _nop_();
       SCL=0;/*送完值*/
      conbit--;
    b=b<<1;/*向左移一位*/  
       }
  
    }
unsigned char  rcv_data()/*接收一个字节函数*/
{unsigned char b=0;
unsigned char i;
    for(i=0;i<8;i++)
   {SDA=1;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
      SCL=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      b=b<<1;
       if(SDA==1)
       {b++;}
      SCL=0;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
      }
  return(b);
    }
  bit  send_ack()/*送出答应信号*/
{ bit ACKbit;
  SDA=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL=0;
}



bit rcv_ack()/*接收答应信号函数*/
{ bit ACKbit=1;
  SDA=1;/*准备接收答应信号*/
   _nop_();
_nop_();
_nop_();
_nop_();
   _nop_();
SCL=1;/*接收答应位*/
if(SDA==1)
    ACKbit=1;/*无效的答应信叼*/
else
    ACKbit=0;/*有效的答应信号*/
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return(ACKbit);
}
void iic_writer(unsigned char a1,unsigned char a2,unsigned char a3)/*第一个变量为器件地址写,第二个变量为器件内单元地址,第三个变量为发送的数据*/
{ start_iic();
  send_data(a1);
  rcv_ack();
  send_data(a2);
  rcv_ack();
  send_data(a3);
  rcv_ack();
  stop_iic();
}
unsigned char iic_read(unsigned char a1,unsigned char a2,unsigned char a3)/*第一个变量是器件地址写,第二个变量为器件内单片地址,第三个变量为器件地址读*/

{ unsigned char b;
   start_iic();
  send_data(a1);
  rcv_ack();
  send_data(a2);
  rcv_ack();
  start_iic();
  send_data(a3);
  rcv_ack();
  b=rcv_data();
  send_ack();
  stop_iic();
  return(b);
}



void sure()/*确认函数,按下确认键把设定的时间计下*/
{
if(P1_3==0)
{delay(20);
  panduan=0;
  delay(20);
  }
iic_writer(Addwr,01,shi);
iic_writer(Addwr,02,fen);
iic_writer(Addwr,02,miao);

}
wait_key()
{if(P1_3==0)
  {
   delay(20);
   TR0=!TR0;
   delay(20);
   }
}


main()
{
   EA=1;/*开定时器T0中断*/
   ET0=1;
   TMOD=0x01;/*定时器选择T0工作在方式1*/
   TH0=0xC3;
   TL0=0x50;
   panduan=1;

while(panduan)
{key();
table_data(shi,fen,miao);
led6(fen_T,fen_L,miao_T,miao_L,shi_T,shi_L);
sure();
}
panduan=1;
TR0=1;/*开定时器,正试工作*/
while(panduan)
{
table_data(shi,fen,miao);
led6(fen_T,fen_L,miao_T,miao_L,shi_T,shi_L);
wait_key();

}
}
time0() interrupt 1/*中断程序*/
{
TR0=0;
TH0=0x3C;
TL0=0x50;
temp--;
if(temp==0xFF)
{temp=20;
    miao--;
   if(miao==0xFF)
   {   miao=59;
       fen--;
       if(fen==0xFF)
        { fen=59;
       shi--;
           if(shi==0xFF)
              {
      P1_4=1;
      
     }
         }  
    }
}
TR0=1;

}                                                                                              

路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部