基于單片機(jī)的數(shù)碼管萬年歷_第1頁
基于單片機(jī)的數(shù)碼管萬年歷_第2頁
基于單片機(jī)的數(shù)碼管萬年歷_第3頁
基于單片機(jī)的數(shù)碼管萬年歷_第4頁
基于單片機(jī)的數(shù)碼管萬年歷_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.c文件 #include<reg52.h>#include<intrins.h>#include<1302.h>#include<18B20.h>#include<nl_week.h>uchar code digit=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x8f,0x00; uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n; uchar count=0; uchar nz; sbit S

2、ET=P37; sbit ADD=P36;/增加 sbit RED=P35;/減小 sbit CANL=P34;sbit le=P26;sbit oe=P27;sbit en=P14; sbit beep=P24; void delay1ms( int x)unsigned char i,j;for(i=x;i>0;i-)for(j=124;j>0;j-);void display_Year(unsigned char year) /顯示年 unsigned char i,j;i=year/10;j=year%10;P0=digit2;P1=0;delay1ms(2);P0=dig

3、it0;P1=1;delay1ms(2);P0=digiti;P1=2;delay1ms(2);P0=digitj;P1=3;delay1ms(1);void display_Month(unsigned char month)/顯示月 unsigned char i,j;i=month/10;j=month%10;P0=digiti;P1=4;delay1ms(3);P0=digitj;P1=5;delay1ms(1);void display_Day(unsigned char day)/顯示日 unsigned char i,j;i=day/10;j=day%10;P0=digiti;P

4、1=6;delay1ms(3); P0=digitj;P1=7;delay1ms(1);void display_Hour(unsigned char hour) /顯示時(shí) unsigned char i,j; i=hour/10;j=hour%10;P0=digiti;P1=8;delay1ms(2);P0=digitj+n*0x80;P1=9;delay1ms(1);void display_Minute(unsigned char minute) /顯示分 unsigned char i,j;i=minute/10;j=minute%10;P0=digiti;P1=10;delay1ms

5、(3);P0=digitj;P1=11;delay1ms(1); void display_Week(void) unsigned char i=0; WEEK=GetWeekFromDay(years,months,days); P1=12;switch(WEEK)case 1:P0=digit1;/ P1=12; delay1ms(2); break; case 2:P0=digit2;/ P1=12; delay1ms(2); break;case 3:P0=digit3;/ P1=12; delay1ms(2); break;case 4:P0=digit4;/ P1=12; dela

6、y1ms(2); break;case 5:P0=digit5;/ P1=12; delay1ms(2); break;case 6:P0=digit6;/ P1=12; delay1ms(2); break;case 7:P0=digit8;/ P1=12; delay1ms(2); break; void display_Time(void) /顯示實(shí)時(shí)時(shí)間 unsigned char value;value=ReadSet1302(0x83);minutes=(value&0x70)>>4)*10+(value&0x0f);display_Minute(min

7、utes);value=ReadSet1302(0x85);hours=(value&0x70)>>4)*10+(value&0x0f);display_Hour(hours);value=ReadSet1302(0x87);days=(value&0x70)>>4)*10+(value&0x0f);display_Day(days);value=ReadSet1302(0x89);months=(value&0x70)>>4)*10+(value&0x0f);display_Month(months);val

8、ue=ReadSet1302(0x8D);years=(value&0xf0)>>4)*10+(value&0x0f);display_Year(years);display_Week();/*時(shí)間調(diào)整部分*/ void hourset(void)/調(diào)時(shí) unsigned char timevalue,hour;delay1ms(500);/防止多次觸發(fā) WriteSet1302(0x8e,0x00);/將寫保護(hù)去掉,確保能正常將調(diào)整后的數(shù)值寫入DS1302 timevalue=ReadSet1302(0x85); /讀取此時(shí)的數(shù)值 hour=(timevalue&

9、amp;0x70)>>4)*10+(timevalue&0x0f);while(1)if(ADD=0)delay1ms(20);if(ADD=0)hour+;delay1ms(100);while(ADD=0);if(RED=0)delay1ms(20);if(RED=0)hour-;delay1ms(100);if(hour=0) hour=23;while(RED=0);if(hour>=24) hour=0;timevalue=(hour)/10)<<4|(hour%10);WriteSet1302(0x84,timevalue);delay1ms(

10、2);display_Hour(hour);delay1ms(10);if(CANL=0) mode=0;break;if(SET=0) break;WriteSet1302(0x8e,0x80);void minuteset(void) /調(diào)分 unsigned char timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(timevalue&0x70)>>4)*10+(timevalue&0x0f);while(1)if(ADD=0)

