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

简介: 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;
            } 
        } 
    } 
}

主流程图:

仿真电路图:

开发板电路:

实验效果图:

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

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

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

相关文章
|
SQL Java 数据库连接
【MyBatis】入门IDEA搭建
MyBatis是一个,它提供了一种。它的主要作用是将Java对象与数据库表之间进行映射,使开发者可以通过面向对象的方式操作数据库,而。MyBatis是一个orm框架。
51开发板同一程序实现数码管实现时钟显示、秒表计时。通过独立按键选择模式(时钟/秒表)、时间的重定义
51开发板同一程序实现数码管实现时钟显示、秒表计时。通过独立按键选择模式(时钟/秒表)、时间的重定义
349 3
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
【51单片机】独立按键,每个按键不同功能,数码管数值的加减,控制流水灯模式,包含按键消抖,数码显示,流水灯
805 1
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
543 0
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
392 3
51单片机的延时函数快速生成技巧
51单片机的延时函数快速生成技巧
534 1
|
人工智能 C语言
【51单片机】让AI识别电路图,帮你进行编码(以51单片机为例)
【51单片机】让AI识别电路图,帮你进行编码(以51单片机为例)
957 0
|
存储 编译器
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
|
网络协议 安全 网络安全
原始套接字-SOCK_RAW
原始套接字-SOCK_RAW