题目一、单片机电子时钟的设计
设计一个时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能
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分。
使用的单片机:
参考代码:
// hill20200709 #include#include //左右移函数头文件 #define uchar unsigned char //变量声明 #define uint unsigned int sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; 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); //P0=0xff; //解决调用其他函数时5号数码管常亮 } //key函数 void key(){ if (key1==0){ //adjust hour -plus delayms(10); //10ms if (key1==0){ h++; if(h==24){ h=0; } while(!key1); //没弹起就在空循环里面,所以按下数字显示不全 } } if (key2==0){ //adjust hour -minus delayms(10); //10ms if (key2==0){ h--; if(h==-1){ h=23; } while(!key2); //没弹起就在空循环里面,所以按下数字显示不全 } } if (key3==0){ //adjust min -plus delayms(10); //10ms if (key3==0){ min++; if(min==60){ min=0; } while(!key3); //没弹起就在空循环里面,所以按下数字显示不全 } } if (key4==0){ //adjust min -minus delayms(10); //10ms if (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) //下面是个死循环,程序里每运行一步TH0和TL0都会增加 { dispNum(h,min,s); key(); if(num==20) { num=0; s++; //soundTime(10); //检查函数 check function if(s==60){ s=0; min++; if(min==60){ min=0; h++; soundTime(500); //buzzer if(h==24){ h=0; } } } } } } void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; num++; }
本人单片机初学者,多多关照!文章内容肯定有不当之处,敬请指出改正。