当前位置: 首页 > article >正文

51单片机-系列-数码管中断和定时器

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~”  

 数码管

8051单片机的最小系统

  • 电源(5V)
  • 复位电路
  • 晶振(单片机的心脏
  • 如果要使用PO口,必须加4.7K-10K上拉电阻(这是因为PO口的内部没有上拉电阻
  • 如果下载程序,必须要与电脑连接的串口下载通道

电容两端的电压是不会突变的

复位分为自动复位和手动复位:

对于自动复位而言,有一个高电平要持续超过24个时钟周期,即两个机器周期,一个指令周期,24个时钟周期结束之后变成低电平(结束复位状态)

看门狗,帮助单片机更加稳定的运行,作为产品,看门狗是要打开的

 数码管的显示原理

在这张图中的a图是共阴极,b图是共阳极,对于共阴极而言,我们需要给高电平那边给1,对于共阳极而言,我们需要给低电平那边给0,来让他们显示。

 共阴数码管列表0-9

										0x3f,0x06,0x5b,0x4f,
										0x66,0x6d,0x7d,0x07,
										0x7f,0x6f,0x77,0x7c,
										0x39,0x5e,0x79,0x71
uchar code table[]={
										0x3f,0x06,0x5b,0x4f,
										0x66,0x6d,0x7d,0x07,
										0x7f,0x6f,0x77,0x7c,
										0x39,0x5e,0x79,0x71};

在这里,我们加上了code,这代表着我们告诉编译器,将此数组存放在程序存储区,而不是放在SRAM中 

接下来,我们就用这个实现一下数码管的简单代码。

#include<stc89c5xrc.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define beep P23
#define dula P26
#define wela P27
uchar num,temp;
uchar code table[]={
										0x3f,0x06,0x5b,0x4f,
										0x66,0x6d,0x7d,0x07,
										0x7f,0x6f,0x77,0x7c,
										0x39,0x5e,0x79,0x71};
void DelayMs(uint c);
uint Sum(uchar i,uchar j);
void main()
{
	while(1)
	{
		temp=0xfe;
		for(num=0;num<6;num++)
		{
			wela=1;
			P0=temp;//11111110 打开第一个数码管的位选
			temp=_crol_(temp,1);
			wela=0;
			dula=1;
			P0=table[num+5];
			dula=0;
			DelayMs(2);
		}
	}
}
uint Sum(uchar i,uchar j)
{
	uint k;
	k=i+j;
	return k;
}
void DelayMs(uint c)
{
	uint a,b;
	for(a=c;a>0;a--)
		for(b=115;b>0;b--);
}

 然后,我们将这里的数码管呈现的代码可以进行一下修改,使得我们利用数组的形式对数码管呈现的数字进行控制。

void Display(uint shu)
{
	wela=1;
	P0=0xfe;//11111110
	wela=0;P0=0;
	dula=1;
	P0=table[shu/100];
	dula=0;
	DelayMs(2);
	
	wela=1;
	P0=0xfd;//11111101 打开第二个数码管的位选
	wela=0;P0=0;
	dula=1;
	P0=table[shu/10%10];
	dula=0;
	DelayMs(2);
	
	wela=1;
	P0=0xfb;//11111011 打开第三个数码管的位选
	wela=0;P0=0;
	dula=1;
	P0=table[shu%10];
	dula=0;
	DelayMs(2);
}

中断和定时器

中断的概念

在主程序运行的途中,会发生一些中断请求,进行中断响应,然后执行中断处理程序,最后中断返回,在中断响应的过程中,会根据中断的不同的优先级从而发生中断嵌套。

高优先级的可以打断低优先级的

同一优先级中的中断产生多个时,则有中断优先权排队问题,由中断系统硬件确定的自然优先级决定哪个中断先响应。

对于STC而言,最多可以有四级嵌套

 

中断响应条件

  1. 中断源有中断请求.
  2. 此中断源的中断允许位为1
  3. CPU开总中断(EA(总中断)=1)

TCON中当IT0为1时为下降沿触发,当IT0为0时为低电平触发

	EA=1;//打开总中断
	EX0=1;//打开外部中断
	IT0=0;//设置中断类型为下降沿

 

 中断函数

可位寻址的寄存器可以直接进行操作,能被8整除的都是可位寻址的。

在中断号当中,中断号不能重复出现。

void Int0() interrupt 0
{
	beep=0;
}

定时器装初值的计算方法

从0加满需要65535个机器周期,再加1后溢出,产生中断,共65536个机器周期,每个机器周期是12个时钟周期。

如果是11.0592M晶振,每个时钟周期为:1/11.0059200=0.09us. 

定时器/计数器介绍

定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数,只是让脉冲来源不同,如果计数脉冲来自系统时钟(内部),此时定时器每12个时钟得到一个计数脉冲,计数值+1,如果计数脉冲来自单片机外部引脚(T0为P3.4,T1为P3.5),则为计数方式,每来一个脉冲+1;

定时器/计数器控制寄存器TCON

TCON为定时器/计数器T0,T1的控制寄存器,同时也锁存T0,T1溢出中断源和外部请求中断源。

这是它的格式:

TF0:定时器/计数器T0溢出中断标志,T0被允许计数之后,从初值开始加1计数,当最高位产生溢出的时候,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应应该中断时,才由硬件清“0”TF0

TR0:全手动,定时器T0的运行控制位,该位由软件置位和清零,(GATE=0)TR0=1时,允许T0开始计数,TR0=0时禁止T0计数,(GATE=1),TR1=0且INT0=高电平,才能允许T0计数。

定时器/计数器工作模式寄存器TMOD

好了,本次的文章就到这里了,我们下次再见。 


http://www.kler.cn/a/314741.html

相关文章:

  • Unity学习笔记(4):人物和基本组件
  • Sigrity SPEED2000 Power Ground Noise Simulation模式如何查看PDS系统的自阻抗操作指导
  • [代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
  • 【ChatGPT】 如何让ChatGPT分析数据并得出结论
  • Springboot 启动端口占用如何解决
  • 软件测试面试2024最新热点问题
  • Lsposed Java HOOK原理及检测
  • 我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪
  • Nacos与Eureka的区别:深入解析微服务中的服务注册与发现
  • npm切换为淘宝镜像源
  • GPU加速生物信息分析的尝试
  • 数据结构之存储位置
  • AIGC专栏15——CogVideoX-Fun详解 支持图文生视频 拓展CogVideoX到256~1024任意分辨率生成
  • Web_php_include 攻防世界
  • C++20 std::format
  • Windows下如何定时执行自定义任务
  • 2024年中国研究生数学建模竞赛C题——解题思路
  • 开源PHP导航网源码/精美简约网址导航收录网站/QQ技术导航程序
  • MySQL 索引事务
  • PyCharm的使用
  • 英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!
  • 连续数组问题
  • 『功能项目』QFrameWork框架重构OnGUI【63】
  • 深度学习02-pytorch-04-张量的运算函数
  • Selenium4.0实现自动搜索功能
  • 链式前向星建图