首页 > 其他分享 >proteus+keil5仿真学习笔记(第三章 4位数码管计数器)

proteus+keil5仿真学习笔记(第三章 4位数码管计数器)

时间:2024-03-22 09:30:28浏览次数:541  
标签:10 定时器 void unsigned Dat 数码管 proteus keil5

第三章 4位数码管计数器

前言

一、多位数码管显示程序

二、定时器原理

三、程序设计与仿真

proteus 电路

程序

总结

前言

4位数码管计数器与1位数码管计数器相比,增加了片选电路,以确定选择哪个数码管进行工作。单片机定时器的应用也与中断处理相似,需要设置一些规定的寄存器,以此来规定单片机的工作状态。

一、多位数码管显示程序

定义一个数组Dat[ ]={0,0,0,0}存放4位数,初值都为0。用变量S作为计数,tmp作为片选值。

数字分离:百位数分离用Dat[0] = S/100,例如S=235则S/100=2,Dat[]是整数,小数部分自动删除。十位数分离用Dat[1]=S%100/10公式解决,S%100取除100的余数,再把这个余数除10,就得到十位数了。例如,还是以上数字S=235,S%100/10=3。最后是个位数的分离,用Dat[2]=S%10,取S除以10的余数。

这里Dat[0]存放百位数,Dat[1]存放十位数,Dat[2]存放个位数。在输出时要按从高到低的顺序输出,不能搞错,否则数字就反了。在输出时,先选定片选值,即决定在哪个数码管输出,送到P2口,因为我们将片选线接在P2口。第1个片选值是1,根据数码管的标识在最左边位输出,然后通过P0口输出码段值,这时,就会在第1位显示数据了。接着,把片选值向左移动一位,为下一位输出做准备,停留片刻后进行下一位输出。这样,共循环3次,将3位数都输出显示在数码管上了。因为,我们的眼睛有视觉残留,所以感觉3位数字一起显示出来。但由于在输出完毕后还要停留较长时间才会进入下一个数的显示,输出会有闪烁的感觉。

#include <reg51.h>//单片机头文件
unsigned char code Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管码段表
unsigned char Dat[]={0,0,0,0};//存放4位数据数组
unsigned char tmp,i,j;//定义临时变量、循环变量
unsigned int S=0;//定义计数变量
void Delay(int n)//延时子程序
{
	int i;
	for(i=0;i<n;i++);
}
void main()//主程序
{
	while(1)//无限循环
	{
		S++;//计数值加1
		if(S>500)//如果计数值大于500则清零
			S=0;
		Dat[0]=S/100;//取计数值的百位数
		Dat[1]=S%100/10;//取计数值的十位数
		Dat[2]=S%10;//取计数值的个位数
		
		tmp=0x01;//片选初值
		for (i=0;i<3;i++)//循环3次
		{
			P2=tmp;//将片选值送P2口
			 P0=Tab[Dat[i]];//将某一位码段值送P0口
			tmp=tmp<<1;//片选值移至下一位
			Delay(500);//调用延时子程序
		}
		for(i=0;i<150;i++)//延时一段时间
		for(j=0;j<100;j++)
		Delay(60000);//调用延时子程序
	}
}

二、定时器原理

单片机定时/计数器的工作原理及工作方式,可以参考https://blog.csdn.net/kafmws/article/details/88046805这篇博文,在此不赘述。

计算定时器的初值,计算公式和一般方法如下:

1)T(初值)=2^N-定时时间/机器周期时间

2)N与工作方式有关

方式0           N=13

方式1           N=16

方式2、3     N=8

3)1机器周期时间=12/fosc=12/12MHz=1μs

例:晶振12MHz,求方式1,T0定时0.2ms初值

2^16-200/1=65536-200=FF38H则,高位TH0=FFH,低位TL0=38H

再举个例子,用T0,方式1,计时0.05s,设计一个发光二极管闪烁(0.05s开关一次)程序。计算初值。(-50000的补码为2^16-50000)

高位TH0=-50000/256

低位TL0=-50000%256

