單片機電子時鍾的設計(期末課程設計)


題目:單片機電子時鍾的設計

設計一個時鍾,可以正常顯示時分秒,也可以通過按鍵改變分鍾和小時,且有整點提醒功能

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

使用的單片機:

參考代碼:

  1 // hill20200709
  2 #include<reg52.h> //引入頭文件
  3 #include<intrins.h> //左右移函數頭文件
  4 #define uchar unsigned char //變量聲明
  5 #define uint unsigned int //變量聲明
  6 
  7 sbit key1=P3^4; //按鍵key1聲明
  8 sbit key2=P3^5; //按鍵key2聲明
  9 sbit key3=P3^6; //按鍵key3聲明
 10 sbit key4=P3^7; //按鍵key4聲明
 11 
 12 sbit buzzer=P2^3;  //蜂鳴器聲明
 13 
 14 sbit DU =P2^6;     //位聲明DU
 15 sbit WE =P2^7;  //位聲明WE
 16 uchar num;
 17 uchar code table[]={ //數碼管顯示用的數組
 18 0x3f,0x06,0x5b,0x4f,
 19 0x66,0x6d,0x7d,0x07,
 20 0x7f,0x6f,0x77,0x7c,
 21 0x39,0x5e,0x79,0x71};
 22 
 23 int s=0;  //聲明並初始化 秒 變量
 24 int min=0; //聲明並初始化 分鍾 變量
 25 int h=0; //聲明並初始化 小時 變量
 26 
 27 void delayms(uint xms) // 延時函數  用於數碼管顯示
 28 {
 29     uint i,j;
 30     for(i=xms;i>0;i--)    
 31         for(j=110;j>0;j--);
 32 }
 33 
 34 void dispNum(int h, int min, int s){ //數碼管顯示函數 實現小時、分鍾、秒數的顯示
 35     int m2 = min/10; //十位
 36     int m1 = min%10; //個位
 37     
 38     int s2 = s/10;
 39     int s1 = s%10;
 40 
 41     int h2 = h/10;
 42     int h1 = h%10;
 43     
 44     DU=1;
 45     P0=table[h1];
 46     DU=0;
 47     WE=1;
 48     P0=0xfd;  //1111 1101 第2個數碼管 小時個位
 49     WE=0;
 50     delayms(2);
 51 
 52     DU=1;
 53     P0=table[h2];
 54     DU=0;
 55     WE=1;
 56     P0=0xfe;  //1111 1110 第1個數碼管 小時十位
 57     WE=0;
 58     delayms(2);
 59 
 60     DU=1;
 61     P0=table[m1];
 62     DU=0;
 63     WE=1;
 64     P0=0xf7;  //1111 0111 第4個數碼管 分鍾個位
 65     WE=0;
 66     delayms(2);
 67     
 68     DU=1;
 69     P0=table[m2];
 70     DU=0;
 71     WE=1;
 72     P0=0xfb;//1111 1011 第3個數碼管 分鍾十位
 73     WE=0;
 74     delayms(2);
 75     
 76     
 77     DU=1;
 78     P0=table[s1];
 79     DU=0;
 80     WE=1;
 81     P0=0xdf;  //1101 1111 第6個數碼管 秒個位
 82     WE=0;
 83     delayms(2);
 84     
 85     DU=1;
 86     P0=table[s2];  
 87     DU=0;
 88     WE=1;
 89     P0=0xef;//1110 1111 第5個數碼管 秒十位
 90     WE=0;
 91     delayms(2);
 92 }
 93 
 94 //key函數 實現用按鍵對小時、分鍾調整
 95 void key(){
 96     if (key1==0){  //adjust hour -plus 調整小時 加
 97         delayms(10); //10ms
 98         if (key1==0){
 99             h++;
100             if(h==24){
101             h=0; //注意是24小時清零
102             }
103         while(!key1); //沒彈起就在空循環里面,所以按下數字顯示不全
104         }
105     }
106     
107     if (key2==0){ //adjust hour -minus 調整小時 減
108         delayms(10); //10ms
109         if (key2==0){
110             h--;
111             if(h==-1){
112             h=23;
113             }
114         while(!key2); //沒彈起就在空循環里面,所以按下數字顯示不全
115         }
116     }
117         if (key3==0){ //adjust min -plus 調整分鍾 加
118         delayms(10); //10ms
119         if (key3==0){
120             min++;
121             if(min==60){
122             min=0;
123             }
124         while(!key3); //沒彈起就在空循環里面,所以按下數字顯示不全
125         }
126     }
127 
128 
129         if (key4==0){ //adjust min -minus 調整分鍾 減
130         delayms(10); //10ms
131         if (key4==0){
132             min--;
133             if(min==-1){
134             min=59;
135             }
136         while(!key4); //沒彈起就在空循環里面,所以按下數字顯示不全
137         }
138     }
139 }
140 void soundTime(int time){ //蜂鳴器的實現函數 參數為蜂鳴器報警的時間
141     buzzer=0; //蜂鳴器開
142     delayms(time);
143     buzzer=1; //蜂鳴器關
144 }
145 
146 void main()
147 {
148 
149     TMOD=0x01;  //TMOD的值表示定時器工作方式選擇
150     TH0=(65536-45872)/256; //數裝入TH0寄存器
151     TL0=(65536-45872)%256; //數裝入TL0寄存器
152     EA=1;  //開總中斷
153     ET0=1; //允許定時器0中斷
154     TR0=1; //開始計數
155 
156     while(1) //下面是個死循環,為了讓程序不停地執行
157     {
158         dispNum(h,min,s); //顯示函數
159         key(); //
160         if(num==20) //循環20次為一秒
161         {
162             num=0;
163             s++;  //秒加一
164             //soundTime(10);  
165             //在此調用檢查函數soundTime()  若蜂鳴器每一秒都響 則函數正常
166             if(s==60){  //秒到60進位
167                 s=0;
168                 min++;  //秒清零 分鍾加一
169                 if(min==60){ //分鍾到60進位
170                     min=0;
171                     h++;  //分鍾清零 小時加一
172                     soundTime(500); //buzzer 蜂鳴器在分鍾從59到清零的時候 整點報時
173                     if(h==24){ 
174                         h=0;  //小時滿24清零
175                     }
176                 }
177             }    
178         }
179     }
180 
181 
182 
183 }
184 
185 void T0_time() interrupt 1 //中斷函數
186 {
187     TH0=(65536-45872)/256;
188     TL0=(65536-45872)%256;
189     num++;
190 }

 

本人單片機初學者,多多關照!文章內容肯定有不當之處,敬請指出改正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM