


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、* 描述 : 該程序實現了用單片機來控制時鐘芯片 DS1302 進行萬年歷的顯示。 這個代碼相對來說很復雜,注釋比較多,大家可以仔細分析。 程序運行,首先設置時間。按 S21 ,進行某一位的設置,會看到某一位上面會閃爍。按 S20 ,數值減 1.按 S22 ,數值加 1. 設置完后,時間會進行運行。 另外 ,1602 上也會有時間顯示的。 開發板上有一個 J28 跳線,用跳線帽短接,時間掉電后不會丟失。 因為費電,所以建議 J28 不要一直短接。* 創建人 : 東流, 2018 年 2 月 7 日* 版本號 : 1.0*杜邦線接法:P3.5接J18的1端;J3.6接J18的2端;J3.7接J1
2、8的3端。1602 接到 J17 的排座上。P2.3連接到J31的4端。P1.0 接 J8 的 2 端。P1.1 接 J8 的 3 端。P1.2 接 J8 的 4 端。 */ #include<reg51.h>#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp 。/flag 用于讀取頭文件中的溫度值,和顯示溫度值#define yh 0x80 /LCD 第一行 的
3、初 始位置 ,因為 LCD1602 字符 地址首 位 D7 恒定 為 1<100000000=80 )#define er 0x80+0x40 /LCD 第二行初始位置 <因為第二行第一個字符位置地址是0x40)液晶屏的與C51之間的引腳連接定義 <顯示數據線接 C51的P0 口)sbit rs=P2A4。sbit rw=P2A5。 /如果硬件上rw接地,就不用寫這句和后面的rw=0 了sbit en=P2A6。/DS1302時鐘芯片與 C51之間的引腳連接定義sbit SCLK=P3A5 。sbit IO=P3A6 。sbit RST=P3A7。sbit ACC0=ACCA
4、0 。sbit ACC7=ACCA7 。/*ACC 累加器 =AACC.0=E0HACC.0 就是 ACC 的第 0位。 Acc 可以位尋址。累加器 ACC 是一個 8 位的存儲單元,是用來放數據的。但是,這個存儲單元有其特殊的地位, 是單片機中一個非常關鍵的單元,很多運算都要通過ACC 來進行。以后在學習指令時,常用 A 來表示累加器。但有一些地方例外,比如在PUSH 指令中,就必須用 ACC 這樣的名字。一般的說法, A 代表了累加器中的內容、而 ACC 代表的是累加器的地址。 */校時按鍵與 C51 的引腳連接定義sbit key仁P1X。/設置鍵sbit key2=P1A2。/加鍵sb
5、it key3=P1A0。/減鍵 /*/ uchar code tab1="20 - - " 。 /年顯示的固定字符 uchar code tab2=" : : " 。 /時間顯示的固定字符/延時函數,后面經常調用void delay(uint xms>/ 延時函數,有參函數uint x,y 。for(x=xms 。 x>0 。 x-> for(y=110 。 y>0。 y-> 。/* 液晶寫入指令函數與寫入數據函數,以后可調用 */*在這個程序中,液晶寫入有關函數會在 DS1302的函數中調用,所以液晶程序要放在前面*/v
6、oid write_1602com(uchar com>/* 液晶寫入指令函數 *rs=0。 /數據 /指令選擇置為指令rw=0 。 /讀寫選擇置為寫P0=com。 /送入數據 delay(1> 。en=1。 /拉高使能端,為制造有效的下降沿做準備 delay(1> 。en=0。 /en 由高變低,產生下降沿,液晶執行命令void write_1602dat(uchar dat>/* 液晶寫入數據函數 *rs=1。 /數據 /指令選擇置為數據rw=0 。 /讀寫選擇置為寫P0=dat。 /送入數據delay(1> 。en=1 。 /en 置高電平,為制造下降沿做準
7、備 delay(1> 。en=0。 /en 由高變低,產生下降沿,液晶執行命令void lcd_init(>/* 液晶初始化函數 *write_1602com(0x38> 。 /設置液晶工作模式,意思: 16*2 行顯示, 5*7 點陣, 8 位 數據write_1602com(0x0c> 。 /開顯示不顯示光標 write_1602com(0x06> 。 /整屏不移動,光標自動右移 write_1602com(0x01> 。 /清顯示write_1602com(yh+1> 。 /日歷顯示固定符號從第一行第 1 個位置之后開始顯示 for(a=0 。
8、a<14。 a+>write_1602dat(tab1a> 。 /向液晶屏寫日歷顯示的固定符號部分 /delay(3> 。write_1602com(er+2> 。 /時間顯示固定符號寫入位置,從第2 個位置后開始顯示for(a=0 。 a<8。 a+>write_1602dat(tab2a> 。 /寫顯示時間固定符號,兩個冒號 /delay(3> 。*over*/*DS1302有關子函數 */ void write_byte(uchar dat>/ 寫一個字節ACC=dat 。RST=1。for(a=8 。 a>0。 a-&g
9、t;IO=ACC0 。SCLK=0 。SCLK=1 。ACC=ACC>>1 。uchar read_byte(>/ 讀一個字節RST=1。for(a=8 。 a>0。 a->ACC7=IO 。SCLK=1 。SCLK=0 。ACC=ACC>>1 。 return (ACC> 。/void write_1302(uchar add,uchar dat>/ 向 1302 芯片寫函數,指定寫入地址,數據 RST=0。SCLK=0 。RST=1。 write_byte(add> 。 write_byte(dat> 。SCLK=1 。RS
10、T=0。uchar read_1302(uchar add>/ 從 1302 讀數據函數,指定讀取數據來源地址uchar temp。RST=0。SCLK=0 。RST=1。write_byte(add> 。 temp=read_byte(> 。SCLK=1 。RST=0。 return(temp> 。uchar BCD_Decimal(uchar bcd>/BCD 碼轉十進制函數,輸入 BCD ,返回十進制 uchar Decimal 。Decimal=bcd>>4 。 return(Decimal=Decimal*10+(bcd&=0x0F&
11、gt;> 。/void ds1302_init(> /1302 芯片初始化子函數 (2018-01-07,12:00:00,week4>RST=0。SCLK=0 。write_1302(0x8e,0x00> 。 / 允許寫,禁止寫保護/write_1302(0x80,0x00> 。 /向 DS1302 內寫秒寄存器 80H 寫入初始秒數據 00 /write_1302(0x82,0x00> 。 /向 DS1302 內寫分寄存器 82H 寫入初始分數據 00 /write_1302(0x84,0x12> 。 /向 DS1302 內寫小時寄存器 84H 寫
12、入初始小時數據 12 /write_1302(0x8a,0x04> 。/向 DS1302 內寫周寄存器 8aH 寫入初始周數據 4 /write_1302(0x86,0x07> 。 /向 DS1302 內寫日期寄存器 86H 寫入初始日期數據 07 /write_1302(0x88,0x01> 。 /向 DS1302 內寫月份寄存器 88H 寫入初始月份數據 01 /write_1302(0x8c,0x10> 。 /向 DS1302 內寫年份寄存器 8cH 寫入初始年份數據 10 write_1302(0x8e,0x80> 。 / 打開寫保護/溫度顯示子函數voi
13、d write_temp(uchar add,uchar dat>/ 向 LCD 寫溫度數據 ,并指定顯示位置uchar gw,sw。gw=dat%10 。 /取得個位數字sw=dat/10 。 /取得十位數字write_1602com(er+add> 。 /er 是頭文件規定的值 0x80+0x40 write_1602dat(0x30+sw> 。/數字 +30得到該數字的 LCD1602 顯示碼 write_1602dat(0x30+gw> 。/數字+30得到該數字的 LCD1602 顯示碼 write_1602dat(0xdf> 。/ 顯示溫度的小圓圈符號,
14、 0xdf 是液晶屏字符庫的該符號地址碼write_1602dat(0x43> 。 /顯示 "C" 符號, 0x43 是液晶屏字符庫里大寫 C 的地址碼/時分秒顯示子函數void write_sfm(uchar add,uchar dat>/ 向 LCD 寫時分秒 ,有顯示位置加、現示數據,兩個參數uchar gw,sw。gw=dat%10 。 /取得個位數字sw=dat/10 。 /取得十位數字write_1602com(er+add> 。 /er 是頭文件規定的值 0x80+0x40 write_1602dat(0x30+sw> 。/數字 +30
15、得到該數字的 LCD1602 顯示碼 write_1602dat(0x30+gw> 。/數字+30得到該數字的 LCD1602 顯示碼/年月日顯示子函數void write_nyr(uchar add,uchar dat>/ 向 LCD 寫年月日,有顯示位置加數、顯示數據,兩個 參數uchar gw,sw。gw=dat%10 。 /取得個位數字sw=dat/10 。 /取得十位數字write_1602com(yh+add> 。 /設定顯示位置為第一個位置 +add write_1602dat(0x30+sw> 。/數字 +30得到該數字的 LCD1602 顯示碼 wri
16、te_1602dat(0x30+gw> 。/數字+30得到該數字的 LCD1602 顯示碼/void write_week(uchar week>/ 寫星期函數write_1602com(yh+0x0c> 。 /星期字符的顯示位置switch(week>case 1:write_1602dat('M'> 。 /星期數為 1 write_1602dat('O'> 。 write_1602dat('N'> 。break。case 2:write_1602dat('T'> 。 /星期數據為
17、write_1602dat('U'> 。write_1602dat('E'> 。break。case 3:write_1602dat('W'> 。 /星期數據為 write_1602dat('E'> 。 write_1602dat('D'> 。break。case 4:write_1602dat('T'> 。 /星期數據為write_1602dat('H'> 。write_1602dat('U'> 。break。case
18、 5:write_1602dat('F'> 。 /星期數據為 write_1602dat('R'> 。 write_1602dat('I'> 。break。case 6:write_1602dat('S'> 。 /星期數據為write_1602dat('T'> 。write_1602dat('A'> 。break。case 7:write_1602dat('S'> 。 /星期數據為write_1602dat('U'> 。
19、write_1602dat('N'> 。break。時,顯示2 時顯示3 時顯示4 是顯示5 時顯示6 時顯示7 時顯示/*鍵盤掃描有關函數 * void keyscan(>key1 為功能鍵 < 設置鍵)if(key1=0>/delay(9>。 /延時,用于消抖動 if(key1=0>/ 延時后再次確認按鍵按下 while(!key1> 。 key1n+ 。 if(key1n=9>8 個功keyl n=1。/設置按鍵共有秒、分、時、星期、日、月、年、返回,能循環switch(key1n>case 1: TR0=0。 /關閉
20、定時器/TR1=0 。write_1602com(er+0x09> 。 /設置按鍵按動一次,秒位置顯示光標 write_1602com(0x0f> 。 /設置光標為閃爍 temp=(miao>/10*16+(miao>%10 。 /秒數據寫入 DS1302 write_1302(0x8e,0x00> 。write_1302(0x80,0x80|temp> 。 /miaowrite_1302(0x8e,0x80> 。break。case 2: write_1602com(er+6> 。/按 2次 fen 位置顯示光標/write_1602com(0
21、x0f> 。break。case 3: write_1602com(er+3> 。/按動 3次, shi/write_1602com(0x0f> 。break。case 4: write_1602com(yh+0x0e> 。/按動 4次, week/write_1602com(0x0f> 。break。case 5: write_1602com(yh+0x0a> 。/按動 5次, ri/write_1602com(0x0f> 。break。case 6: write_1602com(yh+0x07> 。/按動 6次, yue/write_1602
22、com(0x0f> 。break。case 7: write_1602com(yh+0x04> 。/按動 7次, nian/write_1602com(0x0f> 。break。case 8:write_1602com(0x0c> 。 /按動到第 8 次,設置光標不閃爍TR0=1。/打開定時器temp=(miao>/10*16+(miao>%10 。write_1302(0x8e,0x00> 。write_1302(0x80,0x00|temp> 。 /miao 數據寫入 DS1302 write_1302(0x8e,0x80> 。brea
23、k 。/ 加鍵 key2if(key1n!=0>/ 當 key1 按下以下。再按以下鍵才有效<按鍵次數不等于零)if(key2=0> / 上調鍵 delay(10> 。 if(key2=0> while(!key2> 。 switch(key1n>case 1:miao+。 /設置鍵按動 1 次,調秒 if(miao=60>miao=0 。/秒超過 59,再加 1,就歸零 write_sfm(0x08,miao> 。 /令 LCD 在正確位置顯示 "加 "設定好的秒數 temp=(miao>/10*16+(miao
24、>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 / 允許寫,禁止寫保護 write_1302(0x80,temp> 。 /向 DS1302 內寫秒寄存器 80H 寫入調整 后的秒數據 BCD 碼write_1302(0x8e,0x80> 。 / 打開寫保護 write_1602com(er+0x09> 。 /因為設置液晶的模式是寫入數據后,光 標自動右移,所以要指定返回/write_1602com(0x0b> 。 break。case 2:fen+。 if(fen=60>fen=0。 wri
25、te_sfm(0x05,fen> 。/令 LCD 在正確位置顯示 " 加" 設定好的分數 據temp=(fen>/10*16+(fen>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x82,temp> 。/向 DS1302 內寫分寄存器 82H 寫入調整后 的分數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(er+6> 。 /因為設置液晶的模式是寫入數據后,指針 自動加
26、一,在這里是寫回原來的位置break。case 3:shi+。if(shi=24>shi=0 。 write_sfm(2,shi> 。/令 LCD 在正確的位置顯示 "加" 設定好的小時數 據temp=(shi>/10*16+(shi>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x84,temp> 。 /向 DS1302 內寫小時寄存器 84H 寫入調整后的小時數據 BCD 碼write_1302(0x8e,0x80> 。
27、/打開寫保護 write_1602com(er+3> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,所以需要光標回位break。case 4:week+。if(week=8> week=1 。write_1602com(yh+0x0C> 。/指定 '加 '后的周數據顯示位置 write_week(week> 。/ 指定周數據顯示內容 temp=(week>/10*16+(week>%10 。 / 十進制轉換成 DS1302 要求的 DCB 碼 write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_13
28、02(0x8a,temp> 。 /向 DS1302 內寫周寄存器 8aH 寫入調整后 的周數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(yh+0x0e> 。 /因為設置液晶的模式是寫入數據后, 指針自動加一,所以需要光標回位break。case 5:ri+。if(ri=32> ri=1。write_nyr(9,ri> 。/令 LCD 在正確的位置顯示 " 加"設定好的日期數據 temp=(ri>/10*16+(ri>%10。/十進制轉換成 DS1302 要求的 DCB 碼
29、write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x86,temp>。 /向DS1302內寫日期寄存器 86H寫入調整 后的日期數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護write_1602com(yh+10> 。 /因為設置液晶的模式是寫入數據后,指 針自動加一,所以需要光標回位break。case 6:yue+。if(yue=13> yue=1 。write_nyr(6,yue> 。 /令 LCD 在正確的位置顯示 "加"設定好的月份數 據temp=(yue
30、>/10*16+(yue>%10。/十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x88,temp>。/向DS1302內寫月份寄存器 88H寫入調整 后的月份數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護write_1602com(yh+7> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,所以需要光標回位break。case 7:nian+ 。if(nian=100> nian=0。 write_nyr(3,nian>
31、; 。 /令 LCD 在正確的位置顯示 "加 "設定好的年份數 據temp=(nian>/10*16+(nian>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼 write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x8c,temp> 。 /向 DS1302 內寫年份寄存器 8cH 寫入調整 后的年份數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(yh+4> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,所以需要光標回位
32、break。/ 減鍵 key3 ,各句功能參照 '加鍵'注釋 if(key3=0>delay(10> 。/調延時,消抖動if(key3=0>while(!key3> 。switch(key1n>case 1:miao-。if(miao=-1>miao=59。/秒數據減到-1時自動變成59 write_sfm(0x08,miao> 。 /在 LCD 的正確位置顯示改變后新的秒數temp=(miao>/10*16+(miao>%10 。 /十進制轉換成 DS1 302要求的 DCB 碼 write_1302(0x8e,0x00&
33、gt; 。 /允許寫,禁止寫保護 write_1302(0x80,temp>。向DS1302內寫秒寄存器 80H寫入調整 后的秒數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(er+0x09> 。 /因為設置液晶的模式是寫入數據后,指 針自動加一,在這里是寫回原來的位置/write_1602com(0x0b> 。 break。case 2:fen-。if(fen=-1> fen=59。write_sfm(5,fen> 。 temp=(fen>/10*16+(fen>%10 。 /十進制轉換
34、成 DS1302 要求的 DCBwrite_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x82,temp> 。/向 DS1302 內寫分寄存器 82H 寫入調整后 的分數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(er+6> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,在這里是寫回原來的位置break。case 3:shi-。if(shi=-1>shi=23。write_sfm(2,shi> 。 temp=(shi>/10*16+(shi>
35、%10 。 /十進制轉換成DS1302 要求的 DCB碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x84,temp> 。 /向 DS1302 內寫小時寄存器 84H 寫入調整 后的小時數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(er+3> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,所以需要光標回位break。case 4:week-。if(week=0>week=7 。write_1602com(yh+0x0C> 。/指定 '
36、加 '后的周數據顯示位置 write_week(week> 。/ 指定周數據顯示內容 temp=(week>/10*16+(week>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x8a,temp> 。 /向 DS1302 內寫周寄存器 8aH 寫入調整后 的周數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(yh+0x0e> 。 /因為設置液晶的模式是寫入數據后, 指針自動加一,所
37、以需要光標回位break。case 5:ri- 。if(ri=0>ri=31 。write_nyr(9,ri> 。temp=(ri>/10*16+(ri>%10。/十進制轉換成 DS1302 要求的 DCB 碼 write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x86,temp>。 /向DS1302內寫日期寄存器 86H寫入調整 后的日期數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護write_1602com(yh+10> 。 /因為設置液晶的模式是寫入數據后,指針自動加一
38、,所以需要光標回位break。 case 6:yue-。if(yue=0> yue=12。 write_nyr(6,yue> 。 temp=(yue>/10*16+(yue>%10 。 /十進制轉換成 DS1302 要求的 DCB 碼write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x88,temp> 。 /向 DS1302 內寫月份寄存器 88H 寫入調整 后的月份數據 BCD 碼write_1302(0x8e,0x80> 。 /打開寫保護 write_1602com(yh+7> 。 /因為設置液晶的模式是寫入數據后,指針 自動加一,所以需要光標回位break。case 7:nian-。if(nian=-1> nian=99。 write_nyr(3,nian> 。temp=(nian>/10*16+(nian>%10 。/ 十進制轉換成 DS1302 要求的 DCB 碼 write_1302(0x8e,0x00> 。 /允許寫,禁止寫保護 write_1302(0x8c,temp> 。 /向 DS1302 內寫年份寄存器 8cH 寫入調整 后的年份數據 BC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專利代理人的職能分析試題及答案
- 七年級道德與法治下冊 第一單元 青春時光 第一課 青春的邀約 第二框《成長的不僅僅的是身體》教學設計 新人教版
- 奶茶英文測試題及答案
- 衛生管理中公共健康的試題及答案
- 有條理的計算機二級知識分解試題及答案
- 全國川教版信息技術七年級下冊第2單元第4節《匯報成果 展示評價》初中信息技術教學設計
- 核輻射考試題及答案
- 大學世界史試題及答案
- 醫藥基礎化學試題及答案
- 8《蝴蝶的家》教學設計-2024-2025學年統編版語文四年級上冊001
- 2025年平頂山職業技術學院高職單招職業技能測試近5年常考版參考題庫含答案解析
- 第二十一章會陰部美容手術講解
- 2025偏心半球閥技術規范
- 2025年春新人教版語文一年級下冊教學課件 11 浪花
- 金融投資策略分析報告
- 專練04-中國地理、世界地理100題(解析版)
- 水利工程信息化項目劃分表示例、單元工程質量標準、驗收應提供的資料目錄
- 意識哲學研究前沿-洞察分析
- 固定資產投資統計專業培訓(2024年11月)
- 2025年中國鐵路蘭州局集團限公司招聘高頻重點提升(共500題)附帶答案詳解
- 2025道路運輸安全員兩類人員考試考核題庫含答案全套
評論
0/150
提交評論