![]() |
發(fā)布時間: 2017-5-5 09:07
正文摘要:在用DS1302和數(shù)碼管制作電子時鐘鬧鈴初始設置的過程中,發(fā)現(xiàn)秒設置顯示的時間始終不能達到要求,比如我要設置鬧鈴時間11:11:11鬧鐘開始鬧鈴,可以數(shù)碼管不顯示11:11:11,而是顯示11:11:06,雖然實際中誰也不會 ... |
后面代碼字體格式不一樣,重發(fā)一下 #include <reg52.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; sbit LSA=P2^2;//38譯碼器的接入 sbit LSB=P2^3;//38譯碼器的接入 sbit LSC=P2^4;//38譯碼器的接入 sbit DS1302_CE = P3^5;//DS1302接入 sbit DS1302_CK = P3^6;//DS1302接入 sbit DS1302_IO = P3^4;//DS1302接入 sbit key1= P3^1; //四個獨立按鍵 sbit key2= P3^0; //四個獨立按鍵 sbit key3= P3^2; //四個獨立按鍵 sbit key4= P3^3; //四個獨立按鍵 sbit beep=P1^5; //蜂鳴器接入 uchar xdata smgduan[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //共陰數(shù)碼管0-9 bit key1flag; //四個按鍵標志位 bit key2flag; //四個按鍵標志位 bit key3flag; //四個按鍵標志位 bit key4flag; //四個按鍵標志位 bit time5min; //四個按鍵標志位 uchar Display[7]; //數(shù)碼管顯示的時鐘數(shù)據(jù)緩存 uchar xdata FirstTime[7]= { 0x00,0x26,0x08,0x05,0x05,0x05,0x17 };//時鐘初始時間設置 uchar Timesaving[7]; //從DS1302讀得的時鐘數(shù)據(jù)緩存 uchar naozhong[3]={0x11,0x11,0x11}; //鬧鐘初始時間設定 uchar shiftflag=0; //獨立按鍵功能標志位 bit flag200ms=0; //數(shù)碼管刷新標志位 uchar T0RH = 0; //定時器高位重載值 uchar T0RL = 0; //定時器低位重載值 void ConfigTimer0(uint ms); void keyscan(); void DS1302SingleWrite(uchar add, uchar dat); void Set_RTC(); void Read_RTC(); void Numpros(); void keyfun(); void DigDisplay(); void NaoLing(); void main() { ConfigTimer0(1); Set_RTC(); Read_RTC(); while (1) { keyfun(); if (flag200ms) { flag200ms = 0; Numpros(); DigDisplay(); } NaoLing(); } } void delay(uchar i) { while(i--); } void Numpros() { Read_RTC(); if(shiftflag==0) { Display[7] =smgduan[Timesaving[2]/16]; Display[6] =smgduan[Timesaving[2]&0x0f]; Display[5] = 0x40; Display[4] =smgduan[Timesaving[1]/16]; Display[3] =smgduan[Timesaving[1]&0x0f]; Display[2] = 0x40; Display[1] =smgduan[Timesaving[0]/16]; Display[0] =smgduan[Timesaving[0]&0x0f]; } if(shiftflag==1) { Display[7] =smgduan[Timesaving[6]/16]; Display[6] =smgduan[Timesaving[6]&0x0f]; Display[5] = 0x40; Display[4] =smgduan[Timesaving[4]/16]; Display[3] =smgduan[Timesaving[4]&0x0f]; Display[2] = 0x40; Display[1] =smgduan[Timesaving[3]/16]; Display[0] =smgduan[Timesaving[3]&0x0f]; } if(shiftflag==2) { Display[7] =smgduan[naozhong[2]/16]; Display[6] =smgduan[naozhong[2]&0x0f]; Display[5] = 0x40; Display[4] =smgduan[naozhong[1]/16]; Display[3] =smgduan[naozhong[1]&0x0f]; Display[2] = 0x40; Display[1] =smgduan[naozhong[0]/16]; Display[0] =smgduan[naozhong[0]&0x0f]; } } void DigDisplay() { uchar 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; case 2:LSA=0;LSB=1;LSC=0;break; case 3:LSA=1;LSB=1;LSC=0;break; case 4:LSA=0;LSB=0;LSC=1;break; case 5:LSA=1;LSB=0;LSC=1;break; case 6:LSA=0;LSB=1;LSC=1;break; case 7:LSA=1;LSB=1;LSC=1;break; } P0=Display[i]; delay(100); P0=0x00; } } void keyscan() { if(key1==0) { delay(200); if(key1==0) { key1flag=1; while(!key1); } } if(key2==0) { delay(200); if(key2==0) { key2flag=1; while(!key2); } } if(key3==0) { delay(200); if(key3==0) { key3flag=1; while(!key3); } } if(key4==0) { delay(200); if(key4==0) { shiftflag++; if(shiftflag>3) { shiftflag=0; } while(!key4); } } } void keyfun() { if(shiftflag==0) { if(key1flag==1) { if ((Timesaving[2]&0x0F) < 0x09) Timesaving[2] += 0x01; else { Timesaving[2] &= 0xF0; Timesaving[2] += 0x10; } if (((Timesaving[2]&0xF0) >= 0x20)&&((Timesaving[2]&0x0F) > 0x03)) { Timesaving[2] = 0x00; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x84,Timesaving[2]); DS1302SingleWrite(0x8E, 0x80); key1flag=0; } else if(key2flag==1) { if ((Timesaving[1]&0x0F) < 0x09) Timesaving[1] += 0x01; else { Timesaving[1] &= 0xF0; Timesaving[1] += 0x10; } if (((Timesaving[1]&0xF0) >0x50)&&((Timesaving[1]&0x0F) >= 0x00)) { Timesaving[1] = 0x00; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x82,Timesaving[1]); DS1302SingleWrite(0x8E, 0x80); key2flag=0; } else if(key3flag==1) { if ((Timesaving[0]&0x0F) < 0x09) Timesaving[0] += 0x01; else { Timesaving[0] &= 0xF0; Timesaving[0] += 0x10; } if (((Timesaving[0]&0xF0) > 0x50)&&((Timesaving[0]&0x0F) >= 0x00)) { Timesaving[0] = 0x00; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x82,Timesaving[0]); DS1302SingleWrite(0x8E, 0x80); key3flag=0; } } if(shiftflag==1) { if(key1flag==1) { if ((Timesaving[6]&0x0F) < 0x09) Timesaving[6] += 0x01; else { Timesaving[6] &= 0xF0; Timesaving[6] += 0x10; } if (((Timesaving[6]&0xF0) > 0x90)&&((Timesaving[6]&0x0F) >= 0x00)) { Timesaving[6] = 0x00; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x8c,Timesaving[6]); DS1302SingleWrite(0x8E, 0x80); key1flag=0; } else if(key2flag==1) { if ((Timesaving[4]&0x0F) < 0x09) Timesaving[4] += 0x01; else { Timesaving[4] &= 0xF0; Timesaving[4] += 0x10; } if (((Timesaving[4]&0xF0) >=0x10)&&((Timesaving[4]&0x0F) > 0x02)) { Timesaving[4] = 0x01; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x88,Timesaving[4]); DS1302SingleWrite(0x8E, 0x80); key2flag=0; } else if(key3flag==1) { if ((Timesaving[3]&0x0F) < 0x09) Timesaving[3] += 0x01; else { Timesaving[3] &= 0xF0; Timesaving[3] += 0x10; } if (((Timesaving[3]&0xF0) >= 0x30)&&((Timesaving[3]&0x0F) >0x01)) { Timesaving[3] = 0x01; } DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x86,Timesaving[3]); DS1302SingleWrite(0x8E, 0x80); key3flag=0; } } if(shiftflag==2) { if(key1flag==1) { if ((naozhong[2]&0x0F) < 0x09) naozhong[2] += 0x01; else { naozhong[2] &= 0xF0; naozhong[2] += 0x10; } if (((naozhong[2]&0xF0) >= 0x20)&&((naozhong[2]&0x0F) > 0x03)) { naozhong[2] = 0x00; } key1flag=0; } else if(key2flag==1) { if ((naozhong[1]&0x0F) < 0x09) naozhong[1] += 0x01; else { naozhong[1] &= 0xF0; naozhong[1] += 0x10; } if (((naozhong[1]&0xF0) > 0x50)&&((naozhong[1]&0x0F) >=0x00)) { naozhong[1] = 0x00; } key2flag=0; } if(time5min==1) { time5min=0; shiftflag=0; } } } void NaoLing() { Read_RTC(); if((naozhong[2]==Timesaving[2])&&(naozhong[1]==Timesaving[1])) { while(1) { beep=~beep; delay(20); if(shiftflag==3) break; } } } void DS1302ByteWrite(unsigned char dat) { uchar i; for(i=0;i<8;i++) { DS1302_CK = 0; DS1302_IO=dat&0x01; DS1302_CK=1; dat>>=1; } } unsigned char DS1302ByteRead() { uchar i; uchar dat=0; for(i=0;i<8;i++) { DS1302_CK=0; dat>>=1; if(DS1302_IO) { dat|=0x80; } DS1302_CK=1; } return dat; } void DS1302SingleWrite(unsigned char add, unsigned char dat) { DS1302_CE = 0; DS1302_CK = 0; DS1302_IO=0; DS1302_CE = 1; DS1302ByteWrite(add); DS1302ByteWrite(dat); DS1302_CE = 0; } unsigned char DS1302SingleRead(unsigned char add) { uchar dat=0x00; DS1302_CE = 0; DS1302_CK = 0; DS1302_IO=0; DS1302_CE = 1; DS1302ByteWrite(add); dat = DS1302ByteRead(); DS1302_CK = 1; DS1302_CE = 0; return dat; } void Read_RTC() { Timesaving[0]=DS1302SingleRead(0x81); Timesaving[1]=DS1302SingleRead(0x83); Timesaving[2]=DS1302SingleRead(0x85); Timesaving[3]=DS1302SingleRead(0x87); Timesaving[4]=DS1302SingleRead(0x89); Timesaving[5]=DS1302SingleRead(0x8b); Timesaving[6]=DS1302SingleRead(0x8d); } void Set_RTC() { DS1302SingleWrite(0x8E, 0x00); DS1302SingleWrite(0x80,FirstTime[0]); DS1302SingleWrite(0x82,FirstTime[1]); DS1302SingleWrite(0x84,FirstTime[2]); DS1302SingleWrite(0x86,FirstTime[3]); DS1302SingleWrite(0x88,FirstTime[4]); DS1302SingleWrite(0x8a,FirstTime[5]); DS1302SingleWrite(0x8c,FirstTime[6]); DS1302SingleWrite(0x8E, 0x80); } void ConfigTimer0(unsigned int ms) { unsigned long tmp; tmp = 12000000 / 12; tmp = (tmp * ms) / 1000; tmp = 65536 - tmp; tmp = tmp + 25; T0RH = (unsigned char)(tmp>>8); T0RL = (unsigned char)tmp; TMOD &= 0xF0; TMOD |= 0x01; TH0 = T0RH; TL0 = T0RL; EA = 1; ET0 = 1; TR0 = 1; } void InterruptTimer0() interrupt 1 { static unsigned char count1 = 0; static unsigned long count2 = 0; TH0 = T0RH; TL0 = T0RL; keyscan(); count1++; count2++; if (count1 >= 20) { count1 = 0; flag200ms = 1; } if(count2>=300000) { count2 = 0; time5min=1; } } |
Powered by 單片機教程網(wǎng)