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秒时,计时器清零,同时标志位置位,即可~
希望对你有帮助。