从今天开始,我们利用上前几天学习的定时器和数码管,一起设计一个简单的秒计时器
项目工作流程:单片机开机机器自动启动计时器,计时器从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;//设置好初始值后再复位定时器
}
}
}
全部0条评论
快来发表一下你的评论吧 !