|
所有資料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為使能信號
- 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;//存儲要更改的時(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]);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
|
|