欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
用單片機定時器做時鐘,蜂鳴器做鬧鐘的程序問題
[打印本頁]
作者:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1