单片机电子时钟的设计(期末课程设计)

2023-10-27

题目:单片机电子时钟的设计

设计一个时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能

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

使用的单片机:

Notes:代码注释写的比较细,便于大家理解。如果是考察课,期末老师提问课程设计,一般会问的很简单,不会针对某一语或揪着不放的。比如会问你dispNum()那一块的代码是实现什么功能的,分钟60进位是如何实现的等等。

参考代码:

// hill20200709
#include<reg52.h> //引入头文件
#include<intrins.h> //左右移函数头文件
#define uchar unsigned char //变量声明
#define uint unsigned int //变量声明

sbit key1=P3^4; //按键key1声明
sbit key2=P3^5; //按键key2声明
sbit key3=P3^6; //按键key3声明
sbit key4=P3^7; //按键key4声明

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);
}

//key函数 实现用按键对小时、分钟调整
void key(){
    if (key1==0){  //adjust hour -plus 调整小时 加
        delayms(10); //10ms
        if (key1==0){
            h++;
            if(h==24){
            h=0; //注意是24小时清零
            }
        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) //下面是个死循环,为了让程序不停地执行
    {
        dispNum(h,min,s); //显示函数
        key(); //
        if(num==20) //循环20次为一秒
        {
            num=0;
            s++;  //秒加一
            //soundTime(10);
            //在此调用检查函数soundTime()  若蜂鸣器每一秒都响 则函数正常
            if(s==60){  //秒到60进位
                s=0;
                min++;  //秒清零 分钟加一
                if(min==60){ //分钟到60进位
                    min=0;
                    h++;  //分钟清零 小时加一
                    soundTime(500); //buzzer 蜂鸣器在分钟从59到清零的时候 整点报时
                    if(h==24){
                        h=0;  //小时满24清零
                    }
                }
            }
        }
    }



}

void T0_time() interrupt 1 //中断函数
{
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    num++;
}

才疏学浅,多多关照!文章内容肯定有不当之处,敬请指出改正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机电子时钟的设计(期末课程设计) 的相关文章

  • mysql将一张表插入到另一张表

    1 表1和表2的字段完全相同且要把表2所有的数据都插入到表1 可以用这种方法 insert into table1 select from table2 2 但是更多的时候我们只希望导入指定字段 可以用这种方法 insert into ta
  • 冯思远:Apache TVM 与机器学习编译发展

    下午好 欢迎大家今天来参加 2023 Meet TVM 作为 Apache TVM PMC 由我来给大家做关于 TVM 的发展以及 TVM 未来 Unity 框架的分享 Apache TVM Evolution 首先为什么会有 MLC Ma

随机推荐

  • 双指针算法模板及例题

    双指针算法时间复杂度O n 一般双指针算法运用于有序的某一个或两个序列中 从O n2 优化到O n 算法模板 for int i 0 j 0 i lt n i while j lt i check i j j 具体问题的逻辑 常见问题分类
  • stm32 mpu6050 cubemx 卡尔曼滤波法读取角度

    文章目录 前言 一 cubemx配置 二 mpu6050文件移植 mpu6050 c mpu6050 h 三 主函数 前言 本文简述使用mpu6050读取原始数据后解算出角度 网上大多都是dmp库来解算 但是这种情况操作起来相对复杂 更方便
  • electron入门案例

    目录解构 main js 主进程文件 用来控制整个应用程序 仅有一个 index html 渲染模板 render index js 渲染进程文件 用来控制页面的渲染 可有多个 package json 依赖包 主进程代码 在electro
  • 四. ZooKeeper 作为 SpringCloud 注册中心配置

    目录 一 简单概述 二 配置服务注册到 ZooKeeper 1 服务提供方 yml 文件配置注册到 ZooKeeper 2 服务消费方 yml 文件配置注册到 ZooKeeper 3 服务消费方配置 RestTemplate 注入到容器中
  • 【JAVA】我们常常谈到的方法是指什么?

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 方法 方法的分类 方法的定义 方法调用 方法重载 前言 在之前的文章中我们总是会介绍到类中的各式各样的方法 也许在应用中我们对它已经有了初步的了解 今天我们就来详细的介绍一下 方法
  • 经典卷积神经网络(CNN)图像分类算法详解

    本文原创 转载请引用 https blog csdn net dan teng article details 87192430 CNN图像分类网络 一点废话 CNN网络主要特点是使用卷积层 这其实是模拟了人的视觉神经 单个神经元只能对某种
  • QT获取一些机器相关信息的方法

    获取机器码的方法 按照注释传入相应的参数 即可获得对应的码 获取cpu名称 wmic cpu get Name 获取cpu核心数 wmic cpu get NumberOfCores 获取cpu线程数 wmic cpu get Number
  • 手把手教你对接快手小店开发者商家应用

    不懂就问 什么是快手小店 A 快手小店是快手电商于2018年6月推出的 后续以京东作为供应链 在短视频 直播中打开电商的新纪元 与其可以同态竞技的有抖音小店 以及淘宝直播 那么 要对接快手小店的接口 就需要申请快手开发者 在开发者账户内新建
  • 【Vue入门】语法 —— 插值、指令、过滤器、计算属性、监听器

    目录 一 模版语法 1 1 插值 1 1 1 文本 1 1 2 html解析 1 1 3 属性 1 1 4 表达式 1 2 指令 1 2 1 核心指令 1 2 3 动态参数 二 过滤器 2 1 局部过滤器 2 2 全局过滤器 三 计算属性
  • CRC 校验计算

    一 简介 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长度可以任意选定 其根本思想就是先在要发送的帧后面附加校验码 再发送给接收端 校验码要使所
  • python opengl 入门

    安装 pip install pyglet 入门demo import pyglet window pyglet window Window label pyglet text Label Hello world font name Tim
  • 图像语义分割概述

    图像语义分割概述 一 图像语义分割概念 图像语义分割 Image Semantic Segmentation 是一项计算机视觉任务 其目标是将输入的图像分割成多个区域 并为每个像素分配一个语义类别标签 以表示该像素属于图像中的哪个物体或区域
  • WheelCollider笔记

    The Wheel Collider is a special collider for grounded vehicles It has built in collision detection wheel physics and a s
  • Sapir—Whorf Hypothesis (萨皮尔—沃尔夫假说)

    Sapir Whorf Hypothesis 萨皮尔 沃尔夫假说 Sapir Whorf Hypothesis 的思想源头可追溯到德国哲学家海德 G Herder 1744 1803 Wilhelm von Humboldt 1762 18
  • win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?

    win11本地安全机构保护已关闭怎么办 如何修复windows11本地安全机构保护已关闭 近日有windows11系统用户反映说遇到了这样一个问题 启动电脑后 发现windows右下角的安全中心图标上会显示一个黄色叹号 打开windows安
  • Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构

    1 在项目中用到了这个控件 展示并选择某公司的部门 但是在使用过程中又出一个问题 我并不知道该公司有几个部门 部门下面是否有子部门 2 实现步骤如下 开发工具 Android studio 在项目中添加依赖 compile com gith
  • Android 10.0 修改SystemUI下拉QSPanel功能开关的显示顺序

    1 概述 在10 0的系统产品开发中 在对SystemUI下拉展开时 原生SystemUI会对下拉快捷功能键顺序排序 而 产品需求要求在QSPanel的功能开关顺序需要做调整 也就是要修改config xml中的显示顺序 然后在加载QSPa
  • STM32自带RTC时钟

    上面是我的微信和QQ群 欢迎新朋友的加入 没有使用32M的那个时钟 正确的应该是用那个的 现在的配置只是让RTC跑起来 生成工程 自动给我声明了两个结构体 打开结构体 看到的是一些跟时间相关的东西 找到四个函数 读取和设置时间日期 进入大循
  • XSS-labs-level4详解

    访问题目url 直接经典代码起手 查看界面回显发现表单中的尖括号都消失了 我们直接去看源代码
  • 单片机电子时钟的设计(期末课程设计)

    题目 单片机电子时钟的设计 设计一个时钟 可以正常显示时分秒 也可以通过按键改变分钟和小时 且有整点提醒功能 1 能够正常计时并且能够显示小时 分钟 秒 10分 1 正常显示秒 2分 2 正常显示分 2分 3 正常显示时 2分 4 秒进位至