发一个源程序
已有 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;
}