基于51单片机的电子时钟(数码管显示)
此次对于数码管进行一个简单的应用,同时可以设计一个电子小时钟,增加趣味性。
首先我们先进行原理图的讲解,这里我们直接使用的开发板,其原理连接图如下:
其中D(0~1)是连接在单片机的P0口上的。
从图中,我们可以看到,第一个74HC573是来控制8个数码管的位选的,就是说我要选种哪个数码管,这里的WE是低电平有效,比如说我想选中最后一个数码管,那么这里我就要将0x7f送到相应的I/O口。第二个74HC573是来控制数码管显示什么的这里0~9的16进制码如下:
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;
要想完成电子时钟,我们先要显示一个数值,
这里我们封装两个函数:
wirte_address(unsigned char);
write_date(unsigned int);
第一个函数是用来写地址的,就是用来选中数码管的;
第二个函数是用来写数据的,就是选中的数码管显示什么。
比如我们想在最后一个数码管上显示一个8;
那么则有:
write_address(0x7f);
write_date(0x7f);
这样就能在相应的位置上显示一个8了;
然后我们就要多个位置显示,这里我们硬件的P0口接的是数码管,同时我们要引进相应的延时函数delay(unsigned int);
我们利用发光管的余辉和人眼视觉暂留作用,让人眼无法分辨出来,从而达到“同时显示的效果”。
但是我们需要注意的是消影,在每次写入之前令P0=0xff,这是为了消除上次段选数据,否则会造成,显示混乱。
当我们能显示时,就需要了解定时器,让它来计时,然后将数值取出,进行显示。这里我们的晶振是12MHz,所以一个机械周期时1/12MHz=1us,为了使计时较为精确,我们这里选择定时器0的模式2,8位重装定时器,并且我们100us进入一次中断,定时器的初始化就该如下:
TMOD=0x02;
TH0=256-100;
TL0=256-100;
EA=1;
ET0=1;
TR0=1;
这样我们再定义一个n用来计数进入中断的次数,当n的10000时,就表示1s到了,所以我们需要对相应的变量进行处理。
那么我们需要对数据进行处理,比如,所得的秒的值,其十位=秒/10,其个位就等于秒%10,其它以此类推。
那么整个的程序代码如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管位选数据
sbit dula=P2^6;//段选信号,写数码管数据
sbit wela=P2^7;//位选信号,选择数码管uint miao=0; //秒
uint fen=0; //分
uint shi=0; //时
uint n=0; //计数
uint date[6]={0,0,0,0,0,0}; //定义一个有6个地址的数组,分别存时,分,秒的个位和十位。
void delay(uint z) //延时函数
{uint x,y;for(x=z;x>0;x--)for(y=50;y>0;y--);
}void write_address(uchar address) //写地址函数,选择数码管
{wela=1;P0=address;wela=0;
}void write_date(uint n) //写数据函数,送入段选信号
{dula=1;P0=table[n];dula=0;
} //显示函数
void display()
{ write_date(date[0]);P0=0xff;write_address(0x7f);delay(1);write_date(date[1]);P0=0xff;write_address(0xbf);delay(1);write_date(date[2]);P0=0xff;write_address(0xef);delay(1);write_date(date[3]);P0=0xff;write_address(0xf7);delay(1);write_date(date[4]);P0=0xff;write_address(0xfd);delay(1);write_date(date[5]);P0=0xff;write_address(0xfe);delay(1);}
void time_init() //定时器初始化函数
{TMOD=0x02; //选择方式2TH0=156; //重装初值为156TL0=156; //运行值为156EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //开定时器0
}void main()
{dula=0; //先关闭位选,段选信号。wela=0;time_init();while(1){display();}}void timer() interrupt 1 //定时器0中断
{n++;if(n==10000) //当n=10000时,表示1s到了{ n=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}date[0]=miao%10;date[1]=miao/10;date[2]=fen%10;date[3]=fen/10;date[4]=shi%10;date[5]=shi/10;}}
其效果图如下:
基于51单片机的电子时钟(数码管显示)相关推荐
- 基于51单片机的8位数码管显示的可调时电子时钟
基于51单片机的8位数码管显示的可调时电子时钟 本人大二本科生,第一次发东西,功能比较简单,代码有点复杂,希望能有大神指正. 基于51单片机的不可调时间的时钟显示,晶振为11.0592MHZ,60H ...
- 基于51单片机的电子时钟设计
基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...
- 【036】基于51单片机的电子时钟与秒表Proteus仿真设计
一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...
- c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc
-- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...
- 基于51单片机LCD1602电子时钟实物制作
之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...
- 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计
1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...
- 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真
基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...
- 基于51单片机的电子时钟万年历温度仿真数码管显示
硬件设计 仿真图1: A. 由数码管作为显示器,三个按键可以设置时间. 仿真图2: A 由数码管作为显示器,可通过开关设置年月日星期等时间: 程序设计1 #include <reg51.h> ...
- 毕业设计 - 基于51单片机的电子时钟设计与实现
文章目录 单片机电子时钟程序设计 实现效果 最后 单片机电子时钟程序设计 共用体除非必要,否则学长不推荐使用,枚举的用法比较简单,在本书19章的项目实践中有很好的示例,这节课我们先来练习一下结构体的使 ...
- 基于51单片机的温度控制系统数码管显示蜂鸣器报警proteus仿真原理图PCB
功能: 0.本系统采用STC89C52作为单片机 1.系统实时监测并显示当前温度,并通过四位数码管显示 2.超过设定阈值,蜂鸣器将报警,同时控制相应继电器实现降温或者加热 3.系统具备三个功能按键,可 ...
最新文章
- Android之四大组件(AIDL Service的使用)
- 深度学习100例-卷积神经网络(CNN)识别眼睛状态 | 第17天
- java 修改ip_如何用脚本快速修改IP地址(Netsh)
- 从远程(包括ftp,http等协议)地址获取文件流信息
- 大数据_Hbase-API访问_Java操作Hbase_MR-数据迁移-代码测试---Hbase工作笔记0017
- Android:屏幕自适应
- 5G 时代,一加的机会在哪里?
- 【神经网络】激活函数的作用及常用激活函数
- 常见的74系列集成电路
- HDU 1069 Monkey and Banana(二维偏序LIS的应用)
- 让AI简单且强大:深度学习引擎OneFlow技术实践
- java多边形合并_geotools实现多边形的合并缓冲区
- Unity 讯飞实时语音转写(二)—— 接收转写结果
- python绘制网络拓扑_python画网络拓扑图
- 创造与魔法java语言_创造与魔法基础魔法大全 超实用基础魔法推荐
- Unity 摄像机切换镜头
- C# DateTime Subtract
- stm8 硬件SPI
- UnityShader-高斯模糊
- vissim跟驰模型_VISSIM,PARAMICS,TSIS仿真软件对比分析 -
热门文章
- ERROR | Corrupt JPEG data: 111 extraneous bytes before marker 0xd9...
- 堆漏洞挖掘中的malloc_consolidate与FASTBIN_CONSOLIDATION_THRESHOLD
- btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
- gensim中word2vec API参数说明
- STM32通过USB方式烧录程序DFU详解 ( 使用新版本的DFU工具 DfuSe_Demo_V3.0.5_Setup 测试ok 2018-7-27 改)
- 一个典型业务系统卡顿故障分析
- STEP2——《数据分析:企业的贤内助》重点摘要笔记(四)——数据清洗
- 中科院计算机软件所导师,中国科学院软件研究所硕士生导师刘立祥
- 台式计算机如何定时关机,台式电脑设置定时关机
- php yar call,php yar扩展在laravel中的使用