基于51单片机的频率计数码管显示仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

74HC373特点:
透明锁存器功能:74HC373能够在时钟输入有效的情况下,将输入数据锁存到输出端。锁存器的运行模式可以通过控制输入端G(OE)来选择。

高速操作:74HC373采用高速CMOS技术,具有快速的操作速度。占空比对应着一个时钟周期内高电平与低电平的时间比例。

输入输出:74HC373包含8个数据输入(D0-D7)和8个数据输出(Q0-Q7),可以同时锁存和输出8位数据。

同步输入输出:74HC373具有时钟输入(CLK)和控制输入(G)端。时钟输入用于控制锁存器的锁存操作,控制输入(G)用于使能或禁止输出。

低功耗:74HC373采用CMOS技术,具有较低的功耗,适用于需要节能的应用。

多种封装类型:74HC373可供选择的封装类型包括DIP(双列直插封装)和SOIC(小外形集成电路)等常见类型,方便在不同的电路板上使用。

主程序:

#include <reg52.h>
#include <intrins.h>
sbit OE1 = P1^0;
sbit LE1 = P1^1;
sbit OE2 = P1^2;
sbit LE2 = P1^3;
sbit LED_STATUS = P3^5;
sbit KEY_SET = P3^7;


unsigned long g_cnt; //输入信号1S内脉冲次数变量
unsigned long g_dat = 0;
unsigned int T1RH;
unsigned int T1RL;
bit refreshData = 0;

unsigned char g_Ament[7] = {0, 0, 0, 0, 0, 0, 0};
const unsigned char Segment[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
const unsigned char Select[] = {0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04};
void Delay5us(unsigned int l);

void TimerInit(void) //定时器0与计数器1初始化
{
	TMOD = 0x15; //非门控方式 定时器1 16位定时模式 	定时器0 16位计数模式
	TH1 = T1RH;	 //定时2.5ms初值装入
	TL1 = T1RL;
	TH0 = 0x00; //装入计数初值
	TL0 = 0x00;
	g_cnt = 0;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	ET1 = 1;
	TR1 = 1;

}

void Time0(void) interrupt 1  //计数器0中断服务程序
{
	TH0=0x00;
	TL0=0x00;
	g_cnt++;
}

void Time1(void) interrupt 3 //定时器1中断服务程序
{
    static unsigned int cnt = 0;
    static unsigned char i = 1;

	TH1 = T1RH;
	TL1 = T1RL;
	_nop_();
	P2 = Select[i];
	LE2 = 0;
    _nop_();
	LE2 = 1;
    _nop_();
	P0 = Segment[g_Ament[i]];
	LE1 = 0;
    _nop_();
	LE1 = 1;
    _nop_();
	i++;
	if (i >= 7)
	{
		i = 1;
	}

	cnt++;
	if (cnt >= 400)
	{
		TR0 = 0;
		LED_STATUS = ~LED_STATUS;
		cnt = 0;
	}
}

void Delay5us(unsigned int l)
{
	unsigned int f;
	for (f = 0; f < l; f++)
		;
}
void main(void)
{
	T1RH = 0xF7; //(65536-2304) / 256;  //定时2.5ms初值装入
	T1RL = 0x00 + 5; //(65536-2304) % 256;
	TimerInit();
	OE1 = 0;
    _nop_();
	LE1 = 1;
    _nop_();
	OE2 = 0;
    _nop_();
	LE2 = 1;
    _nop_();
	
	while (1)
	{
		//刷新数据
		if (refreshData)
		{
			g_dat = g_cnt * 65535 + TH0 * 256 + TL0;
			g_Ament[6] = g_dat / 100000;
			g_Ament[5] = (g_dat % 100000) / 10000;
			g_Ament[4] = (g_dat % 10000) / 1000;
			g_Ament[3] = (g_dat % 1000) / 100;
			g_Ament[2] = (g_dat % 100) / 10;
			g_Ament[1] = g_dat % 10;
			refreshData = 0;
			g_cnt = 0;
			TH0 = 0x00; //装入计数初值
			TL0 = 0x00;
			TH1 = T1RH; //定时20ms初值装入
			TL1 = T1RL;
			TR0 = 1;
		}

		//按键检测
		if (!KEY_SET)
		{
			Delay5us(1000);
			if (!KEY_SET)
			{
				TimerInit();
			}
			while (!KEY_SET)
				;
		}
	}
}

设计文件:

链接:https://pan.baidu.com/s/1lObyapm1gMfT8TWFTmaJqQ?pwd=fbrd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值