MCS-51单片机5:基于时钟的24小时计时器


前言

  本次主要介绍一下关于单片机的综合实验:基于时钟的24小时计时器。


一、应用系统的使用场景

  本人设计的是一个基于时钟的24小时计时器。它可以用作显示数字的钟表使用;由于它也显示秒数,故可以做秒表使用。

二、应用系统关键电子器件、应用系统原理图

   1. 应用系统关键电子器件有单片机,2个四位八段数码管,74HC245,74HC138,中断1。
   2. 应用系统的仿真原理图及其实物图如下:
在这里插入图片描述
在这里插入图片描述

三、应用系统功能原理

  我从应用系统的几个关键电子器件入手分析:
  1.2个四位八段数码管 从实物图上可以看出,从左往右数的前两位代表小时,三四位代表分钟,五六位代表秒。其中哪一位亮是由74HC138控制的;该位亮那个数字是由74HC245控制的。
  2.74hc245是兼容TTL器件引脚的高速CMOS总线收发器,典型的CMOS型三态缓冲门电路,八路信号收发器。其中它的16个管脚(除了接地和电源的)分别和单片机的P0的八个管脚以及2个四位八段数码管相连。
  3.74HC138,即译码器。输入信号的三个管脚分别于P2的2,3,4管脚相连,输出端于2个四位八段数码管相连。这三个输入信号的高低点平控制其中输出端的某位可以输出,进而影响四位八段数码管的哪一位亮。
  4.中断1:当计数器计数TFi溢出时,该位置“1”。此时使用中断方式1时,作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。

四、应用系统功能程序代码

  代码如下(示例):

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 m=0;//定义6个变量
u8 n=0;
u8 p=0;
u8 q=0;
u8 j=0;
u8 k=0;
u8 i=100;
sbit P2_2=P2^2;  //管脚进行声明定义
sbit P2_3=P2^3;
sbit P2_4=P2^4;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //不带小数点的0到9
u8 code smgduan_dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef }; //带小数点的0到9

void delay(u16 i)  //延时函数,i=1 时,大约延时 10us
{
	while(i--);	
}
void Timer0Init()
{
	TMOD=0X01;//选择为定时器模式,工作方式1,仅用TR0打开启动。
TH0=0xd8;//给定时器赋初值,定时10ms
	TL0=0xf0; 
	ET0=1; //打开定时器中断允许
	EA=1;//打开总中断
TR0=1; //打开定时器
}
void main()
{	
	Timer0Init();  //定时器1初始化
	while(1)		
	{
       P2_2=0;P2_3=1; P2_4=0;//实物图从左往右,第6位亮
  	   P0=smgduan[n];
	   delay(100); //延时
       P2_2=1; P2_3=1;P2_4=0;// 第5位亮
	   P0=smgduan[m];
	   delay(100); //延时
	   P2_2=0; P2_3=0;P2_4=1;4位亮
	   P0=smgduan_dot[p];
	   delay(100);
	   P2_2=1; P2_3=0;P2_4=1;3位亮
	   P0=smgduan[q];
	   delay(100); //延时
       P2_2=0; P2_3=1;P2_4=1;2位亮
	   P0=smgduan_dot[j];
	   delay(100); //延时
	   P2_2=1; P2_3=1;P2_4=1;1位亮
	   P0=smgduan[k];
	   delay(100); //延时
       P0=0; //消隐
	 }
}
void Timer0() interrupt 1//中断程序
{
	TH0=0xd8; //重新赋初值
	TL0=0xf0;
	i--; //循环100次
	if(i==0)
	{
		i=100;
		n++;
		if(n==10) //n满10,m加1,重置n=0
		{
		  n=0;
		  m++;
		}
		if(m==6) //m满6,p加1,重置m=0
        {
          m=0;
          p++;
        }
        if(p==10) //p满10,q加1,重置p=0
        {
		  p=0;
		  q++;
		}
        if(q==6) //q满6,j加1,重置q=0
        {
		  q=0;
		  j++;
		}
        if(j==10) //j满10,k加1,重置q=0
        {
		  j=0;
		  k++;
		}
        if(n==9&&m==5&&p==9&&q==5&&j==3&&k==2)//时间满24小时,n,m,p,w,j,k置0
        {
           n=0;m=0;p=0;q=0;j=0;k=0;
        }
	}	
}

五、应用系统设计经验总结

  1.进行程序的设计时,一定要先关注开发板的原理图,知道不同模块间管脚的连线方式,这样方便正确编写程序。同时要注意理解这学期和上学期的开发板的差别:上学期的开发板的管脚之间是通过外部线路进行自由搭配,而本学期的开发板管脚之间已经在内部电路固定连接,它的管脚连线是固定的。
  2.写程序时一定要认真,认真,再认真,我在写代码时因为一些小问题卡死了好几次😭😭。例如:if(m=0),我经常写成前面的这种形式,而这里应该是用==,即if(m==0),经常犯一些细小的错误。
  3.程序设计时一定要有一个大体的思路。先在脑海中思考一下程序怎么写,比如说这次的系统设计,我就用了n,m,p,q,j,k这6个变量,它们分别代表秒,分,时的6位。其中k,q,m都是满十向前进一位,自身置零,而j,p则是满六进一位,自身置零,而对n而言,由于我设计的是一个基于时钟的24小时计时器,所以n最大只能取2,因此当时间为23.59.59,即23时59分59秒,也就是n=9,m=5,p=9,q=5,m=3,n=2时,将n,m,p,q,j,k全部置零,重新开始计时。
  4.一个系统的功能设计对应的程序一般都不是只有一种。例如这次系统设计的初值定时10ms,其对应的定时器赋初值为TH0=0xd8;TL0=0xf0。他的定时也可以为1ms,5ms等等。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道无方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值