設(shè)計(jì)報(bào)告,pcb,源碼等所有資料打包下載:
帶LCD顯示的定時(shí)鬧鐘.zip
(1.08 MB, 下載次數(shù): 133)
2016-9-27 16:16 上傳
點(diǎn)擊文件名下載附件
------------------------------------------------------------------------
.系統(tǒng)調(diào)試過(guò)程通過(guò)上面的硬件設(shè)計(jì)和軟件設(shè)計(jì)過(guò)程,設(shè)計(jì)的工作已經(jīng)基本完成,接下來(lái)的工作就是對(duì)所設(shè)計(jì)好的應(yīng)用系統(tǒng)進(jìn)行調(diào)試。通過(guò)調(diào)試可以檢查出系統(tǒng)出現(xiàn)的一些錯(cuò)誤,從而進(jìn)行下一步的修改。 (1)在Protel 99 SE中,對(duì)硬件電路圖進(jìn)行ERC電氣規(guī)則檢查。
圖 5-1 protel原理圖
圖5-2 ERC電氣規(guī)則檢查結(jié)果 圖5-3 PCB圖 (2)程序調(diào)試 程序經(jīng)過(guò)調(diào)試顯示“0錯(cuò)誤,0警告”。表示程序調(diào)試通過(guò)。
圖5-3 程序調(diào)試通過(guò)示意圖 (3)protues調(diào)試 圖5-4 protues仿真圖 結(jié) 論 單片機(jī)是一門應(yīng)用性很強(qiáng)的學(xué)科,課程設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)我們實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程。雖然在做課程設(shè)計(jì)以前已經(jīng)系統(tǒng)的把單片機(jī)課本認(rèn)真的學(xué)習(xí)了一下,但是在剛拿到設(shè)計(jì)任務(wù)書(shū)時(shí)還是有點(diǎn)一頭霧水,不知道該從哪里下手。令人欣慰的是經(jīng)過(guò)一周的學(xué)習(xí),雖然過(guò)程很艱辛,但是總算實(shí)現(xiàn)了定時(shí)鬧鐘的功能,所有的努力都很值得。這一周的大部分時(shí)間都在研究程序怎么處理,在這個(gè)過(guò)程中加深了我對(duì)匯編語(yǔ)言命令的應(yīng)用,而且也更加了解到軟硬件配套的重要性。 通過(guò)這次課程設(shè)計(jì),使我們對(duì)這們功課有了更深刻的認(rèn)識(shí)和了解。首先對(duì)于硬件電路的工作原理有了進(jìn)一步系統(tǒng)的學(xué)習(xí),同樣就有了進(jìn)一步的認(rèn)識(shí),使我懂得了理論與實(shí)際相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),才能提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。其次軟件在這次設(shè)計(jì)中也有不足之處,比如音樂(lè)的響聲不連續(xù),但又不知道從哪個(gè)地方入手解決這個(gè)問(wèn)題,這要求在以后的學(xué)習(xí)中,拓寬自己的知識(shí)面,解決設(shè)計(jì)的不足之處。 總之,通過(guò)這次課程設(shè)計(jì)不僅使我鞏固了本課程所學(xué)的基本知識(shí),還使我們具有了撰寫(xiě)科研報(bào)告的初步訓(xùn)練能力,我相信這些能力在我們以后的工作或者是再學(xué)習(xí)中一定會(huì)起到不小的作用,一切的辛苦和艱難都是值得的。 。 致 謝在陳飛老師的指導(dǎo)下,我完成了本次設(shè)計(jì)。本設(shè)計(jì)從選題到完成,都得到了陳老師細(xì)心的指導(dǎo)。另外,本設(shè)計(jì)的完成也離不開(kāi)其他老師和各位同學(xué)給我的建議和幫助,是他們讓我明白了團(tuán)隊(duì)合作的精神。當(dāng)然,這之中也有我自己的努力。這次課程設(shè)計(jì)最令我高興的是:遇到困難,翻閱書(shū)本解決困難的同時(shí)鞏固了已學(xué)知識(shí),也學(xué)到了新知識(shí)。在此,我謹(jǐn)向陳飛老師和幫助過(guò)我的老師和同學(xué)們,表示崇高的敬意和衷心的感謝!
源程序:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uint miao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N; //K1num-K1按鍵被按下的標(biāo)記變量,K2num-K2按鍵被按下的標(biāo)記變量,K3num=0-K3按鍵被按下的標(biāo)記變量
- uchar code table[]=" TIMING CLOCK"; //定義初始上電時(shí)液晶默認(rèn)顯示狀態(tài)
-
- sbit K1=P1^0; //四個(gè)按鍵
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit rs=P2^0;
- sbit lcden=P2^2;
- sbit led=P2^3; //發(fā)光二極管控制端
- sbit beep=P2^4; //蜂鳴器控制端
- sbit relay=P2^5; //繼電器控制端
- void delay(uint z) //延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //液晶寫(xiě)命令函數(shù)
- {
- rs=0;
- lcden=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date) //液晶寫(xiě)數(shù)據(jù)函數(shù)
- {
- rs=1;
- lcden=0;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_sfm(uchar add,uchar date) //液晶寫(xiě)時(shí)分秒函數(shù)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void init() //初始化函數(shù)
- {
- uint num; //寫(xiě)液晶的循環(huán)控制變量
- aa=0; //中斷次數(shù)標(biāo)志
- K1num=0; //K1按鍵被按下的標(biāo)記變量
- K2num=0; //K2按鍵被按下的標(biāo)記變量
- K3num=0; //K3按鍵被按下的標(biāo)記變量
- K4num=0;
- flag1=1; //控制lcd屏刷新的變量
- flag2=1; //控制鬧鐘響鬧和繼電器開(kāi)啟關(guān)閉的標(biāo)記
- flag3=1; //控制鬧鐘響起時(shí),按下K4停止鬧鐘響鬧的標(biāo)記
- led=1; //發(fā)光二極管初始化
- relay=0; //繼電器初始化
- N=100; //系統(tǒng)啟動(dòng)時(shí),鬧鐘時(shí)間到發(fā)出的聲音為連續(xù)三次發(fā)出“嘩”的一聲
- miao=0; //系統(tǒng)初始化時(shí)間
- fen=0;
- shi=0;
- fen1=1; //初始化鬧鐘的時(shí)間
- shi1=0;
- beep=0; //蜂鳴器初始化
- lcden=0; //液晶使能端初始化
- write_com(0x38); //1602液晶初始化,設(shè)置16*2顯示。5*7點(diǎn)陣,8位數(shù)據(jù)接口
- write_com(0x0c); //設(shè)置開(kāi)顯示,不顯示光標(biāo)
- write_com(0x06); //寫(xiě)一個(gè)字符后地址指針自動(dòng)加1
- write_com(0x01); //顯示清0,數(shù)據(jù)指針清0
- write_com(0x80); //將數(shù)據(jù)指針定位到第一行,第一個(gè)字處
- for(num=0;num<15;num++) //顯示鬧鐘標(biāo)示:TIMING CLOCK
- {
- write_date(table[num]);
- delay(10);
- }
- write_com(0x80+0x40+7);//寫(xiě)出時(shí)間顯示部分的兩個(gè)冒號(hào)
- write_date(':');
- write_sfm(8,fen); //送去液晶顯示秒,分,時(shí)
- write_sfm(5,shi);
- TMOD=0x01; //設(shè)置定時(shí)器0為工作方式1
- TH0=(65536-50000)/256; //定時(shí)器裝初值
- TL0=(65536-50000)%256;
- EA=1; //開(kāi)總中斷
- ET0=1; //開(kāi)定時(shí)器0中斷
- TR0=1; //啟動(dòng)定時(shí)器0
- }
- void keyscan() //鍵盤掃描函數(shù)
- {
- if(K1==0&&K3num==0) //判斷K1按下,按下前沒(méi)有按下K3鍵,則開(kāi)始修改時(shí)間
- {
- delay(5);
- if(K1==0&&K1num==0)
- {
-
- K1num=1;
- while(!K1) //判斷是否松開(kāi)按鍵,后同
- if(K1num==1)
- {
- TR0=0; //關(guān)閉計(jì)數(shù)器0
- write_com(0x80+0x40+9); //第一次按下光標(biāo)定位到分鐘位置
- write_com(0x0f); //光標(biāo)開(kāi)始閃爍
- }
- }
- }
- if(K3==0&&K3num==0&&K1num==0) //判斷K3首次被按下,則設(shè)置鬧鐘
- {
- delay(5); //延時(shí)消抖,后同
- if(K3==0)
- {
- flag1=0;
- write_com(0x80+0x40+9); //第一次按下光標(biāo)定位到分鐘位置
- while(!K3);
- K3num=1;
- write_sfm(8,fen1); //送去液晶顯示定時(shí)的分,時(shí)
- write_sfm(5,shi1);
- write_com(0x0f); //光標(biāo)開(kāi)始閃爍
- write_com(0x80+0x40+9); //顯示位置回到調(diào)節(jié)處
- }
- }
- if(K1==0&&K1num==1) //判斷K1按下,修改系統(tǒng)時(shí)間的小時(shí)
- {
- delay(5);
- if(K1==0)
- {
- write_com(0x80+0x40+6); //光標(biāo)定位到小時(shí)位置
- K1num=1; //置K1num=1
- while(!K1);
- shi++; //則調(diào)整時(shí)加1
- if(shi==24) shi=0; //若滿24后將清零
- write_sfm(5,shi); //每調(diào)節(jié)一次送液晶顯示一下
- write_com(0x80+0x40+6); //顯示位置重新回到調(diào)節(jié)處
- }
-
- }
-
-
- if(K2==0&&K1num==1) //判K2按下,修改系統(tǒng)時(shí)間的分鐘
- {
- delay(5);
- if(K2==0)
- {
- write_com(0x80+0x40+9); //光標(biāo)定位到分鐘位置
- K1num=1;
- while(!K2);
- fen++; //則調(diào)整分加1
- if(fen==60) fen=0;//若滿60后將清零
- write_sfm(8,fen); //每調(diào)節(jié)一次送液晶顯示一下
- write_com(0x80+0x40+9); //顯示位置重新回到調(diào)節(jié)處
- }
- }
- if(K1num==1||K3num==1) //當(dāng)設(shè)置時(shí)間或鬧鐘時(shí),K3被按下設(shè)置完成。
- {
- if(K3==0) //判斷K3按下
- {
- delay(5);
- if(K3==0)
- {
- K1num=0;
- K3num=0;
- while(!K3);
- write_com(0x0c); //取消光標(biāo)閃
- TR0=1; //啟動(dòng)定時(shí)器使時(shí)鐘開(kāi)始走
- flag1=1; //flag=1.則修改系統(tǒng)時(shí)間時(shí)液晶顯示的系統(tǒng)時(shí)間值,flag=0,則為修改鬧鐘時(shí)間時(shí),屏幕顯示的是修改鬧鐘時(shí)間的值
- write_sfm(8,fen);//送去液晶顯示分,時(shí)
- write_sfm(5,shi);
- }
- }
- }
- if(K2==0&&K1num==0&&K3num==0) //K2被按下時(shí)顯示定時(shí)時(shí)間
- {
- delay(5);
- if(K2==0)
- {
- write_sfm(8,fen1); //送去液晶顯示定時(shí)的分,時(shí)
- write_sfm(5,shi1);
- while(!K2);
- write_sfm(8,fen); //K2松開(kāi)顯示當(dāng)前時(shí)間
- write_sfm(5,shi);
- }
- }
- if(K1==0&&K3num==1) //修改小時(shí),判斷K1鍵按下,K3num=1,表示K3按鍵按下,則此時(shí)修改的是鬧鐘時(shí)間的小時(shí)
- {
- delay(5);
- if(K1==0)
- {
- write_com(0x80+0x40+6); //光標(biāo)定位到小時(shí)位置
- K3num=1;
- while(!K1);
- shi1++; //則調(diào)整定時(shí)的時(shí)加1
- if(shi1==24) //若滿24后將清零
- shi1=0;
- write_sfm(5,shi1); //每調(diào)節(jié)一次送液晶顯示一下
- write_com(0x80+0x40+6); //顯示位置重新回到調(diào)節(jié)處
- }
- }
-
- if(K2==0&&K3num==1) //卸螷2按下,修改鬧鐘時(shí)間的分鐘
- {
- delay(5);
- if(K2==0)
- {
- write_com(0x80+0x40+9); //光標(biāo)定位到分鐘位置
- K3num=1;
- while(!K2);
- fen1++; //則調(diào)整分加1
- if(fen1==60) //若滿60后將清零
- fen1=0;
- write_sfm(8,fen1); //每調(diào)節(jié)一次送液晶顯示一下
- write_com(0x80+0x40+9); //顯示位置重新回到調(diào)節(jié)處
- }
- }
-
- if(K4==0&&flag3==0) //當(dāng)鬧鐘響起時(shí),按下K4停止響鬧,當(dāng)鬧鐘響起時(shí)候flag3置為1
- {
- delay(5);
- if(K4==0)
- {
- flag2=0;
- flag3=1; //此處需置flag3為1,否則鬧鐘沒(méi)有響起的時(shí)候按下K4鍵,程序會(huì)執(zhí)行此句
- }
- }
- if(K4==0&&flag3==1&&K4num==0) //K4按下設(shè)置鬧鐘的狀態(tài)為ON或OFF,flag3=1,表示鬧鐘此時(shí)沒(méi)響起。K4num==0,表示此時(shí)為ON狀態(tài)。
- {
- delay(5);
- {
- K4num=1;
- }
- }
- if(K4==0&&flag3==1&&K4num==1) //K4按下設(shè)置鬧鐘的狀態(tài)為ON或OFF,flag3=1,表示鬧鐘此時(shí)沒(méi)響起。K4num==1,表示此時(shí)為OFF狀態(tài)。
- {
- delay(5);
- {
- K4num=0;
- }
- }
- }
- void clock() // 鬧鐘函數(shù) K4—鬧鈴ON/OFF的狀態(tài)設(shè)置,設(shè)置為ON時(shí)連續(xù)三次發(fā)出“嘩”的一聲,設(shè)置為OFF發(fā)出“嘩”的一?
- {
- if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==0)) //鬧鐘的響鬧控制
- {
- beep=1; //此時(shí)鬧鐘響起,連續(xù)三次發(fā)出嘩的一聲
- relay=1; //鬧鐘時(shí)間到,則繼電器啟動(dòng)
- flag3=0; //置flag3=0,表示此時(shí)鬧鐘響起,按下K4鍵執(zhí)行停止鬧鐘響鬧語(yǔ)句
- delay(100); //這些語(yǔ)句是為了使鬧鐘響起時(shí),發(fā)出連續(xù)三次嘩的聲音
- beep=0;
- delay(100);
- beep=1;
- delay(100);
- beep=0;
- delay(100);
- beep=1;
- delay(100);
- beep=0;
- delay(300);
- }
- else if((fen==fen1)&&(shi==shi1)&&(flag2==1)&&(K4num==1)) //鬧鐘的響鬧控制
- {
- beep=1; //此時(shí)鬧鐘響起,發(fā)出嘩的一聲
- relay=1; //鬧鐘時(shí)間到,則繼電器啟動(dòng)
- flag3=0; //置flag3=0,表示此時(shí)鬧鐘響起,按下K4鍵執(zhí)行停止鬧鐘響鬧語(yǔ)句
- }
- else
- {
- beep=0;
- relay=0;
- }
- }
- void main() //主函數(shù)
- {
-
- init();//初始化子程序
- while(1)
- {
- keyscan();
- clock();
- }
- }
- void time0() interrupt 1 //定時(shí)器0中斷服務(wù)程序
- {
- TH0=(65536-50000)/256; //定時(shí)器重新裝入數(shù)值
- TL0=(65536-50000)%256;
- aa++; //中斷次數(shù)累加
- if(aa==20) //20次50毫秒為1秒
- {
- aa=0;
- miao++;
- led=~led;
- if(miao==60)
- {
- miao=0;
- fen++;
- flag2=1;//鬧鐘響起時(shí)按下K4鍵鬧鐘關(guān)閉,此處應(yīng)重置該變量,使下一次鬧鐘時(shí)間來(lái)到時(shí),鬧鐘仍然可以響起
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- if(flag1==1)
- {write_sfm(5,shi);} //小時(shí)發(fā)生變化則立即吸入屏幕顯示
- }
- if(flag1==1)
- {write_sfm(8,fen);} //分鐘發(fā)生變化則立即吸入屏幕顯示
- }
-
- }
- }
復(fù)制代碼
|