單片機(jī)-數(shù)字鐘課件_第1頁
單片機(jī)-數(shù)字鐘課件_第2頁
單片機(jī)-數(shù)字鐘課件_第3頁
單片機(jī)-數(shù)字鐘課件_第4頁
單片機(jī)-數(shù)字鐘課件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章數(shù)字鐘系統(tǒng)設(shè)計(jì)本章主要內(nèi)容一目的和要求二設(shè)計(jì)原則三各模塊的設(shè)計(jì)四總調(diào)試和小結(jié)一設(shè)計(jì)目的和要求1目的:(1)掌握單片機(jī)硬件資源的合理運(yùn)用。(2)掌握模塊化程序設(shè)計(jì)的基本方法和設(shè)計(jì)過程。(3)比較匯編語言程序與C語言程序的不同。2要求:芯片:AT89C51;功能:設(shè)計(jì)完成具有計(jì)時(shí)、調(diào)時(shí)、調(diào)鬧多種功能的產(chǎn)品化的電子鐘:上電即開始計(jì)時(shí),用S0實(shí)現(xiàn)設(shè)置/工作狀態(tài)的轉(zhuǎn)換;S1實(shí)現(xiàn)鬧鐘設(shè)置/工作狀態(tài)的轉(zhuǎn)換,S2實(shí)現(xiàn)時(shí)、分、秒的+1調(diào)整。用LED0—LED5實(shí)現(xiàn)時(shí)、分、秒的顯示,修改“時(shí)”時(shí),加到23后“清0”,再加1;修改“分”時(shí),加到59后“清0”,再加1。二設(shè)計(jì)原則

①程序整體結(jié)構(gòu)清晰、簡潔、流程合理,主程序盡可能簡單明了。②各種功能的實(shí)現(xiàn)應(yīng)采用模塊化、子程序化,以便于編制、閱讀、連接、移植、修改和調(diào)試。③對各函數(shù)功能、參數(shù)及返回值類型等要明確,以便于分析調(diào)試。④程序存儲區(qū)、數(shù)據(jù)存儲區(qū)、寄存器區(qū)、位尋址區(qū)、堆棧區(qū)應(yīng)規(guī)劃合理,做到既節(jié)約資源又不會(huì)發(fā)生相互間的沖突。⑤運(yùn)行狀態(tài)標(biāo)志化管理,對各功能程序的運(yùn)行結(jié)果、操作狀態(tài)應(yīng)設(shè)置狀態(tài)標(biāo)志,以便查詢和實(shí)現(xiàn)運(yùn)行控制。*⑥運(yùn)用軟件或軟硬件相結(jié)合等方法抑制干擾,提高系統(tǒng)的抗干擾能力。*⑦必要時(shí)可結(jié)合硬件采取加密措施。數(shù)字鐘程序模塊劃分各模塊對應(yīng)的函數(shù)聲明如下:voiddisplay(unsignedchar*p);//6位LED掃描函數(shù),指針p為顯示數(shù)據(jù)區(qū)首地址unsignedcharkeytest();//測試鍵盤有無鍵按下unsignedcharsearch();//查鍵值函數(shù)voidalarm(); //鬧鐘判斷啟動(dòng)函數(shù)voidftion0(); //時(shí)鐘修改函數(shù)voidftion1(); //鬧鐘修改程序voidcum(); //增1程序voidclock()interrupt1; //中斷函數(shù),該函數(shù)無需聲明C51程序與匯編語言程序變量定義對應(yīng)關(guān)系

