51开发板独立按键调节时钟的应用实验、可以使用独立按键进行时间的调节(可对时间重新自定义)

实验原理:

参照实验二数码管的电路原理图,利用数码管的显示原理以及定时器的工作原理,结合按键的应用,编程实现数码管显示时钟,并具有时钟调节功能。

实验内容:

利用所学的单片机定时器中断知识及电路知识,通过单片机编程控制数码管显示时钟,并具有调节时钟的功能。利用定时器中断的知识,通过编程控制数码管显示时钟,显示格式为 XX—XX—XX,分别为小时、分钟、秒,并将矩阵键盘的第二行的前三个按键设置为独立按键,第一个按键控制调节时钟的小时、分钟、秒,第二个按键控制调节小时、分钟、秒的加,第三个按键控制调节小时、分钟、秒的减。

实验代码:

#include<REGX52.h>
typedef unsigned char uchar;
//共阴极段码
uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
 
char s=56,m=59,h=23;
int n;
//延时函数
void Delay(unsigned int xms){
	unsigned char i, j;
	while(xms--){
		i = 2;
		j = 239;
		do{
			while (--j);
		} while (--i);
	}
}
void init(){
	TMOD=0x01;//定时器 0 的方式 1,定时 4ms 0000 0001
	TH0=(65536-4000)/256;
	TL0=(65536-4000)%256;
	ET0=1;      //小开关
	EA=1;        //总开关
	TR0=1;  //启动定时器
}
 
void display(uchar hour,uchar minute,uchar second){
    int i;
    for(i=1;i<=8;i++){
        switch(i){
           case 1: P2_4=0;P2_3=0;P2_2=0;P0=leddata[second%10];break;
           case 2: P2_4=0;P2_3=0;P2_2=1;P0=leddata[second/10];break;
           case 3: P2_4=0;P2_3=1;P2_2=0;P0=0x40;break;//显示  —
           case 4: P2_4=0;P2_3=1;P2_2=1;P0=leddata[minute%10];break;
           case 5: P2_4=1;P2_3=0;P2_2=0;P0=leddata[minute/10];break;
           case 6: P2_4=1;P2_3=0;P2_2=1;P0=0x40;break;//显示  —
           case 7: P2_4=1;P2_3=1;P2_2=0;P0=leddata[hour%10];break;
           case 8: P2_4=1;P2_3=1;P2_2=1;P0=leddata[hour/10];break;
        }
        Delay(1);
        P0=0;        //消影
    }
}
 
void key_scan(){
 
    static uchar flag=0;
    if(P3_1==0){
        Delay(20);
        while(P3_1==0)
        /*display(h,m,s)*/;
        Delay(20);
        TR0=0;//关闭中断请求
        flag++;
        if(flag==4){
           flag=0;
            TR0=1;
            }
    }
        
    if(flag!=0){
 
        switch(flag){
            case 1:if(P3_0==0){ Delay(20);while(P3_0==0)display(h,m,s);Delay(20);h++; if(h>23) h=0;}break;
            case 2:if(P3_0==0){ Delay(20);while(P3_0==0)display(h,m,s);Delay(20);m++; if(m>59) m=0;}break;
            case 3:if(P3_0==0){ Delay(20);while(P3_0==0)display(h,m,s);Delay(20);s++; if(s>59) s=0;}break;
            default:break;
        }
        switch(flag){
            case 1:if(P3_2==0){ Delay(20);while(P3_2==0)display(h,m,s);Delay(20);h--; if(h<0) h=23;}break;
            case 2:if(P3_2==0){ Delay(20);while(P3_2==0)display(h,m,s);Delay(20);m--; if(m<0) m=59;}break;
            case 3:if(P3_2==0){ Delay(20);while(P3_2==0)display(h,m,s);Delay(20);s--; if(s<0) s=59;}break;
            default:break;
        }
    }
}
void main(){
 
    init();
    while(1){
        display(h,m,s);
        key_scan();       
    } 
}
//4毫秒的定时器中断
void timer0() interrupt 1
{
    TH0=(65536-4000)/256;
    TL0=(65536-4000)%256;
    n++;
    if(n==250)
    {
        n=0;
        s++;
        if(s>=60)
        {
            s=0;
            m++;
           if(m>=60)
            {
                m=0;
                h++;
                if(h>=24)
                h=0;
            } 
        } 
    } 
}
  

主流程图:

529e0083615b4ab495efebd5dabf0df0.png

仿真电路图:

24eb46ecd191414caa2f494b97ca42c3.png

开发板电路:

d1ea79b9b5314e568744e71b620c6867.png

实验效果图:

64acbe09721b454d8eac2900ac14e865.gif

按键K1 效果(有四个档位,按第一次时暂停,并选中“时”,按第二次选中”分“,按第三次选中”分“

,第四次按下结束暂停,继续计时)

6fb8b30a2e9c4a5485c85fb4cd73370c.gif

 按键K2、K3效果:(K2按下被选中的“时分秒”被加一;K3按下被选中的“时分秒”被减一)

ec8cff73553e44c8bd12f49b71959eac.gif

猜你喜欢

转载自blog.csdn.net/yvge669/article/details/124924965