标题:
用单片机定时器做时钟,蜂鸣器做闹钟的程序问题
[打印本页]
作者:
51单片机新手
时间:
2018-12-4 19:14
标题:
用单片机定时器做时钟,蜂鸣器做闹钟的程序问题
我是用时钟显示和定时器一起用,我的思想是:通过时间显示来表示定到几点钟闹铃(蜂鸣器)响,在时钟显示程序里加如定时器计时,当计时到我要的时间(例如一分钟后或一个小时后闹铃响),但定时器不能计时一个小时,我觉得可能是我这种做闹钟的想法错了。求大神指点。
//通过设计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
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1