蓝桥杯单片机设计与开发笔记来源于网络Word格式.docx
- 文档编号:14845521
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:11
- 大小:313.78KB
蓝桥杯单片机设计与开发笔记来源于网络Word格式.docx
《蓝桥杯单片机设计与开发笔记来源于网络Word格式.docx》由会员分享,可在线阅读,更多相关《蓝桥杯单片机设计与开发笔记来源于网络Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
又只需要操作P2口的这三位,不需要配置其他的五位,所以P2端口应该配置为:
P2=((P2&
0x1f)|0x80);
编写代码:
while
(1)
{
for(i=0;
i<
8;
i++)
{
P2=((P2&
//配置74HC573,使其不锁存
P0=~(0x01<
<
i);
//左移i位,按位取反
P2&
=0x1f;
//再次配置74HC573,使其锁存
delay();
//适当延时使LED亮得充分
}
}
看到这里我们可能会感叹点个LED灯都这么麻烦,但是只要你把这个思路理清了,之后的蜂鸣器、继电器、数码管都是这个套路,因为他们共用的P0和P2端口,且都用到了上图3中的锁存器、138译码器和或非门。
这就实现了一个8位的I/O口进行复用的分时来控制多个设备,这种设计是比较好的。
二、蜂鸣器和继电器
查看原理图找到继电器和蜂鸣器所在,然后可以看到(如图5)继电器和蜂鸣器的都是通过ULN2003来驱动的,ULN2003内部集成了7个达林顿管,可以有7路输入输出,这里不仅驱动了继电器和蜂鸣器,还有直流电机与步进电机。
同样,我们只需要控制Y5C和P0口,而Y5C的控制则与Y4C的控制大同小异,这里就不详细讲解了。
我们可以得到控制Y5C的正确配置P2端口的代码为:
0x1f)|0xA0);
我们再看继电器和蜂鸣器的电路,当ULN2003输出低电平时继电器和蜂鸣器才打开,而ULN2003每一路输入输出都加有一个非门,所以ULN2003的输入为高电平时蜂鸣器继电器才打开,为低电平时关闭。
继电器对应的位为P0^4,蜂鸣器对应的位为P0^6,我们将P0口的这两位赋为1时,即P0=0x50时,两个设备均打开。
图5蜂鸣器与继电器电路原理图
代码部分:
//关闭锁存
P0=0x10;
//蜂鸣器关、继电器开
P2&
//打开锁存
数码管显示几乎是每次蓝桥杯单片机设计与开发组竞赛的必考部分,相对于使用LCD1602作为显示设备,使用数码管来显示能够更好的考察参赛选手的单片机基本功,因为CT107D开发平台的设计使得数码管的显示不仅牵扯到数码管显示的基本内容,还涉及到74HC573锁存器,74HC02异或门,74HC138译码器,以及中断的知识,所以这是值得我们重视的一个部分。
一、原理分析
根据CT107D的原理图我们可以看出,数码管显示同样涉及到74HC573、74HC138和74HC02,这与上一节中的LED灯、继电器和蜂鸣器的控制大同小异。
如下图,蓝色标注为位选控制端口,由锁存器U6来控制,需配置红色标注的Y6C来控制锁存;
黄色标注为段选控制端口,由锁存器U7来控制,需配置红色标注的Y7C来控制锁存。
而,控制Y6C与Y7C则需要通过74HC18和74HC02来进行控制,如下图,Y6C由Y6和WR共同控制,74HC02是一个4路2输入或非门功能,WR为低电平,要使Y6C为高,则Y6必须为低电平,即74HC138译码器的三个输入端应该为100,即P2^7=1,P2^6=0,P2^5=0。
0x1f)|0xC0)。
同理,控制Y7C时P2端口应该置为:
0x1f)|0xE0)。
二、示例程序
这里采用前后台的编程思想,即使用定时器中断来处理显示部分,作为前台,而逻辑处理与数据采集部分等则在主程序流程中来完成,作为后台。
在下面这段程序中,定时器每隔2ms中断一次执行一次显示程序,然后继续执行主程序的任务,我们只要修改需要显示的数组即可实现显示不同的数值,使显示部分模块化,程序显示部分只提供外部接口(数组),不修改显示函数,这样不容易出错,而且能够使显示更方便。
#include"
reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳极数码管段选编码数组
uchardspbuf[]={10,10,10,10,10,10,10,10};
//显示数据的数组
uchardspcom=0;
//位选控制变量
voiddisplay()//显示函数
{
0x1f)|0xE0);
//段选消隐
P0=0xff;
0x1f)|0xC0);
//位选
P0=1<
dspcom;
//共阳极数码管位选
//段选
P0=tab[dspbuf[dspcom]];
if(++dspcom==8){//位选编码,循环显示8位
dspcom=0;
}
voidmain()
TMOD=0x01;
//定时器0工作方式1
TH0=(65536-2000)/256;
//初始化
TL0=(65536-2000)%256;
ET0=1;
//开定时器0中断允许位
EA=1;
//开总中断
TR0=1;
//开定时器0
while
(1)
dspbuf[0]=1;
//要显示不同的数据只需要修改此数组的值即可
dspbuf[1]=2;
dspbuf[2]=3;
dspbuf[3]=4;
dspbuf[4]=5;
dspbuf[5]=6;
dspbuf[6]=7;
dspbuf[7]=8;
voidtimer0()interrupt1//定时器0中断服务函数
display();
//2ms显示一次
按键几乎也是每次蓝桥杯单片机设计与开发组竞赛的必考部分,因为这是CT107D开发平台上仅有的输入设备之一,而且按键也是单片机基础开发中常见的器件。
一、独立按键
1、原理分析
用跳帽把J5的引脚2和引脚3接起来,即可使用4个独立按键(如下图):
S7,S6,S5,S4。
按键的一端接到GND,另一端接到P3口的低四位,所以我们只要检测连接按键的P3口的某一位是否为低电平即可确定某一按键是否被按下。
但是,因为存在抖动,所以需要进行消抖处理。
总之,独立按键的按键检测基本流程为:
检测是否有键按下,延时消抖,再次检测是否有键按下,执行按键按下后的相应操作,松手检测。
2、示例程序
sbitS7=P3^0;
sbitS6=P3^1;
sbitS5=P3^2;
sbitS4=P3^3;
//这里以S4为例
if(S4==0)//检测S4是否被按下
delay_ms
(2);
//延时消抖
if(S4==0)//再次检测S4是否被按下
//这里执行按键后需要执行的操作
while(S4==0);
//松手检测
二、矩阵键盘
用跳帽把J5的引脚1和引脚2接起来,即可使用矩阵键盘(如下图)。
矩阵键盘的检测常常采用行列扫描法。
先进行行扫描,给P3口赋值为0x0f,当有键按下时P3口低四位的某一位的高电平会拉低,通过检测P3口高低电平的变化即可确定是哪一行的按键被按下,然后再给P3口赋值为0xf0,同理,当有键按下时P3口的高四位的某一位的高电平会被拉低,通过检测P3口的电平变化即可确定是哪一列的按键被按下,由行列交叉可以确定唯一的一个按键。
先确定行来得到键值的临时值,待确定列后将键值的临时值加上列值得到最终的键值。
当然,这里的按键编号可以进行合理的自定义,不需要和以下程序完全一样。
#include<
reg52.h>
#definetempP3
ucharkey_value=0;
voidkeyscan()//按键扫描函数
temp=0x0f;
if(temp!
=0x0f)//扫描行
delay_ms(10);
switch(temp)
case0x0e:
key_value=0;
break;
case0x0d:
key_value=4;
case0x0b:
key_value=8;
case0x07:
key_value=12;
temp=0xf0;
//扫描列
if(temp==0x70)key_value+=0;
while(temp==0x70);
if(temp==0xb0)key_value+=1;
while(temp==0xb0);
if(temp==0xd0)key_value+=2;
while(temp==0x0d);
if(temp==0xe0)key_value+=3;
while(temp==0x0e);
因为CT107D单片机开发平台采用IAP15F2K61S2单片机,使用的是转接板,由转接板原理图知矩阵键盘接的是P3口的低6位与P4.2、P4.4口,即用P4.2代替了P3.6,P4.4代替了P3.7,所以需要修改部分代码。
#i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯 单片机 设计 开发 笔记 来源于 网络