作业

用51单片机完成一个数字钟的计时及校时功能。
1、设置8个数码管的显示缓冲区为DISPBUFF[8],并初始化为02,02,-,04,08,-,03,06.

2、定时器0每隔5ms刷新一次数码管显示缓冲区,并显示时间(中断来做)

3、定时器1负责精确定时,计时1s,每隔50ms中断一次,中断20次即为1s

4、用图中两个按键实现时分和小时的校时功能,MODE按键实现小时校准、分校准及正常显示的3个模式切换,ADD按键实现对应时间加一,按键采用外部中断方式实现功能。在校准小时及分钟的时候,对应两位数码管的小数点必须亮,正常模式时所有小数点全灭.

5、秒脉冲由51单片机的定时器来提供。

按要求上交实验报告(校准小时、分钟及正常模式的对应Proteus仿真截图及开发板下载图一定要)。

思路

  • 定义一个数码管显示模块,起名为dis_seg7()

  • 定时器0每隔5ms刷新一次数码管显示缓冲区,并显示时间(中断来做)

  • 定时器1负责精确定时,计时1s,每隔50ms中断一次,中断20次即为1s

  • 外部中断0实现模式切换

    • 正常显示,stat = 0;
    • 校分,stat = 1;
    • 校时,stat = 2;
    • 注意:校时,校分时要停止定时器T1
  • 外部中断1实现hour/min自增

    • 先检测一下stat
    • stat =1,min_increase
    • stat = 2, hour_increase

代码