#include <reg51.h>//单片机头文件
sbit led=P0^0;//定义发光二极管引脚
void main()//主程序
{
EA=1;//允许所有中断
ET0=1;//允许T0中断
TMOD=0x01;//T0方式1计时0.05S
TH0=-50000/256;//定时器T0的高八位
TL0=-50000%256;//定时器T0的低八位
TR0=1;//启动T0定时器
for(;;);//无限循环
}
void intserv1 (void) interrupt 1 using 1//定时器0中断服务子程序,中断号1
{
TH0=-50000/256;//重新定义初值
TL0=-50000%256;
LED=!LED;//电平取反
}

编译程序,在单片机上加载程序,可看到发光二极管0.05s的闪烁。由于间隔时间很短,发光二极管闪烁的很快。如何能使得间隔时间长一点呢?这就需要把定时器初值设的大一点,但是,最大也不能超过2^16,即65536,也就65536μs=0.065536s。如果要设置成1s闪烁一次该怎么办呢?显然,定时器初值设置成1s是不可能的,只有另外设置变量来延长定时时间。

我们修改一下中断处理程序如下:

void intserv1 (void) interrupt 1 using 1
{
TH0=-50000/256;//重新定义初值
TLO=-500005256;
t++;//变量t加1
if(t>=20)//如果变量t=20;
{
t=0;//变量t清零
LED=!LED;//电平取反
}
}

在程序头部加上一个全局变量t,定义为unsigned char t;,作为中断子程序的中间变量。每次定时器时间到,处理中断时,给变量t加1,若t=20,就是0.05s×20=1s。即每次0.05s时间到中断时并不执行发光二极管电平取反,直到20次时,就是1s时,才执行一次。这样就实现了定时1s的功能。

三、程序设计与仿真

在前面我们实现了多位数码管显示程序,并学习了1s定时器功能的实现,两者结合,设计一个四位数码管计数器。前2位表示分钟,后2位表示秒。从0分0秒开始计时,逢60进1,每秒变化一次。

proteus 电路

程序

#include <reg51.h>//单片机头文件
unsigned char code Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管码段表
unsigned char Dat[]={0,0,0,0};//存放4位数字数组

int i ,t;//定义变量,作为循环,定时计数
unsigned char tmp;//定义片选变量
unsigned char second=0,min=0;//定义秒、分变量
void Delay()//延时子程序,作为数码管显示延迟
{
	unsigned char i;
	for(i=0;i<250;i++);
}

void main()
{
	IT0=1;EX0=1;//开外部中断0和外部中断0允许
	IT1=1;EX1=1;//开外部中断1和外部中断1允许
	EA=1;//允许所有中断
	ET0=1;//允许T0中断
	TMOD=0x01;//T0方式1计时0.05S
	TH0=-50000/256;//定时器T0的高八位
	TL0=-50000%256;//定时器T0的低八位
	TR0=1;//启动定时器0
	while(1)//无限循环
	{
		tmp=0x01;//片选初值
		for(i=0;i<4;i++)//循环4次
		{
			P2=tmp;//片选初值
			P0=Tab[Dat[i]];//输出某一位数字的码段值
			tmp=tmp<<1;//片选值左移一位
			Delay();//调用延时
		}
	}
}

void intserv1 (void) interrupt 1 using 1//定时器0中断服务子程序
{
	TH0=-50000/256;//定时器高八位赋值
	TL0=-50000%256;//定时器低八位赋值
	t++;//变量t加1
	if(t==20)//20次到,即1秒到
	{
		t=0;//变量t清零
		second++;//秒加1
		if(second>=60)//60秒到
		{
			second=0;//秒变量清零
			min++;//分加1
			if(min>=60)//60分到
				min=0;//分变量清零
		}
		Dat[0]=min/10;//计算分高位
		Dat[1]=min%10;//计算分低位
		Dat[2]=second/10;//计算秒高位
		Dat[3]=second%10;//计算秒低位
	}
}

void intersvr0 (void) interrupt 0 using 1//外部中断0子程序
{
	min++;//分加1
	if(min>=60)//如果分到60
		min=0;//分清零
}

void intersvr1 (void) interrupt 2 using 1//外部中断1子程序
{
	second++;//秒加1
	if(second>=60)//如果秒到60
		second=0;//秒清零
}

总结

定时1S的功能将会在很多程序功能中被使用,需要大家好好学习消化这一知识点。

