|
很久沒(méi)發(fā)帖了,那么來(lái)一貼,這個(gè)項(xiàng)目歷時(shí)3個(gè)半月,因?yàn)閯傞_(kāi)始也就做著玩。先上圖。
- #include <reg52.h>
- #include <intrins.h>
- #include<string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- P4SW=0xff;
- uchar sec, min, hour, day, month,counter,xingqi,AL1SEC,AL1MIN,AL1HOUR,AL1DAY,AL2MIN,AL2HOUR,AL2DAY,AMZT;
- uchar EDA=7;
- uint year;
- bit ack;
- uint cnt = 0;
- uchar i = 0;
- uchar j = 10;
- sbit leden1 = P0^1;
- sbit leden2 = P0^3;
- sbit leden3 = P0^7;
- sbit leden4 = P2^7;
- sbit leden5 = P0^6;
- sbit led1 = P0^0;
- sbit led2 = P0^2;
- sbit led3 = P0^4;
- sbit led4 = P4^4;
- sbit led5 = P2^6;
- sbit led6 = P2^2;
- sbit led7 = P2^0;
-
- sbit SDA=P2^4; //模擬I2C數(shù)據(jù)傳送位SDA
- sbit SCL=P2^5; //模擬I2C時(shí)鐘控制位SCL
- #define ADDRTW 0xD0 //器件寫(xiě)地址
- #define ADDRTD 0xD1 //器件讀地址
- #define DS3231_SEC 0x00 //秒
- #define DS3231_MIN 0x01 //分
- #define DS3231_HOUR 0x02 //時(shí)
- #define DS3231_DAY 0x03 //星期
- #define DS3231_DATE 0x04 //日
- #define DS3231_MONTH 0x05 //月
- #define DS3231_YEAR 0x06 //年
- //鬧鈴1
- #define DS3231_Al1SEC 0x07 //秒
- #define DS3231_AL1MIN 0x08 //分
- #define DS3231_AL1HOUR 0x09 //時(shí)
- #define DS3231_AL1DAY 0x0A //星期/日
- //鬧鈴2
- #define DS3231_AL2MIN 0x0b //分
- #define DS3231_AL2HOUR 0x0c //時(shí)
- #define DS3231_AL2DAY 0x0d //星期/日
- #define DS3231_CONTROL 0x0e //控制寄存器
- #define DS3231_STATUS 0x0f //狀態(tài)寄存器
- bit ack;
- void ledyinshe( ulong j )
- { led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;
-
- switch(j)
- {
- case 0: led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;led7=0; break;
- case 1: led1=1;led2=0;led3=1;led4=1;led5=0;led6=1;led7=1; break;
- case 2: led1=0;led2=1;led3=0;led4=0;led5=0;led6=1;led7=0; break;
- case 3: led1=0;led2=0;led3=1;led4=0;led5=0;led6=1;led7=0; break;
- case 4: led1=1;led2=0;led3=1;led4=0;led5=0;led6=0;led7=1; break;
- case 5: led1=0;led2=0;led3=1;led4=0;led5=1;led6=0;led7=0; break;
- case 6: led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;led7=0; break;
- case 7: led1=1;led2=0;led3=1;led4=1;led5=0;led6=0;led7=0; break;
- case 8: led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0; break;
- case 9: led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;led7=0; break;
- case 10:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=0; break;
- case 11:led1=1;led2=1;led3=1;led4=0;led5=1;led6=1;led7=1; break;
- case 12:led1=0;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
- case 13:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
- default:break;
- }
- }
- void Delay100us() [url=]//@11.0592MHz[/url]
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 2;
- j = 15;
- do
- {
- while (--j);
- } while (--i);
- }
- void delay1ms(uchar j)
- {
- while(j!=0)
- {uchar i;
- for(i=124;i>0;i--); //延時(shí)124*8+10=1002us
- j--;
- }
- }
- void delay1(unsigned char i)
- {
- for(i;i>0;i--);
- }
- uchar BCD2HEX(uchar val) //BCD轉(zhuǎn)換為Byte
- { uchar i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x0f;
- val *= 10;
- i+= val;
- return i;
- }
- uchar BCD2HEX2(uchar val) //BCD轉(zhuǎn)換為Byte
- { uchar i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x07;
- val *= 10;
- i+= val;
- return i;
- }
- uchar BCD2HEXAM(uchar val) //BCD轉(zhuǎn)換為Byte
- { uchar i;
- i= val&0x03;
- return i;
- }
- uchar HEX2BCD(uchar val)//B碼轉(zhuǎn)換為BCD碼
- {
- uchar i,j,k;
- i=val/10;
- j=val%10;
- k=j+(i<<4);
- return k;
- }
- uchar HEX2BCDAM(uchar val)//B碼轉(zhuǎn)換為BCD碼
- {
- uchar i,j,k;
- i=val/10;
- j=val%10;
- k=j+(i<<4);
- k|=0x80;
- return k;
- }
- void Start()
- {
- SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號(hào)
- delay1(1);
- SCL=1;
- delay1(5); //起始條件建立時(shí)間大于4.7us,延時(shí)
- SDA=0; //發(fā)送起始信號(hào)
- delay1(5); // 起始條件鎖定時(shí)間大于4μs
- SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- delay1(2);
- }
- void Stop()
- {
- SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
- delay1(1); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
- SCL=1; //結(jié)束條件建立時(shí)間大于4us
- delay1(5);
- SDA=1; //發(fā)送I2C總線結(jié)束信號(hào)
- delay1(4);
- }
- /********************************************************/
- /*******************************************************************
- 字節(jié)數(shù)據(jù)發(fā)送函數(shù)
- 函數(shù)原型: void SendByte(uchar Dat);
- 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
- 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
- ack=1 發(fā)送數(shù)據(jù)正常,
- ack=0 被控器無(wú)應(yīng)答或損壞。
- ********************************************************************/
- void SendByte(uchar Dat)
- {
- uchar BitCnt;
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長(zhǎng)度為8位
- {
- if((Dat<<BitCnt)&0x80)
- SDA=1; //判斷發(fā)送位
- else
- SDA=0;
- delay1(1);
- SCL=1; //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
- delay1(5); //保證時(shí)鐘高電平周期大于4μs
- SCL=0;
- }
- delay1(2);
- SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
- delay1(2);
- SCL=1;
- delay1(3);
- if(SDA==1)
- ack=0;
- else
- ack=1; //判斷是否接收到應(yīng)答信號(hào)
- SCL=0;
- delay1(2);
- }
- uchar RcvByte() //功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
- {
- uchar retc;
- uchar BitCnt;
- retc=0;
- SDA=1; //置數(shù)據(jù)線為輸入方式
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- delay1(1);
- SCL=0; //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
- delay1(5); //時(shí)鐘低電平周期大于4.7μs
- SCL=1; //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
- delay1(3);
- retc=retc<<1;
- if(SDA==1)
- retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
- delay1(2);
- }
- SCL=0;
- delay1(2);
- return(retc);
- }
- void I2CACK(bit a) // 功能: 主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
- {
- if(a==0)
- SDA=0; //在此發(fā)出應(yīng)答或非應(yīng)答信號(hào)
- else
- SDA=1;
- delay1(3);
- SCL=1;
- delay1(5); //時(shí)鐘低電平周期大于4μs
- SCL=0; //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
- delay1(2);
- }
- uchar I2CRead() /************從DS3231當(dāng)前地址讀一個(gè)字節(jié)************/
- {
- uchar read_data;
- Start();
- SendByte(ADDRTD);
- if(ack==0)
- {
- return(0);
- }
- read_data = RcvByte();
- I2CACK(1);
- Stop();
- return read_data;
- }
- uchar I2CReadAdd(uchar addr) /************從DS3231指定地址讀一個(gè)字節(jié)************/
- {
- Start();
- SendByte(ADDRTW);
- if(ack==0)
- {
- return(0);
- }
- SendByte(addr);
- if(ack==0)
- {
- return(0);
- }
- return(I2CRead());
- }
- void Readtime() /*********************讀取時(shí)間**********************/
- {
- uchar temp;
- temp=I2CReadAdd(DS3231_SEC);//秒
- sec=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_MIN);//分
- min=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_HOUR); //時(shí)
- hour=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_DATE); //日
- day=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_MONTH); //月
- month=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_YEAR); //年
- year=BCD2HEX(temp);
- year+=2000;
- temp=I2CReadAdd(DS3231_DAY); //星期
- xingqi = BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_AL1MIN ); //星期
- AL1MIN = BCD2HEX2(temp);
- temp=I2CReadAdd(DS3231_AL1HOUR); //星期
- AL1HOUR= BCD2HEX2(temp);
- temp=I2CReadAdd(DS3231_AL2MIN ); //星期
- AL2MIN = BCD2HEX2(temp);
- temp=I2CReadAdd(DS3231_AL2HOUR); //星期
- AL2HOUR= BCD2HEX2(temp);
- temp=I2CReadAdd(DS3231_STATUS ); //星期
- AMZT= BCD2HEXAM(temp);
-
- }
- void InitDS3231() //ds3231初始化
- {SCL=1;
- delay1(5);
- SDA=1;
- delay1(5);
- }
- /*
- void TimeDisplay(uchar Dhour,ucharDmin,uchar Dsec) //時(shí)分秒數(shù)組賦值
- {
- b[0]=numbr[Dhour / 10]; // 時(shí)十位
- b[1]=numbr[Dhour % 10]; // 時(shí)個(gè)位
- b[4]=numbr[Dmin / 10]; // 分十位
- b[5]=numbr[Dmin % 10]; // 分個(gè)位
- b[8]=numbr[Dsec / 10]; // 秒十位
- b[9]=numbr[Dsec % 10]; // 秒個(gè)位
-
- }
- */
- /*
- void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday) //年月天數(shù)組賦值
- {
-
- a[2]=numbr[Dyear / 10]; // 年十位
- a[3]=numbr[Dyear % 10]; // 年個(gè)位
- a[6]=numbr[Dmonth / 10]; // 月十位
- a[7]=numbr[Dmonth % 10]; // 月個(gè)位
- a[10]=numbr[Dday / 10]; // 天十位
- a[11]=numbr[Dday % 10]; // 天個(gè)位
-
- }
- */
- void Start_I2C()
- {
- SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號(hào)
- delay1(1);
- SCL=1;
- delay1(5); //起始條件建立時(shí)間大于4.7us,延時(shí)
- SDA=0; //發(fā)送起始信號(hào)
- delay1(5); // 起始條件鎖定時(shí)間大于4μs
- SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- delay1(2);
- }
- void Stop_I2C()
- {
- SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
- delay1(1); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
- SCL=1; //結(jié)束條件建立時(shí)間大于4us
- delay1(5);
- SDA=1; //發(fā)送I2C總線結(jié)束信號(hào)
- delay1(4);
- }
- uchar write_byte(uchar addr, uchar write_data)
- {
- Start_I2C();
- SendByte(ADDRTW); //////*******************************************************************///////////
- if (ack == 0)
- return 0;
- SendByte(addr);
- if (ack == 0)
- return 0;
- SendByte(write_data);
- if (ack == 0)
- return 0;
- Stop_I2C();
- delay1ms(10);
- return 1;
- }
- void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar xq,uchar AL1DAY,uchar A1HOUR,uchar A1MIN,uchar AL1SEC,uchar AL2DAY,uchar A2HOUR,uchar AL2MIN)
- { uchar temp=0;
- temp=HEX2BCD(yea);
- write_byte(DS3231_YEAR,temp); //修改年
- temp=HEX2BCD(mon);
- write_byte(DS3231_MONTH,temp); //修改月
- temp=HEX2BCD(da); /////////////////////
- write_byte(DS3231_DATE,temp); //修改日
- temp=HEX2BCD(hou);
- write_byte(DS3231_HOUR,temp); //修改時(shí)
- temp=HEX2BCD(min);
- write_byte(DS3231_MIN,temp); //修改分
- temp=HEX2BCD(sec);
- write_byte(DS3231_SEC,temp); //修改秒
-
- temp=HEX2BCD(xq);
- write_byte(DS3231_DAY,temp); //修改星期
-
- temp=HEX2BCD(AL1SEC);
- write_byte(DS3231_Al1SEC,temp); //修改星期
- temp=HEX2BCD(A1MIN);
- write_byte(DS3231_AL1MIN,temp); //修改星期
- temp=HEX2BCD(A1HOUR);
- write_byte(DS3231_AL1HOUR,temp); //修改星期
- temp=HEX2BCDAM(AL1DAY);
- write_byte(DS3231_AL1DAY ,temp); //修改星期
-
- temp=HEX2BCD(AL2MIN);
- write_byte(DS3231_AL2MIN,temp); //修改星期
- temp=HEX2BCD(A2HOUR);
- write_byte(DS3231_AL2HOUR,temp); //修改星期
- temp=HEX2BCDAM(AL2DAY);
- write_byte(DS3231_AL2DAY,temp); //修改星期
-
-
- }
- unsigned char str[17] ;
- void main()
- {
- TMOD = 0x01;
- TH0 = 0xFC;
- TL0 = 0x67;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- InitDS3231();
-
- ModifyTime(17,2,25,14,43,0,6,7,13,19,30,7,13,19); //年月白時(shí)分秒星期
- delay1ms(100);
- Readtime();
-
- EDA=HEX2BCD(7);
- write_byte(DS3231_CONTROL ,EDA);
- EDA=HEX2BCD(8);
- write_byte(DS3231_STATUS ,EDA);
-
- delay1ms(100);
- while(1)
- {
-
- Readtime();
- if(cnt >= 1000)
- {
- cnt = 0;
- if(j<=11)j++;else j=10;
-
-
- }
-
-
-
- }
- }
- void jianduan1()
- {
- if(leden1==1)
- {
- leden1=0;
- Delay100us();Delay100us();Delay100us();Delay100us();
- Delay100us(); Delay100us();Delay100us();Delay100us();
- Delay100us(); Delay100us();Delay100us();Delay100us();
- }
- else
- {
- leden1=1;
- }
- }
- void jianduan2()
- {
- if(leden2==1)
- {
- leden2=0;
- Delay100us(); Delay100us();Delay100us();Delay100us();
- Delay100us(); Delay100us();Delay100us();Delay100us();
- Delay100us(); Delay100us();Delay100us();Delay100us();
- }
- else
- {
- leden2=1;
- }
- }
- void InterruptTimer0() interrupt 1
- {
- TH0 = 0xFC;
- TL0 = 0x67;
- cnt++;
-
- led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;
- switch(i)
- {
- case 0:jianduan1(); leden2=0; leden3=0;leden4=0;leden5=0;i++; ledyinshe(min%10 );break;
- case 1: leden1=0;jianduan2(); leden3=0;leden4=0;leden5=0;i++; ledyinshe(min/10%10 );break;
- case 2: leden1=0; leden2=0; leden3=1;leden4=0;leden5=0;i++; ledyinshe(j);break;
- case 3: leden1=0; leden2=0; leden3=0;leden4=1;leden5=0;i++; ledyinshe(hour%10);break;
- case 4: leden1=0; leden2=0; leden3=0;leden4=0;leden5=1;i=0; ledyinshe(hour/10%10);break;
-
- default:;break;
-
- }
- }
復(fù)制代碼
|
|