这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创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)<<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” ,感兴趣的同学可以 再去问一下百度。简单说就是芯片里有很多的非门,每一个输入都会取反输出, 这样一来低电平就变成了高电平打开低电平关掉喽。


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

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

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

奥里给!!





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

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

消灭零回复,支持小飞飞


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

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


共3条 1/1 1 跳转至

回复

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