本文适用于
CT107D
竞赛板+
IAP15
转接板
控制原理
CT107D
竞赛板中共有4块74HC537D
锁存器,它们使P0
成为控制总线,控制LED灯、四相步进电机、继电器、直流马达、蜂鸣器、LM386
及数码管显示(或8x8LED矩阵)。另外,138编码器及02或非门,用来选择锁存器,即P27
P26
P25
三个I\O
口,用于选择锁存器。
138编码器及02或非门
先是P27
P26
P25
组成三位二进制数,先由138编码器将对应管脚拉低其余管脚拉高,再接入或非门。一般情况下,J13
短接的是WR
和GND
脚,即IO
模式。其作用是将Y4
Y5
Y6
Y7
四个管脚取反,原先被拉低的管脚,变成唯一被拉高的管脚,达到片选的目的。
关于138编码器,其特性如下:
C | B | A | 被拉低管脚 | 锁存器编号 | 对应可控元件 |
---|---|---|---|---|---|
H | L | L | Y4 | U6 | LED灯 |
H | L | H | Y5 | U9 | 继电器、蜂鸣器等 |
H | H | L | Y6 | U8 | 数码管位选 |
H | H | H | Y7 | U7 | 数码管段选 |
而Y0
Y1
Y2
管脚是空闲的,所以控制完成后P27
P26
P25
全部拉低即可。
控制LED灯
将P27
P26
P25
设置成H
L
L
,选择U6
锁存器,以控制LED灯。
注意:拉低为点亮,拉高为熄灭。
控制继电器和蜂鸣器
将P27
P26
P25
设置成H
L
H
,选择U9
锁存器,以控制继电器和蜂鸣器。
实际操作中,将P04
拉高,通过ULN2003
取反,继电器打开,同时L10
点亮;将P07
拉高,通过ULN2003
取反,蜂鸣器响(无需调制方波信号)。
ULN2003
是一个高电压、高电流的驱动器,其逻辑上相当于非门。
数码管显示
将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();
}
}