蓝桥杯单片机 赛后资料整理(一)——573锁存器


本文适用于 CT107D竞赛板+ IAP15转接板

控制原理

CT107D竞赛板中共有4块74HC537D锁存器,它们使P0成为控制总线,控制LED灯、四相步进电机、继电器、直流马达、蜂鸣器、LM386及数码管显示(或8x8LED矩阵)。另外,138编码器及02或非门,用来选择锁存器,即P27 P26 P25三个I\O口,用于选择锁存器。

138编码器及02或非门

pic1
先是P27 P26 P25组成三位二进制数,先由138编码器将对应管脚拉低其余管脚拉高,再接入或非门。一般情况下,J13短接的是WRGND脚,即IO模式。其作用是将Y4 Y5 Y6 Y7四个管脚取反,原先被拉低的管脚,变成唯一被拉高的管脚,达到片选的目的。

关于138编码器,其特性如下:

CBA被拉低管脚锁存器编号对应可控元件
HLLY4U6LED灯
HLHY5U9继电器、蜂鸣器等
HHLY6U8数码管位选
HHHY7U7数码管段选

Y0 Y1 Y2管脚是空闲的,所以控制完成后P27 P26 P25全部拉低即可。

控制LED灯

pic2
P27 P26 P25设置成H L L,选择U6锁存器,以控制LED灯。

注意:拉低为点亮,拉高为熄灭。

控制继电器和蜂鸣器

pic3
P27 P26 P25设置成H L H,选择U9锁存器,以控制继电器和蜂鸣器。

实际操作中,将P04拉高,通过ULN2003取反,继电器打开,同时L10点亮;将P07拉高,通过ULN2003取反,蜂鸣器响(无需调制方波信号)。

ULN2003是一个高电压、高电流的驱动器,其逻辑上相当于非门。

数码管显示

pic4
P27 P26 P25设置成H H L,选择U8锁存器,即数码管位选。
P27 P26 P25设置成H H H,选择U7锁存器,即数码管段选。

注意:竞赛板为共阳数码管

代码模板

#include<reg52.h>

#ifndef u8
#define u8 unsigned char
#endif

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit RELAY = P0^4;
sbit BUZZ = P0^6;

u8 code font[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//"共阳数码管"的字模
u8 code y4=0x80;y5=0xa0;y6=0xc0;y7=0xe0;
//用于锁存器片选
u8 dis[8],val1=123,val2=234;
//用于数码管显示
bit relay=1,buzz=1,l1=0,l2=0;

void display();			
void delay100us();		//延时

void delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}

