題目:單片機電子時鍾的設計
設計一個時鍾,可以正常顯示時分秒,也可以通過按鍵改變分鍾和小時,且有整點提醒功能
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 }
本人單片機初學者,多多關照!文章內容肯定有不當之處,敬請指出改正。