11、delay1ms(20);if(ADD=0)minute+;if(minute>=60) timevalue=0;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)minute-;if(minute=0) minute=59;delay1ms(300);while(RED=0);if(minute>=60) minute=0;timevalue=(minute/10)<<4|(minute%10);WriteSet1302(0x82,timevalue);delay1ms(2);display_Minute(minute);dela

12、y1ms(10);if(CANL=0) mode=0;break;if(SET=0) break;WriteSet1302(0x8e,0x80);void yearset(void)/調(diào)年 unsigned char datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(datevalue&0x70)>>4)*10+(datevalue&0x0f);while(1)if(ADD=0)delay1ms(20);if(ADD=0)year+;while

13、(ADD=0);if(RED=0)delay1ms(20);if(RED=0)year-;delay1ms(100);while(RED=0);datevalue=(year/10)<<4|(year%10);WriteSet1302(0x8c,datevalue);delay1ms(5);display_Year(year);delay1ms(5);if(CANL=0) mode=0;break;if(SET=0) break;WriteSet1302(0x8e,0x80);void monthset(void) /調(diào)月 unsigned char datevalue,month

14、;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(datevalue&0x70)>>4)*10+(datevalue&0x0f);while(1)if(ADD=0)delay1ms(20);if(ADD=0)month+;if(month>12) month=1;while(ADD=0);if(RED=0)delay1ms(20);if(RED=0)month-;delay1ms(100);if(month=0) month=12;while(RED=0);dat

15、evalue=(month/10)<<4|(month%10);WriteSet1302(0x88,datevalue);delay1ms(5);display_Month(month);delay1ms(5);if(CANL=0) mode=0;break;if(SET=0) break;WriteSet1302(0x8e,0x80);void dayset(void) /調(diào)日 unsigned char datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(dat

16、evalue&0x70)>>4)*10+(datevalue&0x0f);while(1)if(ADD=0)delay1ms(10);if(ADD=0)day+;if(day>31) day=1;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)if(day=0) day=31;day-;delay1ms(300);while(RED=0);datevalue=(day/10)<<4|(day%10);WriteSet1302(0x86,datevalue);delay1ms(5);display_Day(da

17、y);delay1ms(5);if(CANL=0) mode=0;break;if(SET=0) break;WriteSet1302(0x8e,0x80);void TimeSet(void) /時(shí)間調(diào)整函數(shù) display_Time();if(SET=0)delay1ms(20);if(SET=0) while (!SET);mode+;delay1ms(20);switch(mode)case(1):hourset();delay1ms(20); break;case(2):minuteset();delay1ms(20); break;case(3):yearset();delay1m

18、s(20); break;case(4):monthset();delay1ms(20); break;case(5):dayset();delay1ms(20 ); break;if(mode=6) mode=0;/*顯示溫度模塊*/unsigned char flag;/*顯示溫度整數(shù)部分*/ void Display_Integer(unsigned char x) unsigned char s,g;s=x%100/10;g=x%10;P0=digits;P1=13;delay1ms(3);P0=digitg;P1=14;delay1ms(3) ;P0=digit10;P1=15;de

19、lay1ms(1); void display_Temperature(void) ReadyreadDS18B20();TL=ReadDS18B20();TH=ReadDS18B20();if(TH&0XF8)!=0X00)flag=1;TL=TL;TH=TH;TL+=1;if(TL>255) TH+=1;TN=TH*16+TL/16;/TD=(TL%16)*10/16;TN=TH*16+TL/16;/TD=(TL%16)*10/16;Display_Integer(TN); /* 設(shè)置模塊 */ void Set(void) if(SET=0)delay1ms(5);if(S

20、ET=0) delay1ms(50); while (!SET);while(1) TimeSet();if(CANL=0)break; void InitTimer0(void) TMOD = 0x01; TH0 = 0x3C; TL0 = 0x0B0; EA = 1; ET0 = 1; TR0 = 1;/*主函數(shù)*/ void main()int i;P0=0;/beep=0;InitTimer0();InitTimer0();IntDS1302(); /初始化DS1302delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1) fo

21、r (i=1000;i>0;i-) Set( );display_Time( );Display_Integer(TN); if(hours=7|hours=8|hours=9|hours=10|hours=11|hours=12 |hours=14|hours=15|hours=16|hours=17|hours=18|hours=19 |hours=20|hours=21|hours=22|hours=23)if(minutes=0x00)uchar value;value=ReadSet1302(0x81); seconds=(value&0x70)>>4)*1

22、0+(value&0x0f);if(seconds>0&&seconds<2)beep=0;else beep=1; display_Temperature(); void t0() interrupt 1TH0 = 0x3C; TL0 = 0x0B0;count+;if(count=10)n=0; if(count=20)count=0;n=1; .h文件/*DS1302模塊*/#define uchar unsigned char#define uint unsigned intsbit SCLK=P20;/DS1302時(shí)鐘輸入 sbit DATE=P2

23、1;/DS1302數(shù)據(jù)輸入 sbit REST=P22;/DS1302復(fù)位端口 void delaynus(unsigned char n) /延時(shí)若干微秒 unsigned char i; for(i=0;i<n;i+);void Write1302(unsigned char date)/向1302寫數(shù)據(jù) unsigned char i;SCLK=0;delaynus(2);for(i=0;i<8;i+)DATE=date&0x01;SCLK=1;delaynus(2);SCLK=0;delaynus(2);date>>=1; void WriteSet13

24、02(unsigned char cmd,unsigned char date) /根據(jù)相應(yīng)的命令輸入相應(yīng)的數(shù)據(jù) REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);Write1302(date);SCLK=1;REST=0; unsigned char Read1302(void)/讀取1302數(shù)據(jù) unsigned char i,date;delaynus(2);for(i=0;i<8;i+)date>>=1;if(DATE=1) /date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2)

25、;return date; unsigned char ReadSet1302(unsigned char cmd)/根據(jù)命令讀取1302相應(yīng)的值unsigned char date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;void IntDS1302(void) /DS1302初始化 unsigned char flag; flag= ReadSet1302(0x81);if(flag&0x80) /判斷時(shí)鐘芯片是否關(guān)閉 WriteSet1302

26、(0x8E,0x00); /根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令 WriteSet1302(0x80,(0/10)<<4|(0%10); /根據(jù)寫秒寄存器命令字,寫入秒的初始值WriteSet1302(0x82,(0/10)<<4|(0%10); /根據(jù)寫分寄存器命令字,寫入分的初始值WriteSet1302(0x84,(0/10)<<4|(0%10); /根據(jù)寫小時(shí)寄存器命令字,寫入小時(shí)的初始值WriteSet1302(0x86,(0/10)<<4|(0%10); /根據(jù)寫日寄存器命令字,寫入日的初始值WriteSet1302(0x88,(0

27、/10)<<4|(0%10); /根據(jù)寫月寄存器命令字,寫入月的初始值WriteSet1302(0x8c,(10/10)<<4|(10%10); /根據(jù)寫年寄存器命令字,寫入年的初始值/WriteSet1302(0x90,0xa5); /打開充電功能 選擇2K電阻充電方式WriteSet1302(0x8E,0x80); /根據(jù)寫狀態(tài)寄存器命令字,寫入保護(hù)指令 /*操作DS18B20模塊*/sbit DQ=P23; unsigned char time;void delayms(unsigned char x)unsigned char i,j;for(i=x;i>0;i-)for(j=124;j>0;j-);/*DS18B20初始化*/bit IntDS18B20(void)bit temp;DQ=1;for(time=0;time<2;time+);DQ=0;for(time=0;time<200;time+);DQ=1;for(time=0;time<10;time+);temp=DQ;for(time=0;time<200;time+);return temp;/*讀DS18B20*/ unsigned char ReadDS18B20(void) unsigned char i;unsigned char

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論