标签:10,定时器,void,unsigned,Dat,数码管,proteus,keil5
From: https://blog.csdn.net/muling0504/article/details/136876388

相关文章

  • 基于EP4CE6F17C8的FPGA单数码管秒计数实例
    一、电路模块本例的电路模块与“基于EP4CE6F17C8的FPGA数码管动态显示实例”中的完全一样,此处就不再给出了。二、实验代码本例实现1个数码管循环显示字符1~F,显示间隔为1秒,代码使用Verilog编写,采用例化的形式,共有三个文件。先编写数码管实现显示字形解码的程序,模块名称为seg_de......
  • FPGA入门笔记008——数码管动态扫描设计与验证
    #FPGA入门笔记008——数码管动态扫描设计与验证1、数码管动态扫描原理​ 8段数码管的结构图如图1所示:图1——8段数码管结构图(a为共阴极,b为共阳极)​ 对于共阴数码管需要给对应段以高电平才会使其点亮,而对于共阳极数码管则需要给低电平才会点亮。AC620上板载的是共阳极数......
  • STM32 TIM3 定时器应用之数码管显示定时时间
     实现目标1、STM32基于HAL库定时器的使用;2、加强数码管的学习。一、定时器概述?1、生活中哪些场景会用到定时器?2、STM32F1定时器二、原理图设计三、STM32CubeMX配置1.定时器时钟配置2.定时器3、数码管、蜂鸣器的配置  3.开启定时器3中断四、程序......
  • libtorch实现一个数码管数字识别网络
    这里的数字范围是0~9共10个数字,用5×3的数字矩阵表示,把它当成图像那么可以看成5×3的图片。如下图中的数字0,用“1”代表有颜色(亮),“0”代表没颜色(灭)。网络是经典的BP神经网络,15个输入,10个输出。当输入是形状“0”时,输出索引为0的数字最大接近于1;当输入是形状“1”时,输出索引为1的......
  • 基于EP4CE6F17C8的FPGA数码管动态显示实例
    一、电路模块1、数码管开发板板载了6个数码管,全部为共阳型,原理图如下图所示,段码端引脚为DIG[0]~DIG[7]共8位(包含小数点),位选端引脚为SEL[0]~SEL[5]共6位。端口均为低电平有效。其实物图如下所示。数码管引脚分配见下表。2、时钟晶振开发板板载了一个50MHz的有源晶振,为系统......
  • 609、基于单片机的秒表(倒计时,数码管,独立按键)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括需要完整的资料可以点击下面的名片,找我要资源......
  • 学习C51单片机——独立按键控制数码管显示数字(学习笔记Keil5)
    学习C51单片机——独立按键控制数码管显示数字(学习笔记Keil5)文章目录学习C51单片机——独立按键控制数码管显示数字(学习笔记Keil5)1、按键控制数码管第一位显示数字22、按键控制数码管第一位按顺序显示数字0~91、按键控制数码管第一位显示数字2按键按下数码管第一位......
  • 学习C51单片机——动态数码管显示(学习笔记Keil5)
    学习C51单片机——动态数码管显示(学习笔记Keil5)文章目录学习C51单片机——动态数码管显示(学习笔记Keil5)1、延时函数2、数码管动态显示1、延时函数延时100msvoidDelay100ms(void) //@12.000MHz{ unsignedchardatai,j; i=195; j=138; do { while......
  • VK1650是LED数显/数码管显示驱动控制电路(IC),8*4共阴/4*8共阳
    概述VK1650是一种带键盘扫描电路接口的LED驱动控制专用芯片,内部集成有数据锁存器、LED驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx4GRID的点阵LED显示。最大支持7x4按键。本芯片性能稳定质量可靠,抗干扰能力强,适用于24小时长期连续工作的引用场合。采用S......
  • DSP笔记[2]-数码管显示英文字母及在flash上运行
    摘要在TMS320F28335开发板上实现8位数码管显示英文字母及烧录程序到Flash中断电程序不丢失;矩阵键盘扫描,实现按键1清零,按键2累加,按键3显示字母,按键4显示数字,按键5开关LED灯;LED流水灯.关键信息系统:macOS13.5(AppleSiliconM2)(烧录)系统:windows11(arm64)(编译)......