hms編程
『壹』 輸入總秒數,並將其以時、分、秒的形式輸出,用java編程
public void toHMS(int ss){
int hour = ss/3600;
int min = (ss - (hour*3600))/60;
int s = ss-(hour*3600+min*60);
System.out.println(hour+":"+min+":"+s);
}
『貳』 銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼
銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼
銆銆銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼嬶紝銆屼粨棰夈嶆e紡寮鍚浜嗗唴嫻嬶紝鐩鍓嶅凡緇忔湁閮ㄥ垎寮鍙戣呮嬁鍒版簮浠g爜銆備箣鍓嶅逛簬銆屼粨棰夈嶇寽嫻嬬殑涓浜涗紶璦錛屼篃鏈変簡鏄庣『鐨勭瓟妗堛傘屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼嬨
銆銆銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼1
銆銆鍗庝負緙栫▼璇璦瀹為獙瀹わ紝闈㈠悜閮ㄥ垎寮鍙戣呭彂甯冧簡蹇冨緱璇璦璇曠敤鎶ュ悕鐨勯棶鍗楓傚湪瀹屾垚闂鍗風殑濉鍐欏悗錛屼細鏍規嵁閭浠惰繘琛屽悗緇淇℃伅鐨勯氱煡銆
銆銆鏃╁湪2020騫9鏈堢殑鏃跺欙紝鏈夊井鍗氬崥涓誨氨鏇濆厜浜嗭紝鍗庝負姝e湪鐮斿彂鑷涓葷紪紼嬭銆屼粨棰夈嶏紝甯﹂嗘暣涓鍥㈤槦鐨勬槸鍗椾含澶у︾殑鍗氬+瀵煎笀鍐鏂板畤銆傚湪20騫寸殑鏃跺欏氨緗戜紶銆屼粨棰夈嶆槸涓轟簡楦胯挋鏉ョ殑銆
銆銆濡備粖娑堟伅宸茬粡璇佸疄錛岀『瀹炪屼粨棰夈嶆槸鏍規嵁楦胯挋HarmonyOS閲忚韓鎵撻犵殑緙栫▼璇璦錛岄氳繃銆屼粨棰夈嶉縛钂欏拰嬈ф媺鍦ㄥ簲鐢ㄥ紑鍙戠敓鎬佷笂榪涜屾墦閫氥
銆銆鍩轟簬涓婇潰娑堟伅緗戝弸灞曞紑浜嗗箍娉涜ㄨ猴紝鍏朵腑鏈変竴涓緗戝弸璇翠腑鏂囩紪紼嬭璦濡傛灉鎺ㄥ箍寮錛屽彲浠ラ檷浣庣紪紼嬬殑闂ㄦ涳紝榪欐槸濂戒簨銆備絾鏄鍏朵粬緗戝弸鐐擱攨浜嗭細
銆銆涔熷氨鏄鏈夌綉鍙嬭や負鎴戝浗緙栫▼璇璦鏄涓鏂囩殑錛屼腑鏂囩紪紼嬭璦鍙浠ラ檷浣庣紪紼嬮棬妲涖傛寔鍙嶅規剰瑙佺殑緗戝弸瑙夊緱鈥滀綘瀛﹀ソ涓鏂囦簡錛屼綘浼氬啓涔﹀啓浣滄枃錛熲濄
銆銆浣嗘槸鏈変竴浜涜〃紺鴻嚜宸辨槸浠撻夊唴嫻嬫垚鍛樼殑緗戝弸鏉ヨ緹璋d簡銆傚凡緇忕捐淇濆瘑鏉℃鵑檺鍒訛紝鐩鍓嶅彧鍏佽歌緹璋c傞栧厛闈炰腑鏂囩紪紼嬶紝浠庢帉鎻$殑浠g爜鐨勬潵鐪嬩篃涓嶅瓨鍦ㄧ綉浼犵殑鈥滃楀3鈥濄傚唴渚х殑鏍規湰鍘熷洜灝辨槸榪樺湪鏀硅繘銆傛墍璋撳唴渚т漢鍛樹笉鑳芥硠闇蹭換浣曟枃妗c佷唬鐮侀庢牸錛屽唴渚х兢鑱婄瓑絳夌浉鍏蟲秷鎮銆
銆銆鑰屼笖浠撻夌殑鑻辨枃鐩磋瘧鏄疌angjie錛
銆銆銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼2
銆銆澶囧彈鍏蟲敞鐨勫崕涓鴻嚜鐮旂紪紼嬭璦銆屼粨棰夈嶏紝鍙堢伀涓婄儹鎼滀簡銆
銆銆榪欐℃槸鍥犱負銆屼粨棰夈嶆e紡寮鍚浜嗗唴嫻嬶紝鐩鍓嶅凡緇忔湁閮ㄥ垎寮鍙戣呮嬁鍒版簮浠g爜銆
銆銆鍓嶄笉涔咃紝鍗庝負緙栫▼璇璦瀹為獙瀹ゅ彂甯冧簡涓浠解滄柊璇璦璇曠敤鎶ュ悕-202203鈥濋棶鍗鳳紝姝e紡寰侀泦涓灝忔壒寮鍙戣呭廣屼粨棰夈嶇紪紼嬭璦榪涜屽皬鑼冨洿嫻嬭瘯銆
銆銆浠庨棶鍗峰唴瀹規潵鐪嬶紝寮鍙戣呬滑闇瑕佸~鍐橤itee涓婚〉銆佽亴涓氬拰鍏鍙哥瓑淇℃伅錛岀劧鍚庣瓑寰呴偖浠墮氱煡銆
銆銆鐜板湪錛岄殢鐫鏇村氱粏鑺傝閫忛湶鍑烘潵錛屼箣鍓嶅逛簬銆屼粨棰夈嶇寽嫻嬬殑涓浜涗紶璦錛屼篃鏈変簡鏄庣『鐨勭瓟妗堛
銆銆鑻辨枃鍚岰angjie錛屽苟闈炰腑鏂囩紪紼
銆銆浜嬪疄涓婏紝鏃╁湪鍘誨勾10鏈堬紝鍗庝負瀹樻柟灝辨槑紜閫忛湶榪団滃皢鍙戝竷鑷鐮旈縛钂欑紪紼嬭璦鈥濄
銆銆瀵規わ紝鍗庝負娑堣垂鑰呬笟鍔¤蔣浠墮儴鎬昏侀練浣撹〃紺猴紝瀹冨皢鈥滀負楦胯挋鐢熸佸熀紜璁炬柦寤鴻捐ˉ涓婃渶鍚庝竴鐜鈥濄
銆銆鍚屾椂錛屽崕涓轟篃宸茬粡鐢寵鋒敞鍐屼簡鈥滃崕涓轟粨棰夆濄佲滀粨棰夎璦鈥濈瓑鍟嗘爣錛屽垎綾誨寘鎷縐戝︿華鍣ㄣ佽捐$爺絀剁瓑錛岃岄儴鍒嗏滀粨棰夆濆晢鏍囧垯榪樺湪椹沖洖澶嶅°佹敞鍐岀敵璇風殑闃舵點
銆銆榪欓噷鐪嬪埌鍗庝負榪樻敞鍐屼簡涓涓鍙鈥滀粨鏉扳濈殑鍟嗘爣錛岀洰鍓嶄篃宸茬粡閫氳繃鐢寵鳳紙鎵嬪姩鐙楀ご錛夛細
銆銆鈻沖浘婧怈浼佹煡鏌APP
銆銆鏃墮棿鏉ュ埌浠婂勾3鏈堜喚銆
銆銆闅忕潃鍐呮祴鐨勫紑鍚錛岄儴鍒嗗紑鍙戣呭湪鎷垮埌銆屼粨棰夈嶇殑婧愪唬鐮佸悗錛屼篃瀵規ゅ墠婕澶╅炵殑鐚滄祴鍜屼紶璦榪涜屼簡涓浜涘洖搴斻
銆銆 鍏朵竴錛屻屼粨棰夈嶇殑鑻辨枃鍚嶅氨鏄疌angjie錛岃屼笉鏄姝ゅ墠浼犻椈鐨勨渃har鈥濄
銆銆褰撴椂鍗庝負琚鏇濈爺鍙戙屼粨棰夈嶅悗錛岀煡涔庡氨浼犲嚭榪囪繖闂ㄧ紪紼嬭璦鑻辨枃鍚嶆槸鈥渃har鈥濈殑娑堟伅錛
銆銆鐩鍓嶈繖涓浼犻椈宸茬粡琚杈熻埃銆
銆銆 鍏朵簩錛屻屼粨棰夈嶄笉鏄涓鏂囩紪紼嬶紝涔熶笉瀛樺湪鎵璋撶殑鈥滃楀3鈥濄
銆銆鎹鐭ヤ箮涓浣嶅尶鍚嶇敤鎴瘋〃紺猴紝浣撻獙鍚庡彂鐜般屼粨棰夈嶇紪紼嬭璦鈥滆窡涓鏂囧崐鐐瑰叧緋繪病鏈夆濓紝璇娉曠被浼糶o+java銆
銆銆鍏跺疄錛岀幇鍦ㄩ殢鎵嬩竴鎼滆繕鏄鑳芥悳鍒頒竴澶у爢鍏充簬銆屼粨棰夈嶆槸涓鏂囩紪紼嬬殑鍋囨秷鎮鈥︹
銆銆 鍏朵笁錛屼箣鎵浠ヨ繕鍦ㄥ唴嫻嬶紝鏄鍥犱負鍖呮嫭鍥㈤槦鍜屽唴嫻嬫垚鍛橀兘榪樺湪鏀硅繘浠g爜銆
銆銆鍡錛岄棶灝辨槸榪樺湪淇産ug錛堟墜鍔ㄧ嫍澶達級銆
銆銆浣嗗叾瀹烇紝澶у舵渶濂藉囩殑榪樻槸銆屼粨棰夈嶈繖闂ㄧ紪紼嬭璦絀剁珶闀垮暐鏍楓
銆銆浜嬪疄涓婏紝姝ゅ墠鍗庝負緙栫▼璇璦瀹為獙瀹や富浠匯佸崡浜澶у﹀啹鏂板畤鏁欐巿錛屽凡緇忓紑璁捐繃涓闂ㄥ叧浜庛婄紪紼嬭璦鐨勮捐″拰瀹炵幇銆嬬殑璇劇▼錛岀洰鍓嶅崕涓哄畼鏂瑰凡鏀懼嚭B絝欒嗛戙
銆銆 鍗庝負瀹樻柟寮璁捐繃緙栫▼璇璦璇劇▼
銆銆鍦ㄨ插駭涓寮濮嬶紝鍐鏁欐巿灝遍忛湶浜嗚嚜宸辯洰鍓嶈繘琛岀殑涓浜涘伐浣溿
銆銆鍏蜂綋鏉ヨ達紝瀛︽湳涓婄殑鐮旂┒涓昏佸寘鎷琍L鐞嗚哄強搴旂敤絳夛紝鑰屽伐涓氭柟闈㈢殑鐮旂┒錛屽垯涓昏佹槸甯﹂嗗崕涓虹紪紼嬭璦瀹為獙瀹よ繘琛屽伐涓氱紪紼嬭璦鐨勮捐″拰瀹炵幇錛
銆銆鍦ㄥ啹鏂板畤鏁欐巿緇欏嚭鐨勮句歡涓鍙浠ョ湅瑙侊紝鐩鍓嶇殑緙栫▼璇璦綾誨瀷涓昏佸彲浠ュ垎涓轟互涓嬪嚑縐嶏紝鍏朵腑鐫閲嶆彁鍒頒簡騫沖彴鍨嬭璦錛
銆銆鍍廋#銆丟o銆丼wift榪欎簺寮婧愮紪紼嬭璦錛屼篃閮芥槸鐢卞儚璋鋒瓕銆佸井杞鍜岃嫻鏋滆繖鏍風殑鍏鍙歌嚜宸辨姇鍏ュ幓鍋氱殑錛屼互姝ゆ帉鎺ц璦鐨勬妧鏈婕旇繘絳栫暐鍜屾柟鍚戙
銆銆浣嗗崕涓恆屼粨棰夈嶇┒絝熸槸涓闂ㄦ庢牱鐨勮璦錛岀洰鍓嶈繕鏈夊緟瀹樻柟姝e紡鍏寮淇℃伅銆
銆銆銆屼粨棰夈嶅唴嫻嬩漢鍛樿緹璋o細涓嶆槸涓鏂囩紪紼3
銆銆16鏃ワ紝鍗庝負緙栫▼璇璦瀹為獙瀹ゅ彂甯冧簡涓浠解滄柊璇璦璇曠敤鎶ュ悕-202203鈥濋棶鍗鳳紝闈㈠悜閮ㄥ垎寮鍙戣呭彂甯冧簡鍗庝負鏂拌璦鐨勮瘯鐢ㄦ姤鍚嶉棶鍗鳳紝寮鍙戣呬滑闇瑕佸~鍐橤itee涓婚〉銆佽亴涓氬拰鍏鍙哥瓑淇℃伅錛岀劧鍚庣瓑寰呴偖浠墮氱煡銆
銆銆鍚屾椂錛屽湪闂鍗峰~鍐欏畬鎴愬悗錛屽皢閫氳繃閭浠惰繘琛屽悗緇淇℃伅鐨勯氱煡銆傛牴鎹鍗庝負姝ゅ墠鍏甯冪殑鍐呭規潵鐪嬶紝榪欐鋸滄柊璇璦鈥濓紝鎸囩殑搴旇ュ氨鏄鍗庝負鍦2021騫村紑鍙戣呭ぇ浼氫笂錛屽叕甯冪殑鑷鐮旂紪紼嬭璦鈥滀粨棰夆濄
銆銆鍗庝負鍓鎬昏併佽$畻浜у搧綰挎昏侀倱娉板崕鏇2021騫 9 鏈堝湪鎺ュ彈閲囪挎椂琛ㄧず錛屼粨棰夋槸鍗庝負鏍規嵁HarmonyOS閲忚韓鎵撻犵殑緙栫▼璇璦錛屽崕涓2022騫村皢鎺ㄥ嚭鑷鐮旂殑緙栫▼璇璦浠撻夛紝灝嗛縛钂欏拰嬈ф媺鍦ㄥ簲鐢ㄥ紑鍙戠敓鎬佷笂榪涜屾墦閫氾紝鎷撳睍緋葷粺鐨勫彲鑳芥с傚崕涓烘秷璐硅呬笟鍔¤蔣浠墮儴鎬昏侀練浣撹〃紺猴紝瀹冨皢鈥滀負楦胯挋鐢熸佸熀紜璁炬柦寤鴻捐ˉ涓婃渶鍚庝竴鐜鈥濄
銆銆闅忕潃鍐呮祴鐨勫紑鍚錛岄儴鍒嗗紑鍙戣呭湪鎷垮埌銆屼粨棰夈嶇殑婧愪唬鐮佸悗錛屽湪緗戜笂瀵逛箣鍓嶅悇縐嶈埃璦榪涜屼簡鍥炲簲鍜屾緞娓咃細
銆銆絎涓錛屼笉鏄涓鏂囩紪紼嬶紱
銆銆絎浜岋紝涓嶅瓨鍦ㄦ墍璋撶殑鈥滃楀3鈥濓紱
銆銆絎涓夛紝鍐呮祴鐨刞鍘熷洜褰掓牴緇撳簳榪樻槸姝e湪鏀硅繘銆
銆銆絎鍥涳紝鈥滀粨棰夆濈殑鑻辨枃鍚嶆槸鐩磋瘧鈥淐angjie鈥濓紝涓嶆槸鈥渃har鈥濄
銆銆鎴戜滑鍥藉朵篃搴旇ユ湁鑷宸辯殑緙栫▼璇璦浜嗏
銆銆鑻規灉鏈塖wift錛
銆銆璋鋒瓕鏈塂art錛
銆銆寰杞鏈 TypeScript錛屽畠鐨勪綔鑰呭畨寰鋒柉路嫻峰皵鏂浼鏍礆紝鏄疌#鐨勯栧腑鏋舵瀯甯堬紱
銆銆榪炲皬灝忔嵎鍏嬬殑JetBrian鈥滃柗姘旇剳鈥濆叕鍙告悶鐨凨otlin錛岃繖璐т笂澶╁叆鍦版棤鎵涓嶈兘錛屾槸鎴戠洰鍓嶇煡閬撶殑搴旂敤鑼冨洿鏈騫挎硾鐨勮璦鈥︹﹁繕鏈塉ulia榪戞潵涔熸槸鎺璧蜂竴鑲$儹娼鈥︹︽垜浠鍥藉朵篃搴旇ユ湁鑷宸辯殑緙栫▼璇璦浜嗏
銆銆9鏈堝垵錛屽井鍗氬崥涓燴淚T宸ョ▼甯堚濈垎鏂欏崕涓烘e湪鐮斿彂鑷涓葷紪紼嬭璦鈥滀粨棰夆濓紝鐢卞崡浜澶у︾殑璁$畻鏈虹戝︿笌鎶鏈緋誨崥澹鐢熷煎笀鈥斺斿啹鏂板畤棰嗚斿紑鍙戙
銆銆鍗庝負鑷鐮旂紪紼嬭璦騫墮潪縐樺瘑錛屽崕涓哄湪緙栬瘧鍣ㄤ笌緙栫▼璇璦鏂歸潰鏃╂湁鍔ㄤ綔銆
銆銆鏂硅垷緙栬瘧鍣錛屽氨鏄鍗庝負鍦ㄧ紪璇戝櫒鏂瑰悜鐨勭爺絀舵垚鏋滀箣涓銆
銆銆2019騫8鏈31鏃ワ紝鍗庝負鍦ㄥ紑婧愬鉤鍙頒笂鏀懼嚭浜嗘柟鑸熺紪璇戝櫒鐨勬簮浠g爜錛岃繖鏄鍗庝負棣栦釜瀹屽叏鑷涓葷爺鍙戠殑緙栬瘧鍣ㄥ鉤鍙般
銆銆鏃╁墠錛屽湪璋鋒瓕瀵瑰崕涓哄皝閿丟MS鐨勬椂鍊欙紝鍗庝負浠モ滃厛瑙佷箣鏄庘濆湪鍒惰佷笉涔呭悗灝卞彂甯冧簡HMS錛屽備粖HMS鍏ㄧ悆寮鍙戣呭凡緇忚揪鍒180涓囷紝鍗庝負搴旂敤甯傚満APP Galley鍏ㄧ悆媧昏穬鐢ㄦ埛涔熻揪鍒頒簡4.9浜匡紝搴旂敤鍒嗗彂閲忚揪鍒2610浜匡紝鎴愪負鍏ㄧ悆絎涓夌殑搴旂敤鍟嗗簵銆
銆銆璁╂垜浠涓璧鋒湡寰呮e紡鍏甯冪殑閭d竴澶╁惂錛
『叄』 89c51單面機c語言時鍾控制器編程
方案1:AT89S52,DS12887時鍾晶元,實踐通過,運行穩定。自己根據程序連接引腳。
LCD顯示的。
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDCOM XBYTE[0xcffc] //LCD寫命令寄存器地址
#define LCDDATA XBYTE[0xcffd] //LCD寫數據寄存器地址
#define LCDSTATUS XBYTE[0xcffe] //LCD讀狀態寄存器地址
#define DSA XBYTE[0x8f0a] //實時時鍾寄存器A
#define DSB XBYTE[0x8f0b] //實時時鍾寄存器B
#define DSC XBYTE[0x8f0c] //實時時鍾寄存器C
#define DSD XBYTE[0x8f0d] //實時時鍾寄存器D
#define SECOND XBYTE[0x8f05] //實時時鍾分報警
sbit bflag=ACC^7;
uchar idata dt[7]={06,7,11,17,05,0,2}; //時間初值
uchar at[7]={9,8,7,4,2,0,6}; //年,月,日,時,分,秒,星期時標寄存器地址
uchar xdata *addr=0x8f00; //實時時鍾片選地址
//函數的聲明部分
//void delay1(uint x);
void lcd_busy();
void lcd_cmd(uchar lcd_cmd);
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
void init(void);
//void delay( unsigned int number );
void init_ds(void); /模鏈/實時時鍾初始化
void WDS(void); //寫時標函數
void RDS(void); //讀時標函數
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0}; //年月日
uchar hms[8]={0,0,0,0,0,0,0,0}; //時分秒
uchar weekday[3];
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
void init_ds(void) //實時時鍾初始化
{
DSA=0x2f; //選時鍾32.768kHz;中斷周期500ms
ACC=DSC; //清中斷請求喚大標志
ACC=DSD; //VRT=1;數據有效
DSB=0x7e; //中斷允許,時標值為二進制碼,24小旦鏈孫時制,晶元工作,方波輸出允許
}
void WDS(void) //寫時標函數
{
uchar i;
DSB=0x8e; //置SET位為1
DSB=0x8e;
for(i=0;i<7;i++)
{
*(addr+at[i])=dt[i]; //置時標初值
}
}
void RDS(void)
{
uchar i;
do
{
ACC=DSA;
}
while(bflag==1);
for(i=0;i<7;i++)
{
dt[i]=*(addr+at[i]);
}
}
void lcd_busy() //檢測lcd忙程序
{
do
{
ACC=LCDSTATUS;
}
while(bflag==1); //當他忙的時候就不停的檢測,直到空閑為止
}
void lcd_cmd(uchar lcd_cmd) //寫命令函數
{
LCDCOM=lcd_cmd;
lcd_busy();
}
void lcd_data(uchar lcd_data) //寫數據函數
{
LCDDATA=lcd_data;
lcd_busy();
}
void lcd_moveto(uchar position) //確定顯示位置
{
uchar temp; //為顯示位置對應的地址
if (position<16)
temp=(position+0x80-1); //為在第一行
else
temp=((position-16)+0xc0); //為第二行
lcd_cmd(temp);
}
void init(void) //lcd初始化
{
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x38); //置功能:2行,5*7字元
lcd_busy();
lcd_cmd(0x06); //置輸入模式:地址增量,顯示屏不移動
lcd_busy();
lcd_cmd(0x0c); //置顯示開,不顯示游標,游標不閃爍
lcd_busy();
lcd_cmd(0x01); //清顯示
lcd_busy();
}
void shizhong(void) //時鍾的每一位取出來
{
ymd[2]=dt[0]/10;
ymd[3]=dt[0]%10;
ymd[4]=10;
ymd[5]=dt[1]/10;
ymd[6]=dt[1]%10;
ymd[7]=10;
ymd[8]=dt[2]/10;
ymd[9]=dt[2]%10;
hms[0]=dt[3]/10;
hms[1]=dt[3]%10;
hms[2]=11;
hms[3]=dt[4]/10;
hms[4]=dt[4]%10;
hms[5]=11;
hms[6]=dt[5]/10;
hms[7]=dt[5]%10;
使用晶元:AT89S52,DS12887時鍾晶元,實踐通過,運行穩定。自己根據程序連接引腳。
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDCOM XBYTE[0xcffc] //LCD寫命令寄存器地址
#define LCDDATA XBYTE[0xcffd] //LCD寫數據寄存器地址
#define LCDSTATUS XBYTE[0xcffe] //LCD讀狀態寄存器地址
#define DSA XBYTE[0x8f0a] //實時時鍾寄存器A
#define DSB XBYTE[0x8f0b] //實時時鍾寄存器B
#define DSC XBYTE[0x8f0c] //實時時鍾寄存器C
#define DSD XBYTE[0x8f0d] //實時時鍾寄存器D
#define SECOND XBYTE[0x8f05] //實時時鍾分報警
sbit bflag=ACC^7;
uchar idata dt[7]={06,7,11,17,05,0,2}; //時間初值
uchar at[7]={9,8,7,4,2,0,6}; //年,月,日,時,分,秒,星期時標寄存器地址
uchar xdata *addr=0x8f00; //實時時鍾片選地址
//函數的聲明部分
//void delay1(uint x);
void lcd_busy();
void lcd_cmd(uchar lcd_cmd);
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
void init(void);
//void delay( unsigned int number );
void init_ds(void); //實時時鍾初始化
void WDS(void); //寫時標函數
void RDS(void); //讀時標函數
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0}; //年月日
uchar hms[8]={0,0,0,0,0,0,0,0}; //時分秒
uchar weekday[3];
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
/*void delay1(uint x) //延時1ms程序
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
void delay( unsigned int number )
{
unsigned char i;
unsigned int u;
while(u<number)
{
for(i=0;i<=125;i++);
u++;
}
} */
void init_ds(void) //實時時鍾初始化
{
DSA=0x2f; //選時鍾32.768kHz;中斷周期500ms
ACC=DSC; //清中斷請求標志
ACC=DSD; //VRT=1;數據有效
DSB=0x7e; //中斷允許,時標值為二進制碼,24小時制,晶元工作,方波輸出允許
}
void WDS(void) //寫時標函數
{
uchar i;
DSB=0x8e; //置SET位為1
DSB=0x8e;
for(i=0;i<7;i++)
{
*(addr+at[i])=dt[i]; //置時標初值
}
}
void RDS(void)
{
uchar i;
do
{
ACC=DSA;
}
while(bflag==1);
for(i=0;i<7;i++)
{
dt[i]=*(addr+at[i]);
}
}
void lcd_busy() //檢測lcd忙程序
{
do
{
ACC=LCDSTATUS;
}
while(bflag==1); //當他忙的時候就不停的檢測,直到空閑為止
}
void lcd_cmd(uchar lcd_cmd) //寫命令函數
{
LCDCOM=lcd_cmd;
lcd_busy();
}
void lcd_data(uchar lcd_data) //寫數據函數
{
LCDDATA=lcd_data;
lcd_busy();
}
void lcd_moveto(uchar position) //確定顯示位置
{
uchar temp; //為顯示位置對應的地址
if (position<16)
temp=(position+0x80-1); //為在第一行
else
temp=((position-16)+0xc0); //為第二行
lcd_cmd(temp);
}
void init(void) //lcd初始化
{
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x38); //置功能:2行,5*7字元
lcd_busy();
lcd_cmd(0x06); //置輸入模式:地址增量,顯示屏不移動
lcd_busy();
lcd_cmd(0x0c); //置顯示開,不顯示游標,游標不閃爍
lcd_busy();
lcd_cmd(0x01); //清顯示
lcd_busy();
}
void shizhong(void) //時鍾的每一位取出來
{
ymd[2]=dt[0]/10;
ymd[3]=dt[0]%10;
ymd[4]=10;
ymd[5]=dt[1]/10;
ymd[6]=dt[1]%10;
ymd[7]=10;
ymd[8]=dt[2]/10;
ymd[9]=dt[2]%10;
hms[0]=dt[3]/10;
hms[1]=dt[3]%10;
hms[2]=11;
hms[3]=dt[4]/10;
hms[4]=dt[4]%10;
hms[5]=11;
hms[6]=dt[5]/10;
hms[7]=dt[5]%10;
switch(dt[6])
{
case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;
case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;
case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;
case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;
case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;
case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;
case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;
}
}
void main(void)
{
uchar i;
WDS();
init_ds();
init();
while(1)
{
RDS();
shizhong();
lcd_moveto(3);
for(i=0;i<10;i++)
{
lcd_data(dis_buf[ymd[i]]);
}
lcd_moveto(17);
for(i=0;i<8;i++)
{
lcd_data(dis_buf[hms[i]]);
}
lcd_data(0x20);
for(i=0;i<3;i++)
{
lcd_data(weekday[i]);
}
}
}
方案2:用內部的定時器做數字鍾,通過數碼管顯示出來
使用晶元:AT89S52,DS12887時鍾晶元,實踐通過,運行穩定。自己根據程序連接引腳。
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCDCOM XBYTE[0xcffc] //LCD寫命令寄存器地址
#define LCDDATA XBYTE[0xcffd] //LCD寫數據寄存器地址
#define LCDSTATUS XBYTE[0xcffe] //LCD讀狀態寄存器地址
#define DSA XBYTE[0x8f0a] //實時時鍾寄存器A
#define DSB XBYTE[0x8f0b] //實時時鍾寄存器B
#define DSC XBYTE[0x8f0c] //實時時鍾寄存器C
#define DSD XBYTE[0x8f0d] //實時時鍾寄存器D
#define SECOND XBYTE[0x8f05] //實時時鍾分報警
sbit bflag=ACC^7;
uchar idata dt[7]={06,7,11,17,05,0,2}; //時間初值
uchar at[7]={9,8,7,4,2,0,6}; //年,月,日,時,分,秒,星期時標寄存器地址
uchar xdata *addr=0x8f00; //實時時鍾片選地址
//函數的聲明部分
//void delay1(uint x);
void lcd_busy();
void lcd_cmd(uchar lcd_cmd);
void lcd_data(uchar lcd_data);
void lcd_moveto(uchar position);
void init(void);
//void delay( unsigned int number );
void init_ds(void); //實時時鍾初始化
void WDS(void); //寫時標函數
void RDS(void); //讀時標函數
uchar ymd[10]={2,0,0,0,0,0,0,0,0,0}; //年月日
uchar hms[8]={0,0,0,0,0,0,0,0}; //時分秒
uchar weekday[3];
uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};
/*void delay1(uint x) //延時1ms程序
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
void delay( unsigned int number )
{
unsigned char i;
unsigned int u;
while(u<number)
{
for(i=0;i<=125;i++);
u++;
}
} */
void init_ds(void) //實時時鍾初始化
{
DSA=0x2f; //選時鍾32.768kHz;中斷周期500ms
ACC=DSC; //清中斷請求標志
ACC=DSD; //VRT=1;數據有效
DSB=0x7e; //中斷允許,時標值為二進制碼,24小時制,晶元工作,方波輸出允許
}
void WDS(void) //寫時標函數
{
uchar i;
DSB=0x8e; //置SET位為1
DSB=0x8e;
for(i=0;i<7;i++)
{
*(addr+at[i])=dt[i]; //置時標初值
}
}
void RDS(void)
{
uchar i;
do
{
ACC=DSA;
}
while(bflag==1);
for(i=0;i<7;i++)
{
dt[i]=*(addr+at[i]);
}
}
void lcd_busy() //檢測lcd忙程序
{
do
{
ACC=LCDSTATUS;
}
while(bflag==1); //當他忙的時候就不停的檢測,直到空閑為止
}
void lcd_cmd(uchar lcd_cmd) //寫命令函數
{
LCDCOM=lcd_cmd;
lcd_busy();
}
void lcd_data(uchar lcd_data) //寫數據函數
{
LCDDATA=lcd_data;
lcd_busy();
}
void lcd_moveto(uchar position) //確定顯示位置
{
uchar temp; //為顯示位置對應的地址
if (position<16)
temp=(position+0x80-1); //為在第一行
else
temp=((position-16)+0xc0); //為第二行
lcd_cmd(temp);
}
void init(void) //lcd初始化
{
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x30); //置功能:1行,5*7字元
lcd_busy();
lcd_cmd(0x38); //置功能:2行,5*7字元
lcd_busy();
lcd_cmd(0x06); //置輸入模式:地址增量,顯示屏不移動
lcd_busy();
lcd_cmd(0x0c); //置顯示開,不顯示游標,游標不閃爍
lcd_busy();
lcd_cmd(0x01); //清顯示
lcd_busy();
}
void shizhong(void) //時鍾的每一位取出來
{
ymd[2]=dt[0]/10;
ymd[3]=dt[0]%10;
ymd[4]=10;
ymd[5]=dt[1]/10;
ymd[6]=dt[1]%10;
ymd[7]=10;
ymd[8]=dt[2]/10;
ymd[9]=dt[2]%10;
hms[0]=dt[3]/10;
hms[1]=dt[3]%10;
hms[2]=11;
hms[3]=dt[4]/10;
hms[4]=dt[4]%10;
hms[5]=11;
hms[6]=dt[5]/10;
hms[7]=dt[5]%10;
switch(dt[6])
{
case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;
case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;
case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;
case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;
case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;
case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;
case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;
}
}
void main(void)
{
uchar i;
WDS();
init_ds();
init();
while(1)
{
RDS();
shizhong();
lcd_moveto(3);
for(i=0;i<10;i++)
{
lcd_data(dis_buf[ymd[i]]);
}
lcd_moveto(17);
for(i=0;i<8;i++)
{
lcd_data(dis_buf[hms[i]]);
}
lcd_data(0x20);
for(i=0;i<3;i++)
{
lcd_data(weekday[i]);
}
}
}
再給一個:用內部的定時器做數字鍾,通過數碼管顯示出來。
#include <regx52.h>
#define uchar unsigned char
#define uint unsigned int
uchar dispcode[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00}; //定義0到F的段選碼
uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //8位數碼管的位選碼
uchar dispbuf[8]={ 0,0,16,0,0,16,0,0}; //定義一個緩沖區
uchar dispbitcnt;
uchar second;
uchar minite;
uchar hour;
uint tcnt;
uchar mstcnt;
uchar i,j;
void main(void)
{
TMOD=0x02; //定時器0工作方式2
TH0=0x06; //每250us中斷一次
TL0=0x06;
TR0=1; //啟動定時器0
ET0=1; //定時器0中斷允許
EA=1; //CPU開中斷
while(1)
{
if(P0_0==0)
{ for(i=5;i>0;i--)
for(j=248;j>0;j--); //延時檢查是否是P0_0被按下
if(P0_0==0) //如果被按下
{
second++; //秒就加1
if (second==60)
{
second=0;
}
dispbuf[0] =second%10; //存放秒的個位
dispbuf[1] =second/10; //存放秒的十位
while (P0_0==0); //等待P0_0變高
}
}
if(P0_1==0)
{ for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if (minite==60)
{
minite=0;
}
dispbuf[3] =minite%10;
dispbuf[4] =minite/10;
while (P0_1==0);
} }
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6] =hour%10;
dispbuf[7] =hour/10;
while (P0_2==0);
} } } }
void t0 (void) interrupt 1 using 0 //定時器0中斷服務程序
{
P1=dispcode[dispbuf[dispbitcnt]]; //為位選碼
P3=dispbitcode[dispbitcnt]; //為段選碼
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
tcnt++;
if(tcnt==4000) //此時有一秒鍾了(4000*250us)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}
註:至於你說的蜂鳴器,這個很簡單,在程序里設置一個標志位
sbit busy_louder 在硬體連接上採用一個放大器 與單片機的一個引腳相接 即時到60秒時,計時器清零,同時標志位置位,即可~
希望對你有幫助。