C51程序與匯編語言程序變量定義對應(yīng)關(guān)系主程序框圖C51程序源代碼#pragmaSMALL#include"REG51.H"#include"absacc.h"http://********************函數(shù)聲明************************voiddisplay(unsignedchar*p); //6位LED掃描函數(shù),指針p為顯示數(shù)據(jù) 區(qū)首地址unsignedcharkeytest(); //測試鍵盤有無鍵按下unsignedcharsearch(); //鍵盤掃描程序voidalarm();//鬧鐘程序voidftion0();//時(shí)鐘修改程序voidftion1();//鬧鐘修改程序voidcum();//增1程序//******************全局變量定義*******************unsignedcharclockbuf[3]={0,0,0};//存放時(shí)、分、秒的十進(jìn)制數(shù)unsignedcharbellbuf[3]={0,0,0};//存放鬧鐘時(shí)、分、秒的十進(jìn)制數(shù)unsignedcharmsec1,msec2;//msec1:10ms中斷次數(shù),msec2:1s循環(huán)次數(shù)unsignedchartimdata,rtimdata;//時(shí)鐘和鬧鐘修改位置標(biāo)志unsignedcharcount; //鬧鐘啟動(dòng)后10s計(jì)時(shí)單元unsignedchar*dis_p; //顯示緩沖區(qū)指針unsignedcharfcount;//閃爍計(jì)數(shù)單元bitarmbit;//鬧鐘標(biāo)志,armbit=0,鬧鐘沒有設(shè)定;armbit=1,鬧鐘已設(shè)定bitrtimbit;//鬧鐘是否啟動(dòng)標(biāo)志,rtimbit=1,鬧鐘已啟動(dòng)bitrhourbit;//鬧鐘小時(shí)修改標(biāo)志,rhourbit=1,正在修改鬧鐘小時(shí)bitrminbit;//鬧鐘分修改標(biāo)志,rminbit=1,正在修改鬧鐘分鐘bithourbit;//時(shí)鐘小時(shí)修改標(biāo)志,hourbit=1,正在修改時(shí)鐘小時(shí)bitminbit; //時(shí)鐘分修改標(biāo)志,minbit=1,正在修改時(shí)鐘分鐘bitsecbit; //時(shí)鐘秒修改標(biāo)志bitflash;//閃爍標(biāo)志位sbitP10=P1^0;sbitP27=P2^7;//******************主函數(shù)*******************main(){unsignedchara;armbit=0; //清零鬧鐘標(biāo)識位bellbuf[0]=23; //設(shè)置鬧鐘單元初值bellbuf[1]=59;clockbuf[0]=23; //設(shè)置時(shí)鐘單元初值clockbuf[1]=59;clockbuf[2]=59;msec1=0; //設(shè)置10ms中斷次數(shù)初值msec2=0; //設(shè)置1s中斷次數(shù)初值timdata=0; //時(shí)鐘內(nèi)容修改位置記憶單元清零rtimdata=0; //鬧鐘內(nèi)容修改位置記憶單元清零count=0; //鬧鐘啟動(dòng)后保持10s計(jì)時(shí)單元清零fcount=0;//閃爍計(jì)數(shù)單元清零flash=0;//閃爍標(biāo)志位清零

TMOD=0x12;//初始化定時(shí)器,定時(shí)器T0方式2,定時(shí)器T1方式1TL0=0x06; //定時(shí)250μs初始值TH0=0x06;TH1=0X3C;TL1=0XB0;EA=1; //中斷允許控制斷ET0=1; //定時(shí)器0開中斷TR0=1; //啟動(dòng)定時(shí)器0dis_p=clockbuf; //將時(shí)鐘值送入顯示指針dis_p=1;

