哈喽哈喽大家好,我是阿飞的小蝴蝶,大家可以叫我阿飞或者小飞,没错,我又来了。。。
昨天更新了一篇帖子主要讲解了一下蓝桥杯板子LED灯、数码管、蜂鸣器继电器等模块的使用,我们都知道,不管是蓝桥杯试题还是将来要写的其它程序,我们都不可能是只点亮一个灯或者是只点亮一些数码管就可以的,通常都是很多个模块联系在一起的,这样的话他们之间的一些关联、资源分配什么的就需要多考虑一些,但是透过问题来看本质,不管多么强大的功能,它们都是通过一个个的模块来叠加在一起实现的,如果我们能把每个模块都熟练掌握,那么接下的问题才能迎刃而解,好的话不多说了,直接开始我们今天的内容
今天我们的的任务是把昨天讲解的模块来综合在一起写一个程序,现在我来出一个题目:首先关掉板子上的蜂鸣器、继电器,然后我们用延时函数的方实现从L0~L7间隔500ms的流水灯,这个程序是很简单的,我们就不说太多了,直接开始我们的编程:
#include "reg52.h" #define u8 unsigned char #define u16 unsigned int void HC138(u8 i) { switch(i) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } void delayms(u16 z) //1ms延时函数 { u16 x,y; for(x=z;x>0;x--) for(y=845;y>0;y--); } void init_P0(void) //开发板初始化 { HC138(4); //选中LED灯模块 P0 = 0xff; //关闭所有LED灯 HC138(5); //选中蜂鸣器等相关功能 P0 = 0x00; //关闭所有外设 HC138(6); //选中数码管位选 P0 = 0xff; //选中所有数码管 HC138(7); //选中数码管段选 P0 = 0xff; //关闭所有数码管 } void main() { u8 led = 0; init_P0(); HC138(4); while(1) { P0 = ~(~(0xfe)<<led); delayms(500); led++; if(led == 8) led = 0; } }
这个程序还是比较简单的,我们先对板子进行初始化,上电时关掉所有的外设,然后
再通过“HC138(4);”让P0端口控LED灯模块就可以直接对P0端口赋值来控制LED,
我们这里使用了左移运算符 “<<” 来改变P0的数值使LED灯流水,不太懂的同学可以
再去问一下百度,然后再品一下这句代码,你品,你细品
没错这题是很简单的我就不再说太多了,我们开始下一题:把上题的流水灯间隔
改为1s,流水的同时让数码管任意一位显示当前是第几位灯在亮(LED灯从左到
右用数字1~8来表示)亮完一遍时蜂鸣器响1s,同时闭合继电器1s。
好的我们直接来看一下程序:
#include "reg52.h" #define u8 unsigned char #define u16 unsigned int u8 code smgdu[] = {0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; //数码管段选码(0~8) void HC138(u8 i) { switch(i) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } void delayms(u16 z) { u16 x,y; for(x=z;x>0;x--) for(y=845;y>0;y--); } void init_P0(void) { HC138(4); P0 = 0xff; HC138(5); P0 = 0x00; HC138(6); P0 = 0xff; HC138(7); P0 = 0xff; } void main() { u8 led = 0; init_P0(); while(1) { HC138(4); //P0控制LED灯 P0 = ~(~(0xfe)<<led); //实现流水灯 HC138(6); //P0控制数码管位选 P0 = 0x01; //选择第一位数码管 HC138(7); //P0控制数码管段选 P0 = smgdu[led]; //数码管显示对应数字 delayms(1000); //延时1S led++; if(led == 8) //LED灯亮完一轮时 { led = 0; HC138(5); //P0控制蜂鸣器、继电器等 P0 = 0x50; //打开蜂鸣器继电器 } else { HC138(5); P0 = 0x00; //关闭蜂鸣器继电器 } } }
这里关于LED灯的部分跟上一题几乎是相同的,
然后我们加上了数码管、继电器、蜂鸣器,这时候我们就需要在程序循环执行的
过程中通过 “HC138();” 来改变P0的控制方向。
对了,关于蜂鸣器和继电器那块,昨天有一个地方忘了说,
认真看过这部分原理图的同学可能会有疑问:明明应该是低电平打开高电平关闭
呀。。。这里我们要看那一个模块后边接的芯片 “ULN2003” ,感兴趣的同学可以
再去问一下百度。简单说就是芯片里有很多的非门,每一个输入都会取反输出,
这样一来低电平就变成了高电平打开低电平关掉喽。
是不是感觉这篇帖子换行换的很古怪,没错我也这么觉得,中间插入了代码语言以
后,后边的内容不知道怎么的都不自动换行了,心里苦呀。。。
好的,今天的内容就先分享到这里啦,大家记得多多练习,预祝大家能取得好成绩
奥里给!!