|
我是用時(shí)鐘顯示和定時(shí)器一起用,我的思想是:通過(guò)時(shí)間顯示來(lái)表示定到幾點(diǎn)鐘鬧鈴(蜂鳴器)響,在時(shí)鐘顯示程序里加如定時(shí)器計(jì)時(shí),當(dāng)計(jì)時(shí)到我要的時(shí)間(例如一分鐘后或一個(gè)小時(shí)后鬧鈴響),但定時(shí)器不能計(jì)時(shí)一個(gè)小時(shí),我覺(jué)得可能是我這種做鬧鐘的想法錯(cuò)了。求大神指點(diǎn)。
//通過(guò)設(shè)計(jì)TIME[7]中的數(shù)來(lái)設(shè)置時(shí)間,定時(shí)器定時(shí)了50ms,當(dāng)過(guò)50s時(shí),鬧鈴響起‘
- #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;//顯示//發(fā)送數(shù)據(jù)
-
- }
- 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
復(fù)制代碼
|
|