蓝桥杯单片机定时器1的编码以及数码管的动态显示

蓝桥杯单片机定时器1的编码以及数码管的动态显示

简单使用蓝桥杯单片机上面的定时器,进行设置一个简单的秒表吧,用于练手,同时熟练操作定时器的操作以及熟练数码管的动态显示,虽然简单,但是也两个知识点都是常考的,也是必须掌握的模块喔。

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;


//这里先弄一个简单的秒表先吧

u8 t1_count;
u8 t1_sec,t1_min,t1_hour;  			   // 定时器的时钟

u8 code shuma[12] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};


// 系统初始化函数
void init_system()
{
   
    P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);
}


	// 外设选通函数
void select(u8 local)
{
   
    switch(local)
	{
   
	    case(4): P2 = (P2 & 0x1f) | 0x80; break;
		case(5): P2 = (P2 & 0x1f) | 0xa0; break;
		case(6): P2 = (P2 & 0x1f) | 0xc0; break;
		case(7): P2 = (P2 & 0x1f) | 0xe0; break;
	}
}

// 用于数码管简单延时
void delay()
{
   
    u8 t = 200;
	while(t--);
}

// 点亮单个数码管函数
void display(u8 local, u8 num)
{
   
    select(6);
	P0 = 0x80 >> (local - 1);
	P2 = P2 & 0x1f;

	select(7);
	P0 = num;
	P2 = P2 & 0x1f;

	// 数码管简单延时
	delay();
}


void close_display()
{
   
    // 数码管消隐
	select(6);
	P0 = 0x00;
	P2 = P2 & 0x1f;
}

// T1定时器初始化函数,开始中断函数
void init_t1()
{
   
   	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = (65535 - 50000) % 256;		//设置定时初值
	TH1 = (65535 - 50000) / 256;		//设置定时初值

	EA = 1;
	ET1 = 1;
// TF1 = 0; //清除TF1标志 溢出标志
	TR1 = 1;		//定时器1开始计时
}

// T1定时器的溢出中断服务函数
void server_t1() interrupt 3
{
   
    TL1 = (65535 - 50000) % 256;		//设置定时初值
	TH1 = (65535 - 50000) / 256;		//设置定时初值

	if(++t1_count == 200)
	{
   
	    t1_sec++;
		t1_count = 0;
	}
	if(t1_sec == 60)
	{
   
	    t1_min++;
		t1_sec = 0;
	}
	if(t1_min == 60)
	{
   
	    t1_hour++;
		t1_min = 0;
	}
}

void main()
{
   

	init_system();       // 初始化系统,关闭蜂鸣器、继电器、数码管、LED灯等外设
	init_t1();
    while(1)
	{
   
	   display(1, shuma[t1_sec%10]);
	   display(2, shuma[t1_sec/10]);
	   display(3, 0xbf);
	   display(4, shuma[t1_min%10]);
	   display(5, shuma[t1_min/10]);
	   display(6, 0xbf);
	   display(7, shuma[t1_hour%10]);
	   display(8, shuma[t1_hour/10]);
	   close_display();	   
	}
}

这样子就可以实现一个简单的时钟了,虽然代码有点长,但是很多都是简单的编码而已,只要慢慢阅读都是可以读懂的啦。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115109.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月12日 下午10:00
下一篇 2021年11月12日 下午11:00


相关推荐

  • 什么是J2EE?[通俗易懂]

    什么是J2EE?[通俗易懂]什么是J2EE?J2EE是一种用来开发分布式企业软件应用系统的平台。JAVA语言从创生之日起,就获得了广泛接纳,经历了巨大的发展。越来越多的技术都成了JAVA平台的一部分,为了适应不同的需要业开发吃了很多全新的API和标准。最终,Sun公司联合了多家业界巨头,在开放的JAVA社区组织名义下,把所有与企业开发相关的标准,API整合起来,构成了J2EE平台。对于企业,J2EE平台由很多优势:

    2022年10月11日
    6
  • Transition 总结

    Transition 总结TransitionFr 总结使用 Material 风格的动画 在 SDK21 实现更好效果

    2026年3月17日
    2
  • vue文件中引入js_vue中require引入js

    vue文件中引入js_vue中require引入js由于一些演示,需要对编码名称等可快速进行修改,需要页面方便配置。由于build后的vue项目基本已经看不出原样,因此需要创建一个文件,并在打包的时候不会进行编译。vue-cli2.0的作法是在static文件下创建js。vue-cli3.0的写法则是直接在public文件夹下创建js、具体操作如下:1、在public文件夹下创建config.js文件,里面文件的语法是es5,不允许使用浏览器…

    2022年10月8日
    3
  • BigDecimal和double类型相互转换,一行搞定

    BigDecimal和double类型相互转换,一行搞定BigDecimal 类型和 double 类型的值相互转换 1 BigDecimal 转 double 使用 BigDecimal 类里面 doubleValue 方法 BigDecimalla 39 doublelatitu latitude doubleValue 2 double 转 BigDecimal 使用 BigDecimal 类里面 valueOf 方法 doublelatitu 39 BigDecimalla

    2026年1月28日
    2
  • vmware 无权输入许可证密钥

    vmware 无权输入许可证密钥vmware 无权输入许可证密钥解决方案解决方案使用管理员权限运行 cmd 进入 vmware 目录进入目录下的 x64vmware vmx exenew snZF71R DMX85 XXXX 8YMNC XXXXX

    2026年3月18日
    2
  • ILSVRC2012数据集(分类部分)简要介绍和初步处理

    ILSVRC2012数据集(分类部分)简要介绍和初步处理ILSVRC2012 数据集 分类部分 简要介绍和初步处理简介即大名鼎鼎 ImageNet2012 竞赛的数据集 在图像分类数据集中属于最常用的跑分数据集和预训练数据集 主要内容可以参考 ILSVRC2012 devkit t12 gz 的 readme txt 和中文翻译版内容详解下载的文件主要包括以下几个文件 ILSVRC2012 img train tarILSVRC201 img va

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号