前言
三月份报名参加蓝桥杯比赛,专门写博客记录学习。
开发工具
开发板:CT107D 编译环境:Keil5
原理简介
以前学51单片机的时候,可以放置1(高电平)和0(低电平)LED、但是在CT107D 开发版也需要一些初始化
蜂鸣器原理图 :可知给 这个IO口置()蜂鸣器的使用可以完成。 再看 BUZZ 连接到单片机的那个 GPIO 口
清楚看见 BUZZ 连接在 P0^6 ,但是有一个锁(74)HC573)和 ULN2003 挡在中间. 我们使用蜂鸣器的想法是:
打开锁定器 P0^6(D7)控制Q7输入到IN7然后输出到OUT7端口即BUZZ端口。
如何打开锁存器呢?因为我们只需要控制我们只需要控制端口,即当,此时锁定器打开 电平受到影响 即:,若 ,则 电平状态不受影响影响,即等于上一个锁定器关闭时的电平状态。
我们现在需要给()端口置1(高电平)打开锁定器 再翻开发板原理图找: 74HC02 是非门电路,即 ,WR端口有跳线帽共地,WR为低电平。
(:代表非运算,0变1, 1变0; ||:或运算, 1 || 0 =1, 0 || 0 = 0;)
要使 ,即 , 所以 , 又因为, 所以
所以我们需要这样做 端口的电平为 低电平。
从原理图可以看出:的输出由高三位控制端口 翻阅74HC可以看到138译码器的芯片手册
A B C Y1 Y2…和原理图上的标号对应端口一致 X:不用在意 L: 低电平 H:高电平 不懂也没关系。我们去学长博客偷图: 可知P不同的电平排序代表不同的电平输出 我们想控制 为低电平, 即;P2口低五位电平不影响Y输出5低电平 。 我们的原理部分大致相同。 再理一下思路:
蜂鸣器程序代码
蜂鸣器部分:
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++);
}