这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 高校专区» 坤创E-Geek/天科大新电社» 第十一届蓝桥杯信息技术人才大赛-单片机竞赛备赛分享二 —— 蓝桥杯P0端口实战应

共3条 1/1 1 跳转至

第十一届蓝桥杯信息技术人才大赛-单片机竞赛备赛分享二 —— 蓝桥杯P0端口实战应用

工程师
2020-01-13 12:01:59 打赏

哈喽哈喽大家好,我是阿飞的小蝴蝶,大家可以叫我阿飞或者小飞,没错,我又来了。。。


昨天更新了一篇帖子主要讲解了一下蓝桥杯板子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)<
        

这个程序还是比较简单的,我们先对板子进行初始化,上电时关掉所有的外设,然后 再通过“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();” 来改变P0的控制方向。
对了,关于蜂鸣器和继电器那块,昨天有一个地方忘了说, 认真看过这部分原理图的同学可能会有疑问:明明应该是低电平打开高电平关闭 呀。。。这里我们要看那一个模块后边接的芯片 “ULN2003” ,感兴趣的同学可以 再去问一下百度。简单说就是芯片里有很多的非门,每一个输入都会取反输出, 这样一来低电平就变成了高电平打开低电平关掉喽。


是不是感觉这篇帖子换行换的很古怪,没错我也这么觉得,中间插入了代码语言以

后,后边的内容不知道怎么的都不自动换行了,心里苦呀。。。

好的,今天的内容就先分享到这里啦,大家记得多多练习,预祝大家能取得好成绩

奥里给!!





关键词: 蓝桥杯 单片机 竞赛 第十一届 赛前 备赛 经验分

高工
2020-01-17 23:49:43 打赏
2楼

消灭零回复,支持小飞飞


菜鸟
2020-03-29 21:10:35 打赏
3楼

在138选择代码中,P2与运算时为什么要加括号啊


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]