|
很久沒發帖了,那么來一貼,這個項目歷時3個半月,因為剛開始也就做著玩。先上圖。
155726.jpg (137.13 KB, 下載次數: 141)
下載附件
2017-4-30 16:42 上傳
- #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數據傳送位SDA
- sbit SCL=P2^5; //模擬I2C時鐘控制位SCL
- #define ADDRTW 0xD0 //器件寫地址
- #define ADDRTD 0xD1 //器件讀地址
- #define DS3231_SEC 0x00 //秒
- #define DS3231_MIN 0x01 //分
- #define DS3231_HOUR 0x02 //時
- #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 //時
- #define DS3231_AL1DAY 0x0A //星期/日
- //鬧鈴2
- #define DS3231_AL2MIN 0x0b //分
- #define DS3231_AL2HOUR 0x0c //時
- #define DS3231_AL2DAY 0x0d //星期/日
- #define DS3231_CONTROL 0x0e //控制寄存器
- #define DS3231_STATUS 0x0f //狀態寄存器
- 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--); //延時124*8+10=1002us
- j--;
- }
- }
- void delay1(unsigned char i)
- {
- for(i;i>0;i--);
- }
- uchar BCD2HEX(uchar val) //BCD轉換為Byte
- { uchar i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x0f;
- val *= 10;
- i+= val;
- return i;
- }
- uchar BCD2HEX2(uchar val) //BCD轉換為Byte
- { uchar i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x07;
- val *= 10;
- i+= val;
- return i;
- }
- uchar BCD2HEXAM(uchar val) //BCD轉換為Byte
- { uchar i;
- i= val&0x03;
- return i;
- }
- uchar HEX2BCD(uchar val)//B碼轉換為BCD碼
- {
- uchar i,j,k;
- i=val/10;
- j=val%10;
- k=j+(i<<4);
- return k;
- }
- uchar HEX2BCDAM(uchar val)//B碼轉換為BCD碼
- {
- uchar i,j,k;
- i=val/10;
- j=val%10;
- k=j+(i<<4);
- k|=0x80;
- return k;
- }
- void Start()
- {
- SDA=1; //發送起始條件的數據信號
- delay1(1);
- SCL=1;
- delay1(5); //起始條件建立時間大于4.7us,延時
- SDA=0; //發送起始信號
- delay1(5); // 起始條件鎖定時間大于4μs
- SCL=0; //鉗住I2C總線,準備發送或接收數據
- delay1(2);
- }
- void Stop()
- {
- SDA=0; //發送結束條件的數據信號
- delay1(1); //發送結束條件的時鐘信號
- SCL=1; //結束條件建立時間大于4us
- delay1(5);
- SDA=1; //發送I2C總線結束信號
- delay1(4);
- }
- /********************************************************/
- /*******************************************************************
- 字節數據發送函數
- 函數原型: void SendByte(uchar Dat);
- 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
- 此狀態位進行操作.(不應答或非應答都使ack=0)
- ack=1 發送數據正常,
- ack=0 被控器無應答或損壞。
- ********************************************************************/
- void SendByte(uchar Dat)
- {
- uchar BitCnt;
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
- {
- if((Dat<<BitCnt)&0x80)
- SDA=1; //判斷發送位
- else
- SDA=0;
- delay1(1);
- SCL=1; //置時鐘線為高,通知被控器開始接收數據位
- delay1(5); //保證時鐘高電平周期大于4μs
- SCL=0;
- }
- delay1(2);
- SDA=1; //8位發送完后釋放數據線,準備接收應答位
- delay1(2);
- SCL=1;
- delay1(3);
- if(SDA==1)
- ack=0;
- else
- ack=1; //判斷是否接收到應答信號
- SCL=0;
- delay1(2);
- }
- uchar RcvByte() //功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),發完后請用應答函數應答從機。
- {
- uchar retc;
- uchar BitCnt;
- retc=0;
- SDA=1; //置數據線為輸入方式
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- delay1(1);
- SCL=0; //置時鐘線為低,準備接收數據位
- delay1(5); //時鐘低電平周期大于4.7μs
- SCL=1; //置時鐘線為高使數據線上數據有效
- delay1(3);
- retc=retc<<1;
- if(SDA==1)
- retc=retc+1; //讀數據位,接收的數據位放入retc中
- delay1(2);
- }
- SCL=0;
- delay1(2);
- return(retc);
- }
- void I2CACK(bit a) // 功能: 主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
- {
- if(a==0)
- SDA=0; //在此發出應答或非應答信號
- else
- SDA=1;
- delay1(3);
- SCL=1;
- delay1(5); //時鐘低電平周期大于4μs
- SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收
- delay1(2);
- }
- uchar I2CRead() /************從DS3231當前地址讀一個字節************/
- {
- 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指定地址讀一個字節************/
- {
- Start();
- SendByte(ADDRTW);
- if(ack==0)
- {
- return(0);
- }
- SendByte(addr);
- if(ack==0)
- {
- return(0);
- }
- return(I2CRead());
- }
- void Readtime() /*********************讀取時間**********************/
- {
- uchar temp;
- temp=I2CReadAdd(DS3231_SEC);//秒
- sec=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_MIN);//分
- min=BCD2HEX(temp);
- temp=I2CReadAdd(DS3231_HOUR); //時
- 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) //時分秒數組賦值
- {
- b[0]=numbr[Dhour / 10]; // 時十位
- b[1]=numbr[Dhour % 10]; // 時個位
- b[4]=numbr[Dmin / 10]; // 分十位
- b[5]=numbr[Dmin % 10]; // 分個位
- b[8]=numbr[Dsec / 10]; // 秒十位
- b[9]=numbr[Dsec % 10]; // 秒個位
-
- }
- */
- /*
- void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday) //年月天數組賦值
- {
-
- a[2]=numbr[Dyear / 10]; // 年十位
- a[3]=numbr[Dyear % 10]; // 年個位
- a[6]=numbr[Dmonth / 10]; // 月十位
- a[7]=numbr[Dmonth % 10]; // 月個位
- a[10]=numbr[Dday / 10]; // 天十位
- a[11]=numbr[Dday % 10]; // 天個位
-
- }
- */
- void Start_I2C()
- {
- SDA=1; //發送起始條件的數據信號
- delay1(1);
- SCL=1;
- delay1(5); //起始條件建立時間大于4.7us,延時
- SDA=0; //發送起始信號
- delay1(5); // 起始條件鎖定時間大于4μs
- SCL=0; //鉗住I2C總線,準備發送或接收數據
- delay1(2);
- }
- void Stop_I2C()
- {
- SDA=0; //發送結束條件的數據信號
- delay1(1); //發送結束條件的時鐘信號
- SCL=1; //結束條件建立時間大于4us
- delay1(5);
- SDA=1; //發送I2C總線結束信號
- 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); //修改時
- 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); //年月白時分秒星期
- 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;
-
- }
- }
復制代碼
|
-
160108.jpg
(81.05 KB, 下載次數: 194)
下載附件
2017-4-30 16:42 上傳
-
160109.jpg
(72.08 KB, 下載次數: 199)
下載附件
2017-4-30 16:42 上傳
-
160105.jpg
(66.01 KB, 下載次數: 194)
下載附件
2017-4-30 16:42 上傳
-
160104.jpg
(81.91 KB, 下載次數: 222)
下載附件
2017-4-30 16:42 上傳
-
160102.jpg
(71.66 KB, 下載次數: 229)
下載附件
2017-4-30 16:42 上傳
-
160059.jpg
(78.61 KB, 下載次數: 189)
下載附件
2017-4-30 16:42 上傳
-
160041.jpg
(133.45 KB, 下載次數: 211)
下載附件
2017-4-30 16:42 上傳
-
160042.jpg
(89.94 KB, 下載次數: 174)
下載附件
2017-4-30 16:42 上傳
-
160055.jpg
(91.3 KB, 下載次數: 250)
下載附件
2017-4-30 16:42 上傳
-
160057.jpg
(60.59 KB, 下載次數: 202)
下載附件
2017-4-30 16:42 上傳
-
160040.jpg
(119.02 KB, 下載次數: 184)
下載附件
2017-4-30 16:42 上傳
-
160037.jpg
(138.67 KB, 下載次數: 198)
下載附件
2017-4-30 16:42 上傳
-
160035.jpg
(113.83 KB, 下載次數: 192)
下載附件
2017-4-30 16:42 上傳
-
160031.jpg
(172.5 KB, 下載次數: 188)
下載附件
2017-4-30 16:42 上傳
-
160011.jpg
(126.32 KB, 下載次數: 191)
下載附件
2017-4-30 16:42 上傳
-
160013.jpg
(110.63 KB, 下載次數: 179)
下載附件
2017-4-30 16:42 上傳
-
160016.jpg
(119.04 KB, 下載次數: 194)
下載附件
2017-4-30 16:42 上傳
-
160023.jpg
(110.81 KB, 下載次數: 201)
下載附件
2017-4-30 16:42 上傳
-
160009.jpg
(121.07 KB, 下載次數: 188)
下載附件
2017-4-30 16:42 上傳
-
160007.jpg
(113 KB, 下載次數: 225)
下載附件
2017-4-30 16:42 上傳
-
160005.jpg
(96.95 KB, 下載次數: 193)
下載附件
2017-4-30 16:42 上傳
-
160003.jpg
(107.71 KB, 下載次數: 204)
下載附件
2017-4-30 16:42 上傳
-
155802.jpg
(146.02 KB, 下載次數: 242)
下載附件
2017-4-30 16:42 上傳
-
155807.jpg
(138.67 KB, 下載次數: 202)
下載附件
2017-4-30 16:42 上傳
-
155810.jpg
(119.02 KB, 下載次數: 215)
下載附件
2017-4-30 16:42 上傳
-
160000.jpg
(110.39 KB, 下載次數: 188)
下載附件
2017-4-30 16:42 上傳
-
155758.jpg
(140.04 KB, 下載次數: 198)
下載附件
2017-4-30 16:42 上傳
-
155753.jpg
(110.82 KB, 下載次數: 232)
下載附件
2017-4-30 16:42 上傳
-
155751.jpg
(119.04 KB, 下載次數: 173)
下載附件
2017-4-30 16:42 上傳
-
155743.jpg
(110.63 KB, 下載次數: 175)
下載附件
2017-4-30 16:42 上傳
-
155728.jpg
(140.96 KB, 下載次數: 179)
下載附件
2017-4-30 16:42 上傳
-
155730.jpg
(125.69 KB, 下載次數: 175)
下載附件
2017-4-30 16:42 上傳
-
155739.jpg
(96.95 KB, 下載次數: 202)
下載附件
2017-4-30 16:42 上傳
-
155741.jpg
(126.3 KB, 下載次數: 198)
下載附件
2017-4-30 16:42 上傳
-
155721.jpg
(107.72 KB, 下載次數: 211)
下載附件
2017-4-30 16:42 上傳
-
155720.jpg
(110.39 KB, 下載次數: 196)
下載附件
2017-4-30 16:42 上傳
-
1.jpg
(119.09 KB, 下載次數: 174)
下載附件
2017-4-30 16:42 上傳
-
155719.jpg
(114.84 KB, 下載次數: 154)
下載附件
2017-4-30 16:42 上傳
-
-
電子時鐘源碼.rar
2017-4-30 16:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
68.56 KB, 下載次數: 29, 下載積分: 黑幣 -5
|