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