单片机电子时钟的设计(期末课程设计)
题目:单片机电子时钟的设计
设计一个时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能
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 }
本人单片机初学者,多多关照!文章内容肯定有不当之处,敬请指出改正。