蓝桥杯单片机备赛(1)指南
目录
一、开发板原理图:
二、基础外设原理图
1.LED
2.数码管
3.继电器、蜂鸣器
4.控制部分
三、LED、蜂鸣器、继电器部分的软件设计
一、开发板原理图:
二、基础外设原理图
1.LED

8个LED外接上拉电阻,通过M74HC573M1R锁存器与P0端口相连接,Y4C作为锁存器的使能端输入。
2.数码管

两组数码管共8个,为共阳极数码管。位选端和段选端通过M74HC573M1R锁存器与P0端口相连接,Y6C和Y7C做使能端输入。
3.继电器、蜂鸣器

继电器、蜂鸣器都通过ULN2003(达林顿管)与M74HC573M1R锁存器连接,M74HC573M1R锁存器与P0端口相连接,Y5C做使能端输入。【达林顿管起反向作用,即输入1出0,输入0出1】
4.控制部分
根据LED、蜂鸣器、继电器的原理图可以看出,所有锁存器的使能端都被连接到了Y4C,Y5C,Y6C,Y7C,于是若要实现软件编程控制这几部分的工作状态就要在原理图找到和他们相关的IO端口。
于是在原理图中可以找到如下部分
其中74HC02是或非门,74HC138为3-8译码器,可以看出通过P2端口的P25、P26、P27三位输出来控制Y0~Y7的状态。
因为LED、蜂鸣器、继电器都是通过M74HC573M1R锁存器于P0端口相连接,只是分别对应的使能端不一样,所以则若要实现对LED、蜂鸣器、继电器的控制实际上就通过P2端口的三位输出来选通此时P0端口数据要传送的对象。
P25 P26 P27 | 使能端 |
---|---|
1 0 0 | Y4C |
1 0 1 | Y5C |
1 1 0 | Y6C |
1 1 1 | Y7C |
三、LED、蜂鸣器、继电器部分的软件设计
第一节描述到,因为LED、蜂鸣器、继电器都是通过M74HC573M1R锁存器于P0端口相连接,只是分别对应的使能端不一样,所以则若要实现对LED、蜂鸣器、继电器的控制实际上就通过P2端口的三位输出来选通此时P0端口数据要传送的对象。所以在控制LED、蜂鸣器、继电器任何一部分时都要通过P2口选通对应的锁存器。
代码设计如下
/*
2023年3月15日练习
完成LED、蜂鸣器、继电器的基本功能验证
实现功能:LED流水灯、流水显示数码管每一位
蜂鸣器开启关闭、继电器吸合断开
*/
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/************* 本地常量声明 **************/
uchar code t_display[]={ //标准字库(共阴极)
// 0 1 2 3 4 5 6 7 8
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F};
uchar code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
void Select_573(uchar addr,dat)
{
P0=dat;
switch(addr)
{
//保持低五位不变,将高三位清零后重载对应值使相应端口使能(先与再或)
case 4:P2=P2&0X1F|0X80;break;//Y4C使能>>>>>>>>LED
case 5:P2=P2&0X1F|0XA0;break;//Y5C使能>>>>>>>>蜂鸣器、继电器
case 6:P2=P2&0X1F|0XC0;break;//Y6C使能>>>>>>>>数码管位选
case 7:P2=P2&0X1F|0XE0;break;//Y7C使能>>>>>>>>数码管段选
}
P2=P2&0X1F;//将使用过的P25、P26、P27清零
}
void Delay50ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 72;
k = 161;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Led_run()
{
//流水灯验证LED功能
uchar i=0;
for(i=0;i<9;i++)
{
//P0口输出0X00LED全亮>>>>>>>>对于P0口输出来说:LED 0亮 1灭
Select_573(4,0X00);
Select_573(4,0XFF<<i);
Delay50ms();
}
}
void Dpy_run()
{
//流水验证数码管功能:每一位显示0~7后切换下一位
uchar i=0;
uchar a=0;
for(a=0;a<8;a++)
{
for(i=0;i<8;i++)
{
Select_573(6,T_COM[a]);
Select_573(7,~t_display[i]);//共阴极段码取反即为共阳极对应段码
Delay50ms();
}
}
}
void Buz_run()
{
Select_573(5,0X40);//P0口第七位输出高电平>>>>蜂鸣器开
Delay50ms();
Select_573(5,0XBF);//P0口第七位输出低电平>>>>蜂鸣器关
Delay50ms();
}
void Relay_run()
{
Select_573(5,0X7F);//P0口第五位输出低电平>>>>继电器吸合
Delay50ms();
Select_573(5,0X10);//P0口第七位输出高电平>>>>继电器断开
Delay50ms();
}
void main()
{
while(1)
{
Led_run();
Dpy_run();
Buz_run();
Relay_run();
}
}
作者:佪億