我是用时钟显示和定时器一起用,我的思想是:通过时间显示来表示定到几点钟闹铃(蜂鸣器)响,在时钟显示程序里加如定时器计时,当计时到我要的时间(例如一分钟后或一个小时后闹铃响),但定时器不能计时一个小时,我觉得可能是我这种做闹钟的想法错了。求大神指点。
//通过设计TIME[7]中的数来设置时间,定时器定时了50ms,当过50s时,闹铃响起‘
- #include"reg52.h"
- #include"Ds1302.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit K1=P3^1;
- sbit K2=P3^0;
- sbit K3=P3^2;
- sbit K4=P3^3;
- sbit beep=P1^5;
- void delay(u16 i)
- {
- while(i--);
- }
- u8 disp[8];
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void Init()
- {
- TMOD=0X10;
- TH1=0xd8;
- TL1=0xf0;
- ET1=1;
- EA=1;
- TR1=1;
- }
- void Datapros()
- {
- Ds1302ReadTom();
- disp[0]=smgduan[TIME[2]/16];
- disp[1]=smgduan[TIME[2]&0X0F];
- disp[2]=0X40;
- disp[3]=smgduan[TIME[1]/16];
- disp[4]=smgduan[TIME[1]&0X0F];
- disp[5]=0X40;
- disp[6]=smgduan[TIME[0]/16];
- disp[7]=smgduan[TIME[0]&0X0F];
- }
- void Digdisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示//发送数据
-
- }
- P0=disp[7-i];
- delay(100);
- P0=0x00;
- }
- }
- void Ds1302Stop()
- {
- u8 a;
- if(0==K1)
- {
- a=0;
- delay(1000);
- while(!a)
- {
- Digdisplay();
- if(0==K2)
- {
- a=1;
- }
- }
- }
- }
- void Into() interrupt 3
- {
- u8 a;
- static u16 i;
- TH1=0xd8;
- TL1=0xf0;
- i++;
- if(1000==i)//
- {
- while(!a)
- {
- beep=~beep;
- delay(2000);
- if(0==K3)
- {
- a=1;
- }
- }
- }
- }
- void main()
- {
- Ds1302Init();
- Init();
- while(1)
- {
- Datapros();
- Digdisplay();
- Ds1302Stop();
- }
- }
- //Ds1302.c
- #include"Ds1302.h"
- uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- uchar TIME[7] = {0, 0, 0, 0x07, 0x05, 0x06, 0x16};
- void Ds1302Write(uchar addr,uchar dat)
- {
- uchar n;
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();
- RST=1;
- _nop_();
- for(n=0;n<8;n++)
- {
- DSIO=addr&0x01;
- addr>>=1;
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- for(n=0;n<8;n++)
- {
- DSIO=dat&0x01;
- dat>>=1;
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST=0;
- _nop_();
- }
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();
- RST=1;
- _nop_();
- for(n=0;n<8;n++)
- {
- DSIO=addr&0x01;
- addr>>=1;
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- for(n=0;n<8;n++)
- {
- dat=DSIO;
- dat1=(dat1>>1)|(dat<<7);
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST=0;
- _nop_();
- SCLK=1;
- _nop_();
- DSIO=0;
- _nop_();
- DSIO=1;
- _nop_();
- return dat1;
- }
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8e,0x00);
- for(n=0;n<7;n++)
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
- }
- Ds1302Write(0x8e,0x80);
- }
- void Ds1302ReadTom()
- {
- uchar n;
- for(n=0;n<7;n++)
- {
- TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);
- }
- }
- //Ds1302.h
- #ifndef _Ds1302_h
- #define _Ds1302_h
- #include"reg52.h"
- #include"intrins.h"
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- sbit DSIO=P3^4;
- sbit RST=P3^5;
- sbit SCLK=P3^6;
- void Ds1302Write(uchar addr,uchar dat);
- uchar Ds1302Read(uchar addr);
- void Ds1302Init() ;
- void Ds1302ReadTom();
- extern uchar TIME[7];
- #endif
复制代码
|