#include<AT89X051.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P3^1
sbit scl=P3^0
sbit key1=P1^7
sbit key2=P1^6
sbit key3=P1^5
sbit kz=P3^5
sbit bs=P3^4
char shi=12,fen=12,ke1,mm,mi,nh,nf,mn,mms,baos,a
bit ms,nt,b
uchar code SEG8[]={ 0x50,0x5F,0x94,0x15,0x1B,
0x31,0x30,0x57,0x10,0x11,
0x40,0x4F,0x84,0x05,0x0B,
0x21,0x20,0x47,0x00,0x01,
0x21,0xa2,0x52,0xff}
//0-9,0.-9.s.,f.,n 暗
void delay1ms(uchar ms)
{
uchar i
while(ms--)
{
for(i = 0i<250i++)
{
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
void display(char numh,char numf)
{
uchar qian,bai,sh,ge
if(ke1==1)
qian=20
else if(ke1==2)
qian=21
else if((ke1==3)||(ke1==4))
qian=22
else if(ke1==0)
qian=numh/10
if((ke1==1)||(ke1==2))
bai=23
else if(ke1==3)
bai=20
else if(ke1==4)
bai=21
else if(ke1==0)
{
bai=numh%10
if(ms)
bai=bai+10
}
if((ke1==1)||(ke1==3))
{sh=numh/10ge=numh%10}
else if((ke1==2)||(ke1==4)||(ke1==0))
{sh=numf/10ge=numf%10}
P1=SEG8[qian]
P3_3=0delay1ms(2)P3_3=1
P1=SEG8[bai]
P3_7=0delay1ms(2)P3_7=1
P1=SEG8[sh]
P3_2=0delay1ms(2)P3_2=1
P1=SEG8[ge]
P3_0=0delay1ms(2)P3_0=1
}
///////////x24c02//////////////////
void delay24()
{ }
void init24c02() //初始化
{
sda=1
delay24()
scl=1
delay24()
}
void start2() //开始信号
{
sda=1
delay24()
scl=1
delay24()
sda=0
delay24()
}
void stop() //停止
{
sda=0
delay24()
scl=1
delay24()
sda=1
delay24()
}
void respons() //应答
{
uchar i
scl=1
delay24()
while((sda==1)&&(i<250))i++
scl=0
delay24()
}
void write_byte(char date) // 写数据子函数
{
uchar i,temp
temp=date
for(i=0i<8i++)
{
temp=temp<<1
scl=0
delay24()
sda=CY
delay24()
scl=1
delay24()
}
scl=0
delay24()
sda=1
delay24()
}
uchar read_byte() // 读数据子函数
{
uchar i,k
scl=0
delay24()
sda=1
delay24()
for(i=0i<8i++)
{
scl=1
delay24()
k=(k<<1)|sda
scl=0
delay24()
}
return k
}
///////写数据函数///////////////////
void write_add(uchar address,char date)
{
start2()
write_byte(0xa0)
respons()
write_byte(address)
respons()
write_byte(date)
respons()
stop()
}
char read_add(uchar address) //读数据函数
{
uchar date
start2()
write_byte(0xa0)
respons()
write_byte(address)
respons()
start2()
write_byte(0xa1)
respons()
date=read_byte()
stop()
return date
}
void keyf(char *con,char up,char don)
{
uint i
for(i=0i<800i++)
{
if((ke1==1)||(ke1==2))
display(shi,fen)
else if((ke1==3)||(ke1==4))
display(nh,nf)
P1=0xff
if(key1==0)
{
delay1ms(10)
if(key1==0)
{
ke1++
if(ke1>=5)
ke1=0
while(!key1)
break
}
}
if(key2==0)
{
delay1ms(10)
if(key2==0)
{
i=0
*con+=1
if(*con>up)
*con=0
while(!key2)
}
}
if(key3==0)
{
delay1ms(10)
if(key3==0)
{
i=0
*con-=1
if(*con<don)
*con=up
while(!key3)
}
}
}
}
void key()
{
P1=0xff
if(key1==0)
{
EA=0
delay1ms(20)
if(key1==0)
{
ke1++
if(ke1>=5)
ke1=0
while(!key1)
}
if(ke1==1)
{
keyf(&shi,23,0)
}
if(ke1==2)
{
keyf(&fen,59,0)
}
if(ke1==3)
{
keyf(&nh,23,0)
}
if(ke1==4)
{
keyf(&nf,59,0)
}
P1=0xffP3=0xff
write_add(0x01,nh)
delay1ms(5)
write_add(0x03,nf)
ke1=0
EA=1
}
}
void Timer0Init(void)
{
TMOD |= 0x01
TL0 = 0xB0
TH0 = 0x3C
TF0 = 0
TR0 = 1
EA=1
ET0=1
}
void main()
{
P1=0xff
P3=0xff
init24c02()
nh=read_add(0x01)
delay1ms(50)
nf=read_add(0x03)
delay1ms(50)
Timer0Init()
while(1)
{
key()
display(shi,fen)
}
}
void tim0 ()interrupt 1
{
TH0=0X3C
TL0=0XB0
if(++mms>=10)
{
mms=0
ms=!ms
}
if(++mm>=20)
{
mm=0
if(++mi>=60)
{
mi=0
if(++fen>=60)
{
fen=0
if(++shi>=24)
shi=0
}
}
}
if(fen==0)
{
if((shi>=7)&&(shi<=20))
{
if((baos==0)&&(b==0))
{
baos=shi
baos=baos*2
b=1
}
if(++a==10)
{
a=0
if(--baos!=0)
{
bs=!bs
}
else
{
bs=1
}
}
}
}
else
b=0
if(nh==shi)
{
if(nf==fen)
{
if(nt==0)
{
P1=0xff
if(++mn==10)
{
mn=0
kz=!kz
}
if(key3==0)
{
nt=1
kz=1
}
}
}
else
{
nt=0
kz=1
}
}
}
你看看行不行#include<reg51.h>
uchar code tab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}
void view() /*七段数码管显示程序 七个管轮流液悉显示*/
{P3=0x01
unsigned int i=0
while(i<6)
{n=vnum
P1=tab[n]
P3<<=1
i++
}
}
void mDelay(unsigned int Delay) /*延时程序*/
{ unsigned int i
for(Delay>虚埋州0Delay--)
{ for(i=0i<124i++)
{}
}
}
void jumpnum() /*用于钟表时分秒的进位*/
{if(jnum(5)>9) /*秒进位
{jnum[4]=jnum[4]+1
jnum[5]=0
if(jnum[4]>6) /*秒到分进位
{jnum[3]=jnum[3]+1
jum[4]=0
if(jnum[3]>9) /*分进位
{jnum[2]=jnum[2]+1
jnum[3]=0
if(jnum[2]>6) /*分到时进位
{jnum[1]=jnum[1]+1
jnum[2]=0
if(jnum[1]>9) /*时的进位
{jnum[1]=0
jnum[0]=jnum[0]+1
}
else if(jnum[1]>4&&jnum[0]>=2)
{jnum[1]=0
jnum[0]=0
}
}
}
}
}
void key() /*键盘控制程序
{if((P2&0xFF)!=0xFF)/*防抖动
{mDelay(3000)
if((P2&0xFF)!=0xFF)
{unsign int c
c=1
while(c<4)
{ if((P2&0xFF)!=0xFF)
{mDelay(3000)
vnum[]=num[]
void view()
if((P2&0xFF)!=0xFF)
{switch(P2): /*判断不同的按键
{case 0xFE: c++/*c用于判断是闹钟调时c=3还是时钟调时c=2
case oxFD :if(c=2) /*分位增加
{num[3]++}
else if(c=3)
{lnum[3]++
}
case oxFC :if(c=2) /*时位增加
{num[1]++}
else if(c=3)
{lnum[1]++
}
}
if(c=2) /*增加后判断是否需要进位
{jnum[]=num[]
jumpnum()
vnum[]=num[]
void view[]}
if(c=3)
{jnum[]=lnum[]
jumpnum()
vnum[]=num[]
void view[]}}}}}}}
void clock() /*闹钟程序
{for(cl=0num[cl]==lnum(cl)cl=cl+1) /*当前时间与设定时间相同
{}
unsigned int kp=0
if(cl==5&&kp==0) /*闹钟铃声
{for(i=1i<100i++)
{P1_7=~P1_7
for(j=1i<=100j++)}
void mDelay(3000)
for(i=1i<100i++)
{P1_7=~P1_7
for(j=1i<=100j++)}
vnum[]=num[]
void view()
if((P2&0xFF)!=0xFF)/*判断是否有按键,有则停止闹钟
{mDelayd(3000)
void view()
if((P2&0xFF)!=0xFF)
{kp=1}
}}}
viod intclock() /*整点报时程序
{unsigned int ic,i
if(num[2]==5&&num[3]==9&&num[4]==5&&num[5]==0) /*判断差十秒整点差蔽
{if(ic=num[5]+2(ic==(num[5]+2))&&num[5]<59ic=num[5]) /*开始发出500hz声因
{for(i=0i<100i++)
{P1_7=~P1_7
for(i=0i<=100i++)
}
for(i=1i<150i++) /*1000hz声音
{P1_7=~P1_7
for(i=0i<=50i++)
}}}}
void count() inturrupt 1 using 2 /*计时程序
{cn++
if(cn==20)
{num[5]++
cn=0
}
}
void main()
{ P2=0x00
unsigned int num[5],jnum[5],lnum[5]
ET0=1
EA=1
TR0=1
EX0=1
EX1=1
IT0=1
IT1=1
TMOD=0x01
TH0=0x3C
TL0=0xB0
unsigned int cn=0
P2=0x00
while(1)
{void key()
void view()
void jumpnumber()
void clock()
void intclock()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)