从今天开始,我们利用上前几天学习的定时器和数码管,一起设计一个简单的秒计时器
项目工作流程:单片机开机机器自动启动计时器,计时器从0开始计时,每一秒加一,直到9999后自动复位成0000。
这个项目中我们使用到数码管和单片机C51的Timer0,定时器每次定时5ms,每次满5ms的时候输出一次一位的显示,同时数码管位控为一一位,移到最后一位数码管就自动回到第一位,累计计满200次5ms(也就是1秒以后),计时器+1,直到9999
我们用一个数组存下寄存器的数值,这个数组是Time[4],其中Time[0]对应个位,Time[1]对应十位,Time[2]对应百位,Time[3]对应千位
计算出初始值为60928,换算
TH0 = 0xEE;
TL0 = 0x00;
整个项目的电路图:
这里不得不提醒一下,我们之前设计的电路图中,左边的数码管是第一位
//从左往右数:最左边第一位数码管,接下来是二,三,四
sbit Smg_1 = P2^0;//第一位数码管接在P2.0
sbit Smg_2 = P2^1;//第一位数码管接在P2.1
sbit Smg_3 = P2^2;//第一位数码管接在P2.2
sbit Smg_4 = P2^3;//第一位数码管接在P2.3
//整个数码管取模
unsigned char code Smgbit[] = {0xFE,0XFD,0xFB,0xF7};
现在,为了让数码管配合我们存放时间的变量Time[],所以我们换了一下数码管的位,现在是左边第一位是第一位
不过这个大家不用记住,我们的工程用到的时候要我会跟大家说的,所以本工程中的数码管的位控
//从左往右数:最左边第一位数码管,接下来是二,三,四
sbit Smg_1 = P2^3;//第一位数码管接在P2.0
sbit Smg_2 = P2^2;//第一位数码管接在P2.1
sbit Smg_3 = P2^1;//第一位数码管接在P2.2
sbit Smg_4 = P2^0;//第一位数码管接在P2.3
//整个数码管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
程序大概流程(画的有点丑,见谅):
程序框图:
代码:
//这个代码展示的是一个0~9999秒的计时器
#include< reg52.h >
unsigned char Time[4] = {0,0,0,0};//我们的计时器时间的变量
//这四个TIME元素分别代表千位(TIME(3))百位(TIME(2))十位(TIME(1))个位(TIME(0))
//----------------------------------------------------------------
//----------------------------------------------------------------
unsigned char code Smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管取模
unsigned char code Smgbit[] = {0xF7,0xFB,0XFD,0xFE};
//数码管位控
//操作的时候直接用P2 = Smgbit[0~3]对应1~4位数码管
unsigned char SmgSelect = 0;//数码管选位
//这里不得不特别说明
//SmgSelect不仅仅是控制我们的数码管位控,还控制着数码管显示时对描述位置的选位操作
//Smgbit 0 1 2 3
//数码管 1 2 3 4 位
//秒数 个 十 百 千
//----------------------------------------------------------------
unsigned char TimerCount = 0;//这个变量记录定时器定时溢出次数
//(定时器一次定时5ms)
//----------------------------------------------------------------
unsigned char a = 0;
//----------这个是一个临时变量
void main()
{//注意设置定时器初始值要在main函数里面设置
TMOD = 0x01;
/*设置定时器模式寄存器TMOD为 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
标准16位定时器
*/
//先设置定时器初始值,我们一次延迟5ms,计算得初始值为60928
TL0 = 0x00;//设置定时器初始值低位
TH0 = 0xEE;//设置定时器初始值高位
TR0 = 1;//记得一定要设置定时器开启
while(1)
{
if (TF0 == 1)
{
P2 = 0xFF;//注意每次写数码管之前都要把所有的数码管关闭
a = Time[SmgSelect];
P0 = Smg[a];
//这个过程先从Time[]里面取出位数的数值
//再把这个数值送到Smgbit里面选择出这位数对应的数码管取模
//最后把这个取模的数据送给P0 IO组,显示
P2 = Smgbit[SmgSelect];
//选择数码管位置
SmgSelect++;
if (SmgSelect >3){SmgSelect = 0;}//如果选位变量超过3,归零
TimerCount++;
if(TimerCount > 200)
{
Time[0]++;
TimerCount = 0;
//检测第一位有没有满
if(Time[0] >9)
{
Time[0] = 0;
Time[1]++;
}
//检测第二位有没有满
if(Time[1] >9)
{
Time[1] = 0;
Time[2]++;
}
//检测第三位有没有满
if(Time[2] >9)
{
Time[2] = 0;
Time[3]++;
}
//检测第三位有没有满
if(Time[3] >9)
{
Time[3] = 0;
}
}
TL0 = 0x00;//设置定时器初始值低位
TH0 = 0xEE;//设置定时器初始值高位
TF0 = 0;//设置好初始值后再复位定时器
}
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6001文章
43973浏览量
620828 -
寄存器
+关注
关注
30文章
5028浏览量
117719 -
数码管
+关注
关注
31文章
1827浏览量
89946 -
定时器
+关注
关注
23文章
3147浏览量
112036
发布评论请先 登录
相关推荐
按键和数码管
三位数码管实现显示由T0计时器控制的数,s1控制T0的开启与关闭,s1按下弹起后数码管要显示此时的(计数/2)。怎么办,只有一个显示函数调用,且都是void display(temp)
发表于 07-10 19:29
通过定时器来控制跑秒时间间隔,数码管的动态显示能实现
大大……通过定时器来控制跑秒的时间间隔,然后用其中两个数码管来显示!这个用数码管的动态显示能实现吗?请各位大大们教教小弟……如图
发表于 05-12 23:40
基于51秒倒计时器 数码管显示
给别人弄的60S倒计时,数码管显示,需要的看看。#include#define uint unsigned int#define uchar unsigned char***it P2_2 = P2
发表于 12-27 22:51
基于单片机的时钟计时器系统设计与制作 精选资料分享
基于单片机的时钟计时器系统设计与制作[摘要]这次课程设计以STC89C51单片机为核心,辅以必要的电路,设计了一个简易的电子时钟,它由5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达
发表于 07-21 07:47
51单片机定时器的使用/按键检测及数码管的动态显示
数字时钟的显示及修改实验目的掌握定时器的使用、按键检测及数码管的动态显示。实验内容1、绘制如下proteus仿真图2、利用定时器的定时功能,用6位数
发表于 11-19 06:27
怎样写一个百秒秒表计时器应用的单片机程序
。项目名称: 百秒秒表计时器应用的的单片机:AT89c52应用到的知识 : 1.定时器的应用2.数码管的写法3.中断1.要想写成,这个秒表的
发表于 12-13 06:57
定时器的原理及常用工作方式
实验目的:1、掌握定时器的原理及常用工作方式;2、能够根据特定任务需求选择合适的工作方式实现定时;3、理解多位数码管显示的原理。实验要求:1、基于普中开发板设计
发表于 01-07 08:18
数码管动态显示之倒计时器设计资料分享
1、数码管动态显示之倒计时器设计下面将介绍数码管显示的最后一个实例,该例的实现目标为通过拨码开关输入BCD码设置起始时间(单位为秒,高两位和
发表于 07-27 16:50
评论