#include<reg52.h>
//共阳极数码管
unsigned char code segCodeTable[12] = {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xbf,0x7f}; //0-9,-,.,
//带小数点的共阳极数码管段码表
unsigned char code segCodeTable1[10] = {0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,
0x00,0x10};//0-9
//位码表
unsigned char code posCodeTable[8] = {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//数码管显示缓冲区
unsigned char LEDBuffer[8] = {0x82,0xb0,0xbf,0x80,0x99,0xbf,0xa4,0xa4,};
void display_seg7();
void TIMER0_INIT();
void TIMER1_INIT();
void EXT_INTR0_INIT();
void EXT_INTR1_INIT();
unsigned char sec = 36,min = 48,hour = 22;
//定义一个变量,记录状态
unsigned char stat = 0;
void main()
{//定时器0初始化配置TIMER0_INIT();//定时器1初始化配置TIMER1_INIT();//外部中断0初始化EXT_INTR0_INIT();//外部中断1初始化EXT_INTR1_INIT();EA = 1;//开启总中断while(1);
}//定时器1初始化配置
void TIMER1_INIT()
{TMOD = (TMOD & 0x0f) | 0x10;PT1 = 1;ET1 = 1;TH1 = 0x3c;TL1 = 0xb0;TR1 = 1;
}//定时器1负责精确定时,计时1s,每隔50ms中断一次,中断20次即为1s
void TIMER1_INTR() interrupt 3
{static unsigned char cnt = 0;TH1 = 0x3c;TL1 = 0xb0;cnt++;if(cnt >= 20){cnt = 0;sec++;if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}}
}//定时器0初始化配置
void TIMER0_INIT()
{//定时器0初始化配置TMOD = (TMOD & 0xf0) | 0x01;ET0 = 1;//使能定时器0中断PT0 = 0;//设置中断优先级TL0 = 0x78;      //设置定时初值TH0 = 0xEC;        //设置定时初值TR0 = 1;
}//定时器0每隔5ms刷新一次数码管显示缓冲区
void TIMER0_INTR() interrupt 1
{TL0 = 0x78;       //设置定时初值TH0 = 0xEC;        //设置定时初值if(stat == 0)  //正常显示{LEDBuffer[0]  = segCodeTable[sec%10]; //更新数码管显示缓冲区LEDBuffer[1] =  segCodeTable[sec/10];LEDBuffer[3] =    segCodeTable[min%10];LEDBuffer[4] =    segCodeTable[min/10];LEDBuffer[6] =    segCodeTable[hour%10];LEDBuffer[7] =   segCodeTable[hour/10];}else if(stat == 1) //校分{LEDBuffer[0]  = segCodeTable[sec%10]; //更新数码管显示缓冲区LEDBuffer[1] =     segCodeTable[sec/10];LEDBuffer[3] =    segCodeTable1[min%10];LEDBuffer[4] =   segCodeTable1[min/10];LEDBuffer[6] =   segCodeTable[hour%10];LEDBuffer[7] =   segCodeTable[hour/10];}else if(stat == 2)  //校时{LEDBuffer[0]  = segCodeTable[sec%10]; //更新数码管显示缓冲区LEDBuffer[1] =    segCodeTable[sec/10];LEDBuffer[3] =    segCodeTable[min%10];LEDBuffer[4] =    segCodeTable[min/10];LEDBuffer[6] =    segCodeTable1[hour%10];LEDBuffer[7] =  segCodeTable1[hour/10];}display_seg7();
}//数码管显示模块
void display_seg7()
{unsigned char j = 0,i = 0;for(i = 0;i<8;i++){P2 = LEDBuffer[i]; //段码P1 = posCodeTable[i]; //位码for(j = 0;j<200;j++); //延时P2 = 0xff; //清除余晖}
}//外部中断0初始化
void EXT_INTR0_INIT()
{EX0 = 1;PX0 = 1; //设置中断优先级IT0 = 1; //脉冲下降沿中断}//外部中断0
void intr0() interrupt 0
{   stat++;if(stat == 3) //正常显示{stat = 0;TR1 = 1;//定时器T1开启}if(stat == 1)//校分{TR1 = 0;//定时器T1停止} if(stat == 2)//校时{TR1 = 0;//定时器T1停止}
}//外部中断1初始化
void EXT_INTR1_INIT()
{EX1 = 1;PX1 = 1; //设置中断优先级IT1 = 1; //脉冲下降沿中断
}//外部中断1
void intr1() interrupt 2
{if(stat == 1)  //校分{min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}if(stat == 2) //校时{hour++;if(hour == 24){hour = 0;}}
}

运行结果

0.初始化

1.正常显示

2.校分

  • 先按下按键mode切换模式
  • 再按下按键add,实现分加一

3.校时

  • 先按下按键mode切换模式
  • 再按下按键add,实现时加一

github下载链接

51单片机数字钟的实现相关推荐

  1. 单片机节日彩灯实训报告_单片机数字钟实训报告

    单片机数字钟实训报告 学院:电子工程学院 专业:机电一体化 班级: 姓名: 手机号: 一.任务及要求 用51单片机设计时.分.秒计时器,具体要求如下. 1.具有时.分.秒计时功能和8位数码管显示功能, ...

  2. 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019/07/13 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析 发表日期:2019/07/13 单片机开发板:巫妖王2.0, 使用同款开发板可直接上板测试 文档说明: 实现功能 : 一 ...

  3. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...

  4. 51单片机数字电子钟开题报告

    目录 选题背景 初步设计方案 芯片的选型 编译环境 关键问题 策略 方案 参考文献 选题背景 数字电子钟是一种受到越来越多人喜爱的钟表,其准确性和稳定性成为设计和研发的重要考虑因素.在现代社会,时间的 ...

  5. c语言51单片机数字时钟设计,51单片机数字时钟功能需求及设计实现(带闹钟)...

    1设计要求 l.1 功能需求 (1) 实现数字时钟准确实时的计时,lj显示功能: (2)实现闹钟功能,即系统时问到达闹钟时问时闹铃响: (3) 实现时问和闹钟时问的调时功能: (4)刚启动系统的时候在 ...

  6. 51单片机--数字电子时钟(单片机基础应用)

    前言 整理代码的时候发现之前写的一个单片机(STC89C51)代码,主要是利用3个中断源(计时中断,外部中断),蜂鸣器,8个LED灯,独立按键(矩阵按键)以及8片阴极数码管完成一个数字电子时钟,并且具 ...

  7. 51单片机数字时钟套件 DIY散件

    详情:https://www.icxbk.com/try/group-detail?pid=1743

  8. PIC16F887 单片机 数字钟 电子钟 万年历 数字时钟 proteus

    [基本的知识获取点我] 基础操作需要看一下以下的博客,跟着走一遍. 安装MPLAB V4.05+XC8 V1.41 https://blog.csdn.net/x1131230123/article/ ...

  9. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

最新文章

  1. TPOT: 自动化的sklearn
  2. python学习干货教程(10):列表
  3. 关于Sybase ASE数据库的license以及试用版过期的问题的解决方案
  4. Linux 学习 (一)
  5. kerberos体系下的应用(yarn,spark on yarn)
  6. 【转】html5离线储存,application cache,manifest使用体验
  7. c语言100道经典编程题,100道经典C语言编程题
  8. Python tolist()用法
  9. Premiere Pro之更改视频占用内存大小(十九)
  10. 执行npm install报错:npm ERR! code EINTEGRITY,npm ERR! 最彻底,最实用的方法就是更新node版本
  11. 数学模型之最小二乘法
  12. 目标检测YOLO实战应用案例100讲-面向目标检测的语义分割技术研究与应用
  13. SkyWalking服务应用
  14. MATLAB导入txt和excel文件技巧汇总
  15. Unity IK动画
  16. 摄像头模组介绍和技术指标
  17. 美丽的窗花java分形_活动设计——美丽的窗花 (设计意图及教学反思)
  18. 快手小程序、网红探店小程序、多商户版(裂变分销+商家核验+集字卡片活动+积分抵扣)
  19. 封了一个XPO初始化类
  20. 人脸识别与神经风格转换

热门文章

  1. 如何用面对对象来做一个躁动的小球?
  2. 杭电 1284 钱币兑换问题【完全背包求方案总数】
  3. Vue cli3.0创建Vue项目
  4. 利用js的闭包原理做对象封装及调用方法
  5. Android判断应用或Activity是否存在
  6. Maven工程的多模块
  7. node --- 创建一个Socket服务器
  8. LeetCode算法题-Jewels and Stones(Java实现)
  9. Linux 下实现普通用户只能写入某个目录
  10. Jmeter===Jmeter中使用CSV Data Set Config参数化不重复数据执行N遍(转)