標(biāo)題:
1602 DS1302按鍵調(diào)時(shí) 鬧鐘程序
[打印本頁]
作者:
阿文111
時(shí)間:
2017-8-2 07:59
標(biāo)題:
1602 DS1302按鍵調(diào)時(shí) 鬧鐘程序
所有資料51hei提供下載:
1602 DS1302按鍵調(diào)時(shí) 鬧鐘.zip
(53.36 KB, 下載次數(shù): 43)
2017-8-2 07:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit clock=P2^1; // 鬧鐘
sbit ds=P2^0; // 18b20
bit flag1;
uint temp;
sbit SCK=P1^7;
sbit SDA=P1^6;
sbit RST=P1^5;// DS1302復(fù)位
sbit set=P3^4;//定義按鍵端口
sbit s1=P3^5;
sbit s2=P3^6;
sbit s3=P3^7;
sbit RS=P1^0;//RS為數(shù)據(jù)/指令選擇1/0
sbit RW=P1^1;//讀寫
sbit E=P1^2;//E為使能信號(hào)
bit flag;//是否讀取時(shí)間的標(biāo)志位
uchar setn=0;//復(fù)位鍵、增加鍵、減少鍵按下次數(shù)
uchar code time0[]="20 - - ";
uchar code time1[]=" : : ";
uchar code time2[]=" Noise : : ";
uchar code time3[]=" Noise Power: ";
uchar l_tmpdate[7];//秒分時(shí)日月周年// 可隨時(shí)更改
uchar code write_add[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時(shí)日月周年 寫的寄存器地址
uchar code read_add[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分時(shí)日月周年 讀的寄存器地址
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共陰數(shù)碼管 0-9加'-'熄滅表
void delay(uint z)
{
while(--z);
}
void write_com(uchar com)//液晶寫命令函數(shù)
{
RS=0;//寫命令使能
RW=0;//寫
delay(100);
E=0;
P0=com;
E=1;
delay(10);
E=0;
}
void write_data(uchar dat)//液晶寫數(shù)據(jù)函數(shù)
{
RS=1;//寫數(shù)據(jù)使能
RW=0;
delay(10);
E=0;
P0=dat;
E=1;
delay(10);
E=0;
}
void init()//液晶初始化
{
uchar num;
E=0;
write_com(0x38);//顯示模式設(shè)置
write_com(0x38);
write_com(0x38);
write_com(0x08);//顯示關(guān)閉
write_com(0x01);//顯示清屏
write_com(0x06);//光標(biāo)移動(dòng)設(shè)置整屏不移動(dòng)
write_com(0x0c);//屏幕開、光標(biāo)不閃(0)不顯示(0)
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(time0[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<9;num++)
{
write_data(time1[num]);
delay(5);
}
}
void delay1(uint t)
{
while(t--);
}
void ds_reset()
{
ds=1;
delay1(5);
ds=0;
delay1(80);
ds=1;
delay1(14);
if(ds==0)
flag1=1;
else
flag1=0;
delay1(20);
}
bit ds_read_bit()
{
bit dat;
ds=0;
_nop_();
_nop_();
ds=1;
_nop_();
dat=ds;
delay1(10);
return dat;
}
uchar ds_read_byte()
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=ds_read_bit();
k=(j<<7)|(k>>1);
}
return k;
}
void ds_write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
_nop_();
ds=dat&0x01;
delay1(6);
ds=1;
dat=dat>>1;
}
delay(6);
}
uint read_temperature()
{
uchar a,b;
ds_reset();
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte();
b=ds_read_byte();
temp=b;
temp=temp<<8;
temp=temp|a;
temp=temp*0.0625*10+0.5;
return temp;
}
void display_18b20()
{
write_com(0x80+0x40+11);
write_data(temp/100+0x30);
write_com(0x80+0x40+12);
write_data((temp%100)/10+0x30);
write_com(0x80+0x40+13);
write_data('.');
write_com(0x80+0x40+14);
write_data((temp%100)%10+0x30);
write_com(0x80+0x40+15);
write_data('C');
}
void Write_Ds1302_Byte(uchar temp) //寫一個(gè)字節(jié)
{
uchar i;
for (i=0;i<8;i++) //循環(huán)8次寫入數(shù)據(jù)
{
SCK=0;
SDA=temp&0x01; //每次傳輸?shù)妥止?jié)
temp>>=1; //右移一位
SCK=1;
}
}
void Write_Ds1302(uchar add,uchar dat )//向寄存器寫數(shù)據(jù)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;//啟動(dòng)
_nop_();
Write_Ds1302_Byte(add); //發(fā)送地址
Write_Ds1302_Byte(dat); //發(fā)送數(shù)據(jù)
RST=0; //恢復(fù)
}
uchar Read_Ds1302_Byte()//讀一個(gè)字節(jié)
{
uchar i,temp=0x00;
for (i=0;i<8;i++) //循環(huán)8次 讀取數(shù)據(jù)
{
if(SDA)
temp|=0x80; //每次傳輸?shù)妥止?jié)
SCK=0;
temp>>=1; //右移一位
SCK=1;
}
return(temp);
}
uchar Read_Ds1302(uchar address )//從寄存器讀數(shù)據(jù)
{
uchar date;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
date=Read_Ds1302_Byte();
RST=0;
_nop_(); //以下為DS1302復(fù)位的穩(wěn)定時(shí)間
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (date);
}
void Read_RTC(void) //讀取日歷
{
uchar i,*p;
p=read_add; //讀的地址傳遞
for(i=0;i<7;i++) //分7次讀取 秒分時(shí)日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
void Set_RTC(void) //設(shè)定日歷
{
uchar i,*p,tmp;
for(i=0;i<7;i++)
{ //BCD處理,將十六進(jìn)制轉(zhuǎn)換成十進(jìn)制
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
p=write_add;//傳要寫的寄存器地址
for(i=0;i<7;i++) //7次寫入秒分時(shí)日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
void write_lcd()
{
static uchar i,temp[2];
switch(i)
{
case 0: write_com(0x80+0x40+0x07);break;//秒
case 1: write_com(0x80+0x40+4);break;//分
case 2: write_com(0x80+0x40+1);break;//時(shí)
case 3: write_com(0x80+0x08);break;//日
case 4: write_com(0x80+5);break;//月
case 5: write_com(0x80+0x0e);break;//星期
case 6: write_com(0x80+2);break;//年
}
temp[0]=l_tmpdate[i]/16;//數(shù)據(jù)的轉(zhuǎn)換
temp[1]=l_tmpdate[i]&0x0f;
write_data(0x30+temp[0]);
write_data(0x30+temp[1]);
i++;
if(i==7)
i=0;
}
uchar change(uchar x)//十進(jìn)制轉(zhuǎn)換成十六進(jìn)制
{
uchar tep,y;
y=x;
tep=y/16;
y=y%16;
y=y+tep*10;
return y;
}
void keyscan()
{
uchar tem[2],tp,Flag;//存儲(chǔ)要更改的時(shí)間數(shù)據(jù)
if(set==0)
{
flag=1;//時(shí)間停止
delay(500);//去鍵盤按下抖動(dòng)
if(set==0)
{
delay(500);
while(!set);
delay(500);//去鍵盤抬起時(shí)抖動(dòng)
while(!set);
delay(500);
setn++;
if(setn==1)
{
write_com(0x80+0x40+8);//將光標(biāo)移動(dòng)到秒個(gè)位
write_com(0x0f);//顯示光標(biāo)并且閃爍
}
if(setn==2)
{
write_com(0x80+0x40+5);//將光標(biāo)移動(dòng)到分個(gè)位
write_com(0x0f);//顯示光標(biāo)并且閃爍
}
if(setn==3)
{
write_com(0x80+0x40+2);//將光標(biāo)移動(dòng)到時(shí)個(gè)位
write_com(0x0f);//顯示光標(biāo)并且閃爍
}
if(setn==4)
{
write_com(0x80+15); // 將光標(biāo)移動(dòng)到星期
write_com(0x0f);
}
if(setn==5)
{
write_com(0x80+9); // 將光標(biāo)移動(dòng)到日
write_com(0x0f);
}
if(setn==6)
{
write_com(0x80+6); // 將光標(biāo)移動(dòng)到月
write_com(0x0f);
}
if(setn==7)
{
write_com(0x80+3); // 將光標(biāo)移動(dòng)到年
write_com(0x0f);
}
if(setn==8)
{
setn=0;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
flag=0;//時(shí)鐘正常運(yùn)行
write_com(0x0c);//光標(biāo)停止閃爍
}
}
}
if(setn!=0)//更改時(shí)間
{
if(s1==0)//增加時(shí)間
{
delay(5000);
if(s1==0)
{
while(!s1);
delay(5000);//去鍵盤抬起時(shí)抖動(dòng)
while(!s1);
if(setn==1)
{
l_tmpdate[0]=change(l_tmpdate[0]);
l_tmpdate[0]++;
if(l_tmpdate[0]>=60)
l_tmpdate[0]=0;
{
tp=l_tmpdate[0]/10;
l_tmpdate[0]=l_tmpdate[0]%10;
l_tmpdate[0]=l_tmpdate[0]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+7); //秒
tem[0]=l_tmpdate[0]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[0]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+8);
Flag=1;
}
if(setn==2)
{ l_tmpdate[1]=change(l_tmpdate[1]);
l_tmpdate[1]++;
if(l_tmpdate[1]==60)
l_tmpdate[1]=0;
{
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[1],l_tmpdate[1]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+4); //分
tem[0]=l_tmpdate[1]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[1]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+5);
}
if(setn==3)
{ l_tmpdate[2]=change(l_tmpdate[2]);
l_tmpdate[2]++;
if(l_tmpdate[2]>=24)
l_tmpdate[2]=0;
{
tp=l_tmpdate[2]/10;
l_tmpdate[2]=l_tmpdate[2]%10;
l_tmpdate[2]=l_tmpdate[2]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[2],l_tmpdate[2]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+1); //時(shí)
tem[0]=l_tmpdate[2]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[2]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+2);
}
if(setn==4)
{
l_tmpdate[5]=change(l_tmpdate[5]);
l_tmpdate[5]++;
if(l_tmpdate[5]==8)
l_tmpdate[5]=1;
{
tp=l_tmpdate[5]/10;
l_tmpdate[5]=l_tmpdate[5]%10;
l_tmpdate[5]=l_tmpdate[5]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[5],l_tmpdate[5]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+14); //星期
tem[0]=l_tmpdate[5]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[5]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+15);
}
if(setn==5)
{
l_tmpdate[3]=change(l_tmpdate[3]);
l_tmpdate[3]++;
if(l_tmpdate[3]==32)
l_tmpdate[3]=0;
{
tp=l_tmpdate[3]/10;
l_tmpdate[3]=l_tmpdate[3]%10;
l_tmpdate[3]=l_tmpdate[3]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[3],l_tmpdate[3]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+8); //日
tem[0]=l_tmpdate[3]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[3]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+9);
}
if(setn==6)
{
l_tmpdate[4]=change(l_tmpdate[4]);
l_tmpdate[4]++;
if(l_tmpdate[4]==13)
l_tmpdate[4]=0;
write_com(0x80+5); //月
{
tp=l_tmpdate[4]/10;
l_tmpdate[4]=l_tmpdate[4]%10;
l_tmpdate[4]=l_tmpdate[4]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[4],l_tmpdate[4]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
tem[0]=l_tmpdate[4]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[4]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+6);
}
if(setn==7)
{
l_tmpdate[6]=change(l_tmpdate[6]);
l_tmpdate[6]++;
if(l_tmpdate[6]==100)
l_tmpdate[6]=0;
write_com(0x80+2); //年
{
tp=l_tmpdate[6]/10;
l_tmpdate[6]=l_tmpdate[6]%10;
l_tmpdate[6]=l_tmpdate[6]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[6],l_tmpdate[6]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
tem[0]=l_tmpdate[6]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[6]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+3);
}
}
}
if(s2==0)//減少時(shí)間
{
delay(5000);
if(s2==0)
{
while(!s2);
delay(5000);//去鍵盤抬起時(shí)抖動(dòng)
while(!s2);
if(setn==1)
{
l_tmpdate[0]=change(l_tmpdate[0]);
if(l_tmpdate[0]!=0)
l_tmpdate[0]--;
if(l_tmpdate[0]==0)
l_tmpdate[0]=59;
{
tp=l_tmpdate[0]/10;
l_tmpdate[0]=l_tmpdate[0]%10;
l_tmpdate[0]=l_tmpdate[0]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+7); //日
tem[0]=l_tmpdate[0]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[0]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+8);
}
if(setn==2)
{
l_tmpdate[1]=change(l_tmpdate[1]);
if(l_tmpdate[1]!=0)
l_tmpdate[1]--;
if(l_tmpdate[1]==0)
l_tmpdate[1]=59;
{
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[1],l_tmpdate[1]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+4); //月
tem[0]=l_tmpdate[1]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[1]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+5);
}
if(setn==3)
{ l_tmpdate[2]=change(l_tmpdate[2]);
if(l_tmpdate[2]!=0)
l_tmpdate[2]--;
if(l_tmpdate[2]==0)
l_tmpdate[2]=23;
{
tp=l_tmpdate[2]/10;
l_tmpdate[2]=l_tmpdate[2]%10;
l_tmpdate[2]=l_tmpdate[2]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[2],l_tmpdate[2]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+0x40+1); //年
tem[0]=l_tmpdate[2]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[2]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+0x40+2);
}
if(setn==4)
{
l_tmpdate[5]=change(l_tmpdate[5]);
if(l_tmpdate[5]!=0)
l_tmpdate[5]--;
if(l_tmpdate[5]==0)
l_tmpdate[5]=7;
{
tp=l_tmpdate[5]/10;
l_tmpdate[5]=l_tmpdate[5]%10;
l_tmpdate[5]=l_tmpdate[5]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[5],l_tmpdate[5]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+14); //星期
tem[0]=l_tmpdate[5]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[5]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+15);
}
if(setn==5)
{
l_tmpdate[3]=change(l_tmpdate[3]);
if(l_tmpdate[3]!=0)
l_tmpdate[3]--;
if(l_tmpdate[3]==0)
l_tmpdate[3]=31;
{
tp=l_tmpdate[3]/10;
l_tmpdate[3]=l_tmpdate[3]%10;
l_tmpdate[3]=l_tmpdate[3]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[3],l_tmpdate[3]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
write_com(0x80+8); //日
tem[0]=l_tmpdate[3]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[3]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+9);
}
if(setn==6)
{
l_tmpdate[4]=change(l_tmpdate[4]);
if(l_tmpdate[4]!=0)
l_tmpdate[4]--;
if(l_tmpdate[4]==0)
l_tmpdate[4]=12;
write_com(0x80+5); //月
{
tp=l_tmpdate[4]/10;
l_tmpdate[4]=l_tmpdate[4]%10;
l_tmpdate[4]=l_tmpdate[4]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[4],l_tmpdate[4]);
Write_Ds1302(0x8E,0x80);//打開寫保護(hù)
}
tem[0]=l_tmpdate[4]/16;//數(shù)據(jù)的轉(zhuǎn)換
tem[1]=l_tmpdate[4]&0x0f;
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
write_com(0x80+6);
}
if(setn==7)
{
l_tmpdate[6]=change(l_tmpdate[6]);
if(l_tmpdate[6]!=0)
l_tmpdate[6]--;
if(l_tmpdate[6]==0)
l_tmpdate[6]=99;
write_com(0x80+2); //年
{
tp=l_tmpdate[6]/10;
l_tmpdate[6]=l_tmpdate[6]%10;
l_tmpdate[6]=l_tmpdate[6]+tp*16;
Write_Ds1302(0x8E,0X00);//關(guān)閉寫保護(hù)
Write_Ds1302(write_add[6],l_tmpdate[6]);
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
作者:
神奇神
時(shí)間:
2017-9-4 11:25
有沒有原理仿真圖啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1