『壹』 急需電子時鍾的設計,利用單片機AT89C52、時鍾晶元DS1302、1602液晶顯示器來控制的,要有c程序。
#include<reg52.h>
#include<define.h>
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void didi()
{
beep=0;
delay(50);
beep=1;
delay(100);
beep=0;
delay(50);
beep=1;
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
EA=1;
EX0=1;
IT0=1;
la=0;
wela=0;
lcden=0;
// set_time();
set_alarm(14,13,10);
write_ds(0x0B,0x26);
read_ds(0x0c);
// fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(flag1==1)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
flag1=0;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
flag1=0;
}
}
}
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
flag=1;
flag1=0;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
flag=0;
write_ds(0,miao);
write_ds(2,fen);
write_ds(4,shi);
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(1);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(1);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
/* if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void write_ds(uchar add,uchar date)
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
dsas=0;
dsrw=0;
P0=date;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add)
{
uchar ds_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P0=add;
dsas=0;
dsds=0;
P0=0xff;
ds_date=P0;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
void set_time()
{
write_ds(4,10);
write_ds(2,32);
}
void set_alarm(uchar ashi,uchar afen,uchar amiao)
{
write_ds(1,amiao);
write_ds(3,afen);
write_ds(5,ashi);
}
void main()
{
init();
while(1)
{
keyscan();
if(flag1==1)
didi();
if(flag==0)
{
miao=read_ds(0);
fen=read_ds(2);
shi=read_ds(4);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
}
}
}
void exter() interrupt 0
{ uchar c;
flag1=1;
c=read_ds(0x0c);
}
『貳』 求單片機ds1302+1602電子鍾c語言編程。謝謝。
//液晶顯示溫度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令數據控制端
sbit RW=P3^6; //讀寫選擇端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20與單片機連介面
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定義初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16個字元
unsigned char line2[16]={" time: 00:00:00"}; //16個字元
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //數組
uchar
data disdata[5];
uint tvalue; //溫度值
uchar tflag; //溫度正負標志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)
{
unsigned
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void delay5ms()//延時5毫秒(不夠精確的)
{
unsigned
int i;
for (i=0;i<1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i<20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m>0;m--)
for(n=255;n>0;n--);
}
void wr_com(unsigned char comm)
//********寫控制字元程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端
RS=0;
//********RS寄存器選擇輸入端,當RS=0;當進行寫模塊操作,指向指令寄存器。
RW=0;
//********當RS=1,無論是讀操作還是寫操作,都是指向數據寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****當前位置寫字元子程序:E=1 RS=1 RW=0
{
LCDE=0;
RS=0;
//********RS寄存器選擇輸入端,當RS=0;當進行寫模塊操作,指向指令寄存器。
RW=0;
//********當RS=1,無論是讀操作還是寫操作,都是指向數據寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //將dat賦給P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙狀態檢查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}
void init()//**********初始化程序,必須按照產品的資料介紹的過程進行********//
{
wr_com(0x38); //*****顯示模式設置必須三次,不用檢測忙信號
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****游標移動設置,寫一個字元後地址指針加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***顯示模式設置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***顯示開,不顯示游標***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***這些延時可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i<6;i++)
{wr_data(line1[i]); //display(6個字元)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i<16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}
/******************************溫度感測器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
void ds1820rst()/*ds1820復位*/
{ unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(4); //延時
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時大於480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*讀數據*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //讀一個位元組的數據函數
{ DQ = 0; //給脈沖信號
dat>>=1;
DQ = 1; //給脈沖信號
if(DQ)
dat|=0x80; //等價於 dat =
dat | 0x80,dat和0x80做「或」的運算, 結果是最高位置1,其它位保持不變。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數據*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
//右移一位
}
}read_temp()/*讀取溫度值並轉換*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0x44);//*啟動溫度轉換*/
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0xbe);//*讀取溫度*/
a=ds1820rd(); //讀低八位
b=ds1820rd(); //讀高八位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else //「&」 是邏輯與「|」 是邏輯或if(dat & 0x01):不管dat是什麼數和0x01(00000001)做了「與」的運算後,最低位保持不變,其它位均為0.如果dat的最低位為1,則表達式為真,就會執行if語句中的內容。如果dat最低位為0,則表達式為假,不執行if語句,執行if語句後的下一條語句。dat |= 0x80:等價於 dat = dat | 0x80,dat和0x80做「或」的運算,意思是最高位置1,其它位保持不變。
具體的可以去參考一下C語言的相關語法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//溫度值顯示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位數
disdata[1]=tvalue%1000/100+0x30;//十位數
disdata[2]=tvalue%100/10+0x30;//個位數
disdata[3]=tvalue%10+0x30;//小數位
if(tflag==0)
flagdat=0x20;//正溫度不顯示符號
else
flagdat=0x2d;//負溫度顯示負號:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位為0,不顯示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位為0,十位為0也不顯示
}
}
wr_com(0x88);
wr_data(flagdat);//顯示符號位
wr_com(0x89);
wr_data(disdata[0]);//顯示百位
wr_com(0x8a);
wr_data(disdata[1]);//顯示十位
wr_com(0x8b);
wr_data(disdata[2]);//顯示個位
wr_com(0x8c);
wr_data(0x2e);//顯示小數點
wr_com(0x8d);
wr_data(disdata[3]);//顯示小數位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//讀取溫度
ds1820disp();//顯示
time(); //時間程序
display();//時間顯示程序
}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}
給你參考一下,這樣才能提高哦
『叄』 如何做一個單片機電子時鍾
這個很簡單啊,兩種思路:1,用單片機定時器來做,優點是外圍電路簡單,只需要一個單片機最小系統,和一個顯示模塊(1602液晶比較好);缺點是:定時不是很准,跑的時間長了會有誤差,而且主要是程序,要寫很多,不過程序不是很難。2,用時鍾晶元,一般都用DS1302,還需要單片機最小系統和顯示模塊,優點是:定時准確,誤差很小,在有備用電池的情況下,即使單片機掉電,也可以維持很長時間,程序相對簡單。缺點是:外圍電路比前者相對復雜一點。如果想做個實際的東西拿來用,建議使用第二種方法,如果是想鍛煉自己的編程能力的話,選第一種吧。祝成功!
『肆』 51單片機設計一個電子鍾,如何實現鬧鍾功能
用C語言If條件語句實現循環,當達到某一條件時給某一I/O埠傳遞信號,該I/O埠接蜂鳴器即可。電子技術中的計數器也可對此有幫助,設置60.60.24的程序,即可實現報時。
『伍』 用AT89C52單片機設計一個時鍾程序
我最近正在做一個鬧鍾程序,能調時間,能定時,能用蜂鳴器鬧鈴,不過是用八位數碼管顯示的,我這有1602液晶,等改完以後給你,這個挺簡單,溫度需要A/D采樣電路,我這沒有這個電路,不能提供
『陸』 單片機定時鬧鍾程序分布解釋
//頭文件
#include<reg51.h>
//數據類型定義
#define ui unsigned int
#define uc unsigned char
//定義蜂鳴器管腳是BEEP
//數碼管顯示查表
uc code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x89,0xc7,0xff};
uc t0,a,b,c,d,e,f,miao,fen,xs,n;
void display(uc,uc,uc);
//延時1ms函數
void delay(ui z)//延時1毫秒
{
ui a,b;
for(a=z;a>0;a--)
for(b=100;b>0;b--);
}
void init();
void keyscan();
void main() //主函數,在主函數中設置定時的時間,當時間到達預定值時,蜂鳴器響起
{
BEEP=1;
init();
while(1)
{
keyscan();
display(xs,fen,miao);
if(xs==7&&fen==0&&miao==0)
{
n=5;
while(n--)
{
BEEP=0;
delay(500);
BEEP=1;
delay(500);
}
}
}
}
void keyscan() //鍵盤掃描子函數,通過按鍵來實現相應的動作
{
P3=0x7f;
while(P3!=0x7f)
{
delay(10);
while(P3!=0x7f)
{
switch(P3)//按鍵檢測程序段 可以一同按鍵來更改秒分時的數值
{
case 0x7e:{miao++;if(miao==60)miao=0;}//如果加到頭了 就變0
break;
case 0x7d:{miao--;if(miao==0xff)miao=59;}//如果減到頭了 就變59
break;
case 0x7b:{fen++;if(fen==60)fen=0;}//同上
break;
case 0x77:{fen--;if(fen==0xff)fen=59;}//同上
break;
}
while(P3!=0x7f);
delay(10);
while(P3!=0x7f);
}
}
P3=0xbf;
while(P3!=0xbf)
{
delay(10);
while(P3!=0xbf)
{
switch(P3)
{
case 0xbe:{xs++;if(xs==24)xs=0;}//如果加到頭了 就變0
break;
case 0xbd:{xs--;if(xs==0xff)xs=23;}//如果減到頭 就變23 因為小時最大為24 其實24:00=0:00
break;
}
while(P3!=0xbf);
delay(10);
while(P3!=0xbf);
}
}
}
void init() //系統初始化開啟定時器0中斷
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
}
//秒 分 時 變數的實時計數 運用tmer1中斷來實現 50ms中斷一次 中斷20次就是1s
void timer0() interrupt 1 //定時器1中斷子程序,實現正常的走秒
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==20)
{
t0=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
xs++;
if(xs==24)
xs=0;
}
}
}
}
//運用數碼管的動態掃描方式,來驅動數碼管
void display(uc xs,uc fen,uc miao) //顯示函數,把數送到數碼管顯示
{
P2=0xfe;//選擇該位
P0=tab[miao%10];// 顯示段碼
delay(1);//延時
P0=0xff;//斷碼關掉 防止掃描出現幻影 後面的同上 以此類推
P2=0xfd;
P0=tab[miao/10];
delay(1);
P0=0xff;
P2=0xfb;
P0=tab[16];
delay(1);
P0=0xff;
P2=0xf7;
P0=tab[fen%10];
delay(1);
P0=0xff;
P2=0xef;
P0=tab[fen/10];
delay(1);
P0=0xff;
P2=0xdf;
P0=tab[16];
delay(1);
P0=0xff;
P2=0xbf;
P0=tab[xs%10];
delay(1);
P0=0xff;
P2=0x7f;
P0=tab[xs/10];
delay(1);
P0=0xff;
}
『柒』 基於單片機STC80C51 +1602+DS1302的數字時鍾帶鬧鍾的程序怎麼寫
就是用32.768M的晶振,並且要用雙電源吧?我記得做過,需要可以來找我,我隨時都在線,等待回復
『捌』 那要如何在用DS1302與1602LCD設計的可調式電子日歷與時鍾的程序里加上鬧鈴的功能啊程序要怎麼加進去啊
#include <reg51.h>
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/16*10+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+i*2,(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語言程序!
『玖』 基於51單片機,DS1302,1602實現萬年歷(年月日時分秒)及鬧鍾功能的C程序,不要顯示農歷和溫度,謝謝!!
【八】電子表、萬年歷系列
[1]單片機公交車環境監測及時間顯示系統
功能描述:
1、按鍵調時間
2、帶備用電池(斷電繼續走時)
3、監測雜訊和溫濕度並實時顯示
4、超過報警值蜂鳴器會響
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMDUwMA==.html
[2]單片機語音報時電子表
功能描述:
1、按鍵調試設置鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMwMjM0OA==.html
[3]單片機紅外遙控電子表語音報時語音播報溫濕度
功能描述:
1、紅外遙控調時間設定鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時語音播報溫濕度
4、按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMTUyOA==.html
[4]單片機紅外遙控電子表語音報時格林威治時間雙顯示
功能描述:
1、紅外遙控調時間設定鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時語音播報溫濕度
4、按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMTUyOA==.html
[5]單片機多功能萬年歷電子表系統節日提醒溫濕度顯示
功能描述:
1、按鍵調時間,設置鬧鍾
2、帶備用電池(斷電繼續走時)
3、陽歷、農歷節日提醒;可顯示上午、中午、晚上、午夜、深夜等時間段
4、溫濕度實時顯示(可替換其他感測器數據顯示)
5、功能擴展:語音播報萬年歷、溫濕度等。(此項功能為擴展功能,需要需補差價)
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTU0MjI4OTExNg==.html
【二十】GPS授時定位系統系列
[1]GPS自動授時系統 語音報時/播報溫濕度
實現功能:
1.可設置授時模式為自動授時和手動更新
2.可脫離GPS數據利用本地時鍾晶元准確走時
3.可設置靜音模式、整點報時和自動語音播報溫濕度及其混合模式等四種語音工作模式
4.可以切換顯示本地時間和溫濕度數據和GPS衛星時間數據和定位數據
5.經過分析GPS數據,利用演算法縮短了解析時間在秒級時間內就能獲取到GPS時間數據(正常情況下,完成定位需要幾分鍾以上)
6.(亮點)利用演算法自動計算星期參數和農歷參數,程序內部演算法輸入任何陽歷日期數據即可得到准確的星期數據和農歷數據
7.利用12864串口工作模式,節省了8個IO
8.可根據需求進行功能定製
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMjUzMzcyNTkyOA==.html