
#include <reg51h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit DS1302_SDA=P1^0;
sbit DS1302_SCK=P1^1;
sbit DS1302_RST=P1^2;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit BEEP=P3^7;
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar Display_Buffer[]={0x00,0x00,0xbf,0x00,0x00,0xbf,0x00,0x00};
uchar Display_Buffer1[]={0x00,0x00,0xbf,0x00,0x00,0xbf,0x00,0x00};
uchar Bit_CODE[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar Current_Time[7];
uchar alarm_clock[7];
char Flag=0;
char T_OR_A=0;
uchar w=0,u=0,v;
void delay_ms(uint x)
{
uchar i;
while(x--)for(i=0;i<120;i++);
}
void WriteAByteToDS1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
DS1302_SDA=x&0x01;
DS1302_SCK=1;
DS1302_SCK=0;
x>>=1;
}
}
uchar GetAByteFromDS1302(void)
{
uchar i,b=0X00,t;
for(i=0;i<8;i++)
{
b>>=1;
t=DS1302_SDA;
b|=t<<7;
DS1302_SCK=1;
DS1302_SCK=0;
}
return (b/1610+b%16);
}
void ResetDS1302(void)
{
DS1302_RST=0;
DS1302_SCK=0;
DS1302_RST=1;
}
uchar ReadData(uchar addr)
{
uchar dat;
ResetDS1302();
WriteAByteToDS1302(addr);
dat=GetAByteFromDS1302();
DS1302_SCK=0;
DS1302_RST=0;
return dat;
}
void WriteDS1302(uchar addr,uchar dat)
{
ResetDS1302();
WriteAByteToDS1302(addr);
WriteAByteToDS1302(dat);
DS1302_SCK=0;
DS1302_RST=0;
}
void SetDS1302(void)
{
uchar i;
WriteDS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
WriteDS1302(0x80+i2,(Current_Time[i]/10<<4)|(Current_Time[i]%10));
}
WriteDS1302(0x8e,0x80);
}
void GetTime(void)
{
uchar i,addr=0x81;
for(i=0;i<7;i++)
{
Current_Time[i]=ReadData(addr);
addr+=2;
}
}
void time0Init(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void ScanKey(void)
{
if(KEY1==0)
{
delay_ms(10);
if(KEY1==0);
{
while(!KEY1);
w=w++;
if(w==5)w=1;
switch(w)
{
case 1:Flag=1;break;
case 2:Flag=1; break;
case 3:Flag=1; break;
case 4:SetDS1302();
Flag=0;
break;
}
}
}
if(w!=0)
{
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
while(!KEY2);
switch(w)
{
case 1:Current_Time[0]++;break;
case 2:Current_Time[1]++;break;
case 3:Current_Time[2]++;break;
}
}
}
if(KEY3==0)
{
delay_ms(10);
if(KEY3==0)
{
while(!KEY3);
switch(w)
{
case 1:Current_Time[0]--;break;
case 2:Current_Time[1]--;break;
case 3:Current_Time[2]--;break;
}
}
}
}
if(KEY4==0)
{
delay_ms(10);
if(KEY4==0)
{
while(!KEY4);
u++;
if(u==5)u=1;
switch(u)
{
case 1:T_OR_A=1;
break;
case 2:break;
case 3:break;
case 4:T_OR_A=0;break;
}
}
}
if(u!=0)
{
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
while(!KEY2);
switch(u)
{
case 1:alarm_clock[0]++;break;
case 2:alarm_clock[1]++;break;
case 3:alarm_clock[2]++;break;
}
}
}
if(KEY3==0)
{
delay_ms(10);
if(KEY3==0)
{
while(!KEY3);
switch(u)
{
case 1:alarm_clock[0]--;break;
case 2:alarm_clock[1]--;break;
case 3:alarm_clock[2]--;break;
}
}
}
}
}
void Play(uchar t)
{
uchar i;
for(i=0;i<100;i++)
{
BEEP = ~BEEP;
delay_ms(t);
}
BEEP = 0;
}
void main(void)
{
//uchar i;
SetDS1302();
time0Init();
//GetTime();
while(1)
{
if(Flag==0)
GetTime();
Display_Buffer[0]=DSY_CODE[Current_Time[2]/10];
Display_Buffer[1]=DSY_CODE[Current_Time[2]%10];
Display_Buffer[3]=DSY_CODE[Current_Time[1]/10];
Display_Buffer[4]=DSY_CODE[Current_Time[1]%10];
Display_Buffer[6]=DSY_CODE[Current_Time[0]/10];
Display_Buffer[7]=DSY_CODE[Current_Time[0]%10];
//Display_Buffer[0]=DSY_CODE[Current_Time[2]/10];
ScanKey();
Display_Buffer1[0]=DSY_CODE[alarm_clock[2]/10];
Display_Buffer1[1]=DSY_CODE[alarm_clock[2]%10];
Display_Buffer1[3]=DSY_CODE[alarm_clock[1]/10];
Display_Buffer1[4]=DSY_CODE[alarm_clock[1]%10];
Display_Buffer1[6]=DSY_CODE[alarm_clock[0]/10];
Display_Buffer1[7]=DSY_CODE[alarm_clock[0]%10];
if((Current_Time[2]==alarm_clock[2])&&(Current_Time[1]==alarm_clock[1])&&(Current_Time[0]==alarm_clock[0]))//闹钟
Play(1);
}
}
void tiemr0() interrupt 1
{
//if(flag1) j++;
uchar i,j;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(T_OR_A==0)
{
for(i=0;i<8;i++)
{
P2=Bit_CODE[i];
P0=Display_Buffer[i];
delay_ms(2);
}
}
else
{
for(j=0;j<8;j++)
{
P2=Bit_CODE[j];
P0=Display_Buffer1[j];
delay_ms(2);
}
}
}
上面是基于DS1302和LED数码管的可调闹钟C语言程序!
#include <reg51h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92, 0x82 ,0XD8,0x80,0x90,0xFF};
//不带小数点的显示段码表
uchar code table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10, 0xFF};
//带小数点的的显示段码表
uchar dis[3]={0x00,0x00,0x00}; //定义一个显示缓冲数组
void add(); //加函数
void reduce(); //减函数
void delay(uint t); //延时函数
void display(); //显示函数
void adc(); //AD转换函数
void change(); //比较调整输出函数
void init(); //显示值赋值函数
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit wr=P3^3;
sbit intr=P3^6;
sbit rd=P3^7;
uchar var=0;
int var2;
uchar num,out=0;
void display()
{
P3_0=1;
P0=table[dis[0]];
delay(1);
P3_0=0;
P3_1=1;
P0=table[dis[1]];
delay(1);
P3_1=0;
P3_2=1;
P0=table0[dis[2]];
delay(1);
P3_2=0;
}
void init()
{
var2=var195;
dis[0]=var2%10; //个位
dis[1]=var2/10%10; //十位
dis[2]=var2/100%10; //百位
}
void main()
{
P2=0;
var=200; //预设初始值
P3_0=0;
P3_1=0;
P3_2=0;
init();
if(P3_4==1 && P3_5==1)
display();
while(1)
{
adc();
change();
if (P3_4==0)
{
add();
while(!P3_4) ;
}
if(P3_5==0)
{
reduce();
while(!P3_5);
}
if(P3_4==1 && P3_5==1)
display();
}
}
void add()
{ var++;
delay(1);
init();
}
void reduce()
{ var--;
if(var==0xff)
{var=0;}
delay(1);
init();
}
void adc()
{
wr=1;
wr=0;
delay(10);
wr=1;
while(intr==0)
{}
rd=0;
delay(10);
num=P1;
}
void change()
{
if(var<num)
{ if((num-var)>=10)
{ if(out>=10)
{ out=out-10;
P2=out;
}
}
else if (out>=1)
{ out--;
P2=out;
}
}
if(var>num)
{ if( (var-num)>=10)
{ if(out<=245)
{ out=out+10;
P2=out;
}
}
else if (out<=254)
{out++;
P2=out;
}
}
}
void delay (uint t)
{ uint i,j;
for (i=0;i<t;i++)
for (j=0;j<120;j++)
;
}
运行结果图:
运行结果不复制不过来,有什么问题可以找我,我再给你发到邮箱什么的都可以。
以上就是关于那要如何在用DS1302与1602LCD设计的可调式电子日历与时钟的程序里加上闹铃的功能啊程序要怎么加进去啊全部的内容,包括:那要如何在用DS1302与1602LCD设计的可调式电子日历与时钟的程序里加上闹铃的功能啊程序要怎么加进去啊、跪求51单片机控制1602液晶显示时钟的protues原理图及c语言程序,请各位大侠帮忙啊、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)