仿真图:
芯片/模块的特点:
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)
;
}
}
}
设计文件: