单片机电子时钟的设计(期末课程设计)
生活随笔
收集整理的這篇文章主要介紹了
单片机电子时钟的设计(期末课程设计)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:單片機電子時鐘的設計
設計一個時鐘,可以正常顯示時分秒,也可以通過按鍵改變分鐘和小時,且有整點提醒功能
1、能夠正常計時并且能夠顯示小時、分鐘、秒,10分。
(1)正常顯示秒,2分
(2)正常顯示分,2分
(3)正常顯示時,2分
(4)秒進位至分正常,2分
(5)分進位至小時正常,1分
2、可以通過按鍵正常更改小時和分鐘(4個按鍵都要用到),以及蜂鳴器在整點要發出響聲,5分。
(1)實現分鐘正常(更改過程中顯示數字在0-59范圍以內)加減,2分
(2)實現小時正常(更改過程中顯示數字在0-23范圍以內)加減,2分
(3)蜂鳴器在整點會響(提示:單片機P2.3管腳為0時,蜂鳴器會響。為1時則不響),2分?
提問環節:教師提問有關電子時鐘的3個問題,根據學生回答情況給分,每個問題5分,滿分15分。
使用的單片機:
Notes:代碼注釋寫的比較細,便于大家理解。如果是考察課,期末老師提問課程設計,一般會問的很簡單,不會針對某一語或揪著不放的。比如會問你dispNum()那一塊的代碼是實現什么功能的,分鐘60進位是如何實現的等等。
參考代碼:
// hill20200709 #include<reg52.h> //引入頭文件 #include<intrins.h> //左右移函數頭文件 #define uchar unsigned char //變量聲明 #define uint unsigned int //變量聲明sbit key1=P3^4; //按鍵key1聲明 sbit key2=P3^5; //按鍵key2聲明 sbit key3=P3^6; //按鍵key3聲明 sbit key4=P3^7; //按鍵key4聲明sbit buzzer=P2^3; //蜂鳴器聲明sbit DU =P2^6; //位聲明DU sbit WE =P2^7; //位聲明WE uchar num; uchar code table[]={ //數碼管顯示用的數組 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};int s=0; //聲明并初始化 秒 變量 int min=0; //聲明并初始化 分鐘 變量 int h=0; //聲明并初始化 小時 變量void delayms(uint xms) // 延時函數 用于數碼管顯示 {uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }void dispNum(int h, int min, int s){ //數碼管顯示函數 實現小時、分鐘、秒數的顯示int m2 = min/10; //十位int m1 = min%10; //個位int s2 = s/10;int s1 = s%10;int h2 = h/10;int h1 = h%10;DU=1;P0=table[h1];DU=0;WE=1;P0=0xfd; //1111 1101 第2個數碼管 小時個位WE=0;delayms(2);DU=1;P0=table[h2];DU=0;WE=1;P0=0xfe; //1111 1110 第1個數碼管 小時十位WE=0;delayms(2);DU=1;P0=table[m1];DU=0;WE=1;P0=0xf7; //1111 0111 第4個數碼管 分鐘個位WE=0;delayms(2);DU=1;P0=table[m2];DU=0;WE=1;P0=0xfb;//1111 1011 第3個數碼管 分鐘十位WE=0;delayms(2);DU=1;P0=table[s1];DU=0;WE=1;P0=0xdf; //1101 1111 第6個數碼管 秒個位WE=0;delayms(2);DU=1;P0=table[s2];DU=0;WE=1;P0=0xef;//1110 1111 第5個數碼管 秒十位WE=0;delayms(2); }//key函數 實現用按鍵對小時、分鐘調整 void key(){if (key1==0){ //adjust hour -plus 調整小時 加delayms(10); //10msif (key1==0){h++;if(h==24){h=0; //注意是24小時清零}while(!key1); //沒彈起就在空循環里面,所以按下數字顯示不全}}if (key2==0){ //adjust hour -minus 調整小時 減delayms(10); //10msif (key2==0){h--;if(h==-1){h=23;}while(!key2); //沒彈起就在空循環里面,所以按下數字顯示不全}}if (key3==0){ //adjust min -plus 調整分鐘 加delayms(10); //10msif (key3==0){min++;if(min==60){min=0;}while(!key3); //沒彈起就在空循環里面,所以按下數字顯示不全}}if (key4==0){ //adjust min -minus 調整分鐘 減delayms(10); //10msif (key4==0){min--;if(min==-1){min=59;}while(!key4); //沒彈起就在空循環里面,所以按下數字顯示不全}} } void soundTime(int time){ //蜂鳴器的實現函數 參數為蜂鳴器報警的時間buzzer=0; //蜂鳴器開delayms(time);buzzer=1; //蜂鳴器關 }void main() {TMOD=0x01; //TMOD的值表示定時器工作方式選擇TH0=(65536-45872)/256; //數裝入TH0寄存器TL0=(65536-45872)%256; //數裝入TL0寄存器EA=1; //開總中斷ET0=1; //允許定時器0中斷TR0=1; //開始計數while(1) //下面是個死循環,為了讓程序不停地執行{dispNum(h,min,s); //顯示函數key(); //if(num==20) //循環20次為一秒{num=0;s++; //秒加一//soundTime(10);//在此調用檢查函數soundTime() 若蜂鳴器每一秒都響 則函數正常if(s==60){ //秒到60進位s=0;min++; //秒清零 分鐘加一if(min==60){ //分鐘到60進位min=0;h++; //分鐘清零 小時加一soundTime(500); //buzzer 蜂鳴器在分鐘從59到清零的時候 整點報時if(h==24){h=0; //小時滿24清零}}}}}}void T0_time() interrupt 1 //中斷函數 {TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++; }才疏學淺,多多關照!文章內容肯定有不當之處,敬請指出改正。
總結
以上是生活随笔為你收集整理的单片机电子时钟的设计(期末课程设计)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: design compiler基本操作
- 下一篇: 半波对称振子方向图_HFSS:对称振子天