void display(){
	u8 i;

	//将val1,val2的值,调整成想要的格式
	dis[0]=0xbf;
	dis[1]=font[val1/100];
	dis[2]=font[val1/10%10];
	dis[3]=font[val1%10];
	dis[4]=0xbf;
	dis[5]=font[val2/100];
	dis[6]=font[val2/10%10];
	dis[7]=font[val2%10];

	for(i=0;i<8;i++){
		//数码管位选
		P2&=0x1f;	   
		P0=1<<i;	  
		P2|=y6;		   
		//数码管段选
		P2&=0x1f;	  
		P0=dis[i];	  
		P2|=y7;		  
		delay100us();  
		P0=0xff;	   //消隐
	}
	//控制继电器和蜂鸣器
	P2&=0x1f;
	P0=0x00;RELAY=relay;BUZZ=buzz;
	P2|=y5;
	//控制LED灯
	P2&=0x1f;
	P0=0xff;L1=l1;L2=l2;
	P2|=y4;
	//将P27 P26 P25管脚拉低
	P2&=0x1f;
}
int main(){
	while(1){
		display();	
	}
}
  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 以下是基于STC12C5A60S2单片机的秒数码管倒计时带573的代码示例: ``` #include <STC12C5A60S2.h> #define uchar unsigned char #define uint unsigned int sbit LATCH = P2^0; // 控制引脚 sbit DIO = P2^1; // 数据引脚 sbit CLK = P2^2; // 时钟引脚 uchar code LED_DuanMa[] = { // 数码管段码表 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; void delay(uint t) // 延时函数 { uint i, j; for (i = t; i > 0; i--) { for (j = 110; j > 0; j--); } } void HC595_SendData(uchar dat) // 向74HC573发送数据 { uchar i; for (i = 0; i < 8; i++) { CLK = 0; DIO = (dat & 0x80) >> 7; dat <<= 1; CLK = 1; } } void Display(uchar *p) // 在数码管上显示数字 { HC595_SendData(~0x01); // 先清除输出 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*p]); // 显示个位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 1)]); // 显示十位 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 2)]); // 显示百位 LATCH = 0; LATCH = 1; HC595_SendData(~0x80); // 输出信号 LATCH = 0; LATCH = 1; HC595_SendData(LED_DuanMa[*(p + 3)]); // 显示千位 LATCH = 0; LATCH = 1; } void main() { uchar time[4] = {9, 5, 5, 9}; // 初始时间为 95:59 uint count = 0; while (1) { Display(time); // 显示当前时间 delay(1000); // 延时1秒 if (++count >= 1000) { // 经过1秒 count = 0; if (--time[0] == 0xFF) { // 秒数减1 time[0] = 9; if (--time[1] == 0xFF) { // 十位秒数减1 time[1] = 5; if (--time[2] == 0xFF) { // 分钟数减1 time[2] = 9; if (--time[3] == 0xFF) { // 小时数减1 time[3] = 9; } } } } } } } ``` 与前面的代码示例相比,本代码加入了74HC573芯片作为,可以确保计时的精度,并且可以实现秒数码管的倒计时。在计时过程中,可以通过 `time` 数组来设置和获取当前时间值。通过修改 `delay` 函数中的参数值可以调整计时的计时间隔。需要注意的是,由于74HC573的信号是高电平有效,因此在输出信号时需要向芯片发送 `~0x80` 的数据,即取反后最高位为0,其余位为1的数据。 ### 回答2: STC1299是一款常见的单片机,秒数码管倒计时带573是一种常见的倒计时电路。在这种电路中,通过STC1299控制573,实现倒计时的功能。 代码的实现步骤如下: 1. 首先,需要定义和初始化倒计时所需的相关变量,比如秒、分钟、小时等。 2. 设置STC1299的引脚连接。将STC1299的输出引脚与573的数据引脚相连,将STC1299的控制引脚与CLK和STB引脚相连。 3. 编写程序的主循环。在循环中,通过STC1299的控制引脚产生时钟信号,使得573逐位接收STC1299的输出,并将其储。这样可以实现对倒计时数据的更新和显示。 4. 在循环中,通过STC1299的控制引脚产生时钟信号的频率来控制倒计时的速度。可以通过改变时钟信号的频率,实现倒计时速度的调整。 5. 当倒计时结束时,可以通过编写相应的程序逻辑,实现相应的处理。比如,可以发出蜂鸣的声音或者改变LED灯的状态,以提醒倒计时结束。 通过以上步骤,就可以实现使用STC1299控制573的倒计时功能。具体的代码和电路连接方式需要根据具体的情况进行设计和调整。 ### 回答3: STC1299是一款单片机芯片,能够通过编程实现秒数码管的倒计时功能,并带有573。下面是一个简单的代码实现: 首先,我们需要引入STC1299的相关头文件和寄定义: #include <stc/stc12c5a60s2.h> 接下来,我们需要定义一些变量和常量: sbit digit1 = P2^0; // 数码管第一位 sbit digit2 = P2^1; // 数码管第二位 sbit digit3 = P2^2; // 数码管第三位 sbit digit4 = P2^3; // 数码管第四位 sbit latch = P1^2; // 573控制引脚 unsigned char display[4]; // 储数码管数字的数组 unsigned char count = 60; // 倒计时初始值 然后,我们需要编写一个倒计时函数: void countdown() { while(count > 0) { // 数字转换为7段数码管对应的编码 display[0] = count / 10; display[1] = count % 10; // 依次显示每一位数字 digit1 = 1; P0 = display[0]; digit1 = 0; digit2 = 1; P0 = display[1]; digit2 = 0; // 延时一秒 delay(1000); // 倒计时减一 count--; } } 最后,在主函数中调用倒计时函数即可实现倒计时功能: void main() { // 初始化 latch = 0; // 循环进行倒计时 while(1) { countdown(); } } 以上就是简单的STC1299秒数码管倒计时带573的代码示例。通过这段代码,可以实现将倒计时从60秒开始逐渐减少,并在数码管上显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值