前言
报名了3月份的蓝桥杯比赛,特地写博客来记录自己的学习。
开发工具
开发板:CT107D+
编译环境:Keil5
原理简介
在以前学习51单片机的时候,可以通过置1(高电平)和0(低电平)的方式来使LED、蜂鸣器工作。但在CT107D+开发版上还需一些初始化
蜂鸣器原理图 :可知给 BUZZ 这个IO口置0(低电平)就能完成蜂鸣器的使用。
再看 BUZZ 连接在单片机的那个 GPIO 口
清楚看见 BUZZ 连接在 P0^6 ,但有一个锁存器(74HC573)和 ULN2003 挡在中间.
我们使用蜂鸣器的思路为:
打开锁存器,使得 P0^6(D7)控制Q7输入到IN7然后输出到OUT7端口即BUZZ端口。
如何打开锁存器呢?因为OE端口已共地,我们只需控制LE端口,即当LE = 1,锁存器打开,即此时 Q7电平受到D7影响 即:P0^6(D7) = Q7(电平状态),若LE = 0 ,则 Q7的电平状态不受D7影响,即Q7等于上一个锁存器关闭时的电平状态。
我们现在需要给Y5C(LE)端口置1(高电平)以此来打开锁存器
再翻开发板原理图找:
74HC02 是个非门电路,即 Y5C = ! (Y5 || WR) ,WR端口有跳线帽共地,WR为低电平。
(!:代表非运算,0变1, 1变0; ||:或运算, 1 || 0 =1, 0 || 0 = 0;)
要使 Y5C = 1,即 !(Y5 || WR) = 1, 所以 (Y5 || WR)= 0, 又因为WR = 0, 所以 Y5 = 0。
所以我们需要使Y5 端口的电平为 低电平。
又通过原理图可知:Y5的输出由P2端口的高三位控制
翻阅74HC138译码器的芯片手册可知
A B C Y1 Y2…和原理图上的标号对应端口一致 X:不用在意 L: 低电平 H:高电平
看不懂没关系,我们去学长博客那边偷图:
可知P2的高三位不同的电平排序,代表了不同的电平输出
我们想控制 Y5 为低电平, 即P27 = 1, P26 = 0, P25 = 1;P2口的低五位的电平不影响Y5低电平的输出 。
我们的原理部分大致讲的差不多了。
再来理一下思路:
蜂鸣器程序代码
蜂鸣器部分:
sbit BEEP = P0^6; //蜂鸣器接口
void BEPP_init()
{
P2 = (P2&0X1F)| 0XA0; // 1f , a0 均为16进制编码,可用计算器计算得出
/* 打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平).
再使上三位等于1 0 1 (置1采用或运算),操控Y5 */
BEEP = 0; //初始化,关闭蜂鸣器
}
继电器
根据原理图可知:在锁存器打开的情况下 继电器由 P0^4 端口控制。
其原理与蜂鸣器原理大致相同。
和蜂鸣器相同,同样是通过译码器使 Y5 = 0, 再经过非门操作打开锁存器
代码
sbit RELAY = P0^4; //继电器接口
void RELAY_init()
{
P2 = (P2&0X1F)| 0XA0; //原理一样,同样操控Y5
RELAY = 0; //初始化,关闭继电器
}
LED
原理图:在锁存器打开的情况下,P0口直接操控 LED灯,刚好都是八位。
和蜂鸣器不同的是,通过P2高三位操控译码器使 Y4 = 0, 再经过非门操作打开锁存器
代码
void LED_init()
{
P2 = (P2&0X1F) | 0X80;
/*打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平)
再使上三位等于1 0 0 (置1采用或运算),操控Y4 */
P0 = 0XF0; //初始化,点亮一半的灯
}
完整工程代码
#include <reg52.h>
sbit BEEP = P0^6; //蜂鸣器接口
sbit RELAY = P0^4; //继电器接口
void BEPP_init(); //蜂鸣器初始化
void LED_init(); //LED初始化
void delay(unsigned int m); //简单的延时函数
void RELAY_init(); //继电器初始化
void main()
{
BEPP_init();
LED_init();
while(1)
{
BEEP = 1;
delay(500);
BEEP = 0;
delay(500);
}
}
void BEPP_init()
{
P2 = (P2&0X1F)| 0XA0; //打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平),再使上三位等于1 0 1 (置1采用或运算),操控Y5
BEEP = 0; //初始化,关闭蜂鸣器
}
void RELAY_init()
{
P2 = (P2&0X1F)| 0XA0;
RELAY = 0; //初始化,关闭继电器
}
void LED_init()
{
P2 = (P2&0X1F) | 0X80; //打开锁存器74HC573, P2上三位置零(置零采用与运算不改变下五位电平),再使上三位等于1 0 0 (置1采用或运算),操控Y4
P0 = 0XF0; //初始化,点亮奇数灯
}
void delay(unsigned int m) //简单的延时函数
{
unsigned int i;
unsigned int j;
for(i=0;i<m;i++)
for(j=0;j<309;j++);
}