while(1){a=keytest();if(a==0x07){ //調(diào)用判別鍵入測試程序display(dis_p); //無鍵輸入調(diào)用顯示程序if(armbit==1)alarm();} //判別鬧鐘設(shè)定否,若設(shè)定了,則調(diào)鬧鐘程序else{display(dis_p); //調(diào)用顯示程序作為延時(shí)去抖動(dòng)a=keytest(); if(a!=0x07){ //沒有抖動(dòng),則表示有鍵按下a=search(); //調(diào)用鍵號測試程序switch(a){case0x00:ftion0();break;//若是時(shí)鐘參數(shù)修改功能鍵,則調(diào)用時(shí)鐘修改程序case0x01:ftion1();break;//若是鬧鐘參數(shù)修改功能鍵,則調(diào)用鬧鐘設(shè)定程序case0x02:cum();break; //若是加1功能鍵,則調(diào)用加1修改程序default:break;}}}}}//****************6位LED掃描函數(shù)***************voiddisplay(unsignedchar*p){unsignedcharbuffer[]={0,0,0,0,0,0};unsignedchark,i,j,m,temp;unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0~9的顯示碼buffer[0]=p[0]/10; //將緩沖區(qū)中的數(shù)的十位和個(gè)位分開buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;for(k=0;k<3;k++){temp=0x20;if(flash&secbit) {buffer[4]=10;buffer[5]=10;}if(flash&(minbit|rminbit)) {buffer[2]=10;buffer[3]=10;}if(flash&(hourbit|rhourbit)) {buffer[0]=10;buffer[1]=10;}for(i=0;i<6;i++){j=buffer[i]; P0=led[j]; //B口送段碼P2=temp|0X80; //A口選位temp>>=1;for(m=0;m<50;m++); //每一位顯示延時(shí)P2=0X80;//滅顯示}}}//**************鍵盤測試函數(shù)***************unsignedcharkeytest(){unsignedcharc;P3=0XFF; c=P3;c=c&0x07;return(c);}//**********掃描鍵盤得到鍵值函數(shù)**********unsignedcharsearch(){unsignedchara,b,c,i;P3=0xff;a=P3&0x07;while(1){if(a==0x06){b=0;break;}//有s0鍵按下else{if(a==0x05){b=1;break;}//有s1鍵按下else{if(a==0x03){b=2;break;}//有s2鍵按下}}}

do{display(dis_p);}while((c=keytest())!=0x07);//等待鍵釋放for(i=0;i<10;i++)display(dis_p);//延時(shí)消抖do{display(dis_p);}while((c=keytest())!=0x07);//等待鍵釋放return(b);}//*****************鬧鐘函數(shù)**************voidalarm(){P10=1;if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P10=0;rtimbit=1; //設(shè)置鬧鐘計(jì)時(shí)標(biāo)志,時(shí)鐘將進(jìn)行10s計(jì)時(shí)

if(count==10) //判斷鬧鐘保持10s時(shí)間到否{count=0; //清除鬧鐘保持10s計(jì)時(shí)P10=1; //清除鬧鐘armbit=0; //清鬧鐘標(biāo)識,否則鬧鐘設(shè)置將繼續(xù)保持有效rtimbit=0;}}

}//*******************時(shí)鐘修改函數(shù)*****************//voidftion0(){TR0=0; //關(guān)定時(shí)器rhourbit=0; //禁止鬧鐘時(shí)間參數(shù)修改,清鬧鐘修改標(biāo)識rminbit=0;dis_p=clockbuf; //將時(shí)鐘緩沖區(qū)首地址送顯示指針rtimdata=0; //清鬧鐘修改位置標(biāo)識記錄timdata++; //將時(shí)鐘修改記錄值加1switch(timdata){case0x01:secbit=1;ET1=1;flash=1;TR1=1;break;//若記錄值為1,則將時(shí)鐘秒修改標(biāo)識置1case0x02:secbit=0;minbit=1;break;//若記錄值為2,則將時(shí)鐘分修改標(biāo)識置1case0x03:minbit=0;hourbit=1;break;//若記錄值為3,則將時(shí)鐘時(shí)修改標(biāo)識置1casex04:timdata=0;hourbit=0;flash=0;ET1=0;TR1=0;TR0=1;break;

//若按4次,則清時(shí)鐘單元修改位default:break;}}//******************鬧鐘修改函數(shù)****************voidftion1(){secbit=0; //禁止時(shí)鐘時(shí)間修改minbit=0;hourbit=0;dis_p=bellbuf;//設(shè)置鬧鐘顯示標(biāo)志timdata=0; //清時(shí)鐘修改位置標(biāo)識記錄rtimdata++; //將鬧鐘修改記錄值加1switch(rtimdata){case0x01:rminbit=1;flash=1;ET1=1;TR1=1;break;//若記錄值為1,則將鬧鐘分修改標(biāo)識置1case0x02:rminbit=0;rhourbit=1;break; //若記錄值為2,則將時(shí)鐘分修改標(biāo)識置1case0x03:{rtimdata=0;rhourbit=0;//若按3次,則清鬧鐘單元修改位置記錄flash=0;ET1=0;TR1=0;armbit=1; //設(shè)置鬧鐘已設(shè)定標(biāo)志位dis_p=clockbuf; //恢復(fù)時(shí)鐘顯示標(biāo)志break;}default:break;}}//******************增1函數(shù)******************voidcum(){if(secbit==1){//若時(shí)鐘秒修改標(biāo)識為1,則秒單元內(nèi)容加1if(clockbuf[2]==59)clockbuf[2]=0;elseclockbuf[2]++;}else{if(minbit==1){//若時(shí)鐘分修改標(biāo)識為1,則分單元加1if(clockbuf[1]==59)clockbuf[1]=0;elseclockbuf[1]++;}else{if(hourbit==1){//若時(shí)鐘小時(shí)修改標(biāo)識為1,則小時(shí)單元內(nèi)容加1if(clockbuf[0]==23)clockbuf[0]=0;elseclockbuf[0]++;}else{if(rminbit==1){//若鬧鐘分修改標(biāo)識為1,則分單元加1if(bellbuf[1]==59)bellbuf[1]=0;elsebellbuf[1]++;}else{if(rhourbit==1){//若鬧鐘小時(shí)修改標(biāo)識為1,則小時(shí)單元加1if(bellbuf[0]==23)bellbuf[0]=0;elseb

溫馨提示

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

最新文檔

評論

0/150

提交評論