DSP28335学习笔记(2)
实验
点亮LED灯
-
电路设计
共阳极连接
-
软件设计
- 让 F28335 的 GPIO68 管 脚输出一个低电平。
- 使能对应 IO 外设时钟、配置 IO功能和输出模式,上拉设置。
主要程序:
//LED初始化函数 void LED_Init(void) { EALLOW;//关闭写保护 SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // 开启GPIO时钟 //LED1端口配置 GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能 GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出 GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻 GpioDataRegs.GPCSET.bit.GPIO68=1;//设置GPIO输出高电平 EDIS;//开启写保护 } //延时函数 void delay(void) { Uint16 i; Uint32 j; for(i=0;i<32;i++) for (j = 0; j < 100000; j++); } //主函数 void main() { InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟 LED_Init(); // GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1; while(1) { GpioDataRegs.GPCTOGGLE.bit.GPIO68=1;//设置GPIO输出翻转信号 delay(); } }
蜂鸣器实验
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器(无源蜂鸣器)主要由多谐振荡器、 压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成。需要接通电源(1.5~15V 直 流工作电压),多谐振荡器起振,并输出 1.5~5kHZ 的音频信号,阻抗匹配器推 动压电蜂鸣片发声。
电磁式蜂鸣器(有源蜂鸣器)由振荡器、 电磁线圈、 磁铁、 振动膜片及外壳等组成。接 通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
-
硬件电路
无源蜂鸣器的控制需要给其一定频率的脉冲才能发声, 仅给一个高电平或者低电平是不能发声的,因此蜂鸣器模块电路直接将 F28335 引 脚接在 ULN2003 驱动芯片的输入口上,对应通道的输出连接蜂鸣器。
-
软件设计
F28335 的 GPIO6 管脚输出一定频率的脉冲信号。即间隔一定时间翻转 GPIO6 输出电平状态。
//蜂鸣器初始化 void Beep_init() { EALLOW;//关闭写保护 SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // 开启GPIO时钟 //LED1端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;//设置为通用GPIO功能 GpioCtrlRegs.GPADIR.bit.GPIO6=1;//设置GPIO方向为输出 GpioCtrlRegs.GPAPUD.bit.GPIO6=0;//使能GPIO上拉电阻 GpioDataRegs.GPASET.bit.GPIO6=1;//设置GPIO输出高电平 EDIS;//开启写保护 } //主程序 void main() { int i = 0; InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟 LED_Init(); Beep_init(); while(1) { i++; if(i%1000==0) { i = 0; LED1_TOGGLE; } BEEP_TOGGLE;//设置GPIO06输出翻转信号 DELAY_US(100); } }
继电器实验
电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。
- 硬件设计
-
软件设计
-
让 F28335 的 GPIO15 管脚输出高电平。
-
初始化继电器控制 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和输出模式、上拉设置等)。
//宏定义 #define RELAY_ON (GpioDataRegs.GPASET.bit.GPIO15=1) #define RELAY_OFF (GpioDataRegs.GPACLEAR.bit.GPIO15=1) //初始化程序 void Relay_Init(void) { EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟 //继电器端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO15=0; GpioCtrlRegs.GPADIR.bit.GPIO15=1; GpioCtrlRegs.GPAPUD.bit.GPIO15=0; EDIS; GpioDataRegs.GPACLEAR.bit.GPIO15=1; } //主程序 void main() { int i=0; InitSysCtrl(); LED_Init(); Relay_Init(); RELAY_ON; while(1) { i++; if(i%200==0) { LED1_TOGGLE; } DELAY_US(1000); } }
-
矩阵按键控制实验
键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时 也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间 的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长 短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按 键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖
-
软件消抖(延时)
先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。
-
硬件消抖
利用电容的放电延时,采用并联电容法,也可以实现硬件消抖。由于电容两端电压不能突变,使得按键两端的电压平缓变化,直至电容充放电到达一定电压阈值时,单片机才读取到电平变化。
按键按下(高电平->低电平):按键按下,电容与按键形成回路,电容开始放电,当电容放电结束后,抖动就基本结束了。在放电期间,KeyIn1处一直向外输出高电平。
按键松开(低电平->高电平):按键松开,电容左极板接电源,右极板接地,开始充电,当电容充电结束后,抖动也就基本结束了。在电容充电期间,KeyIn1处一直向外输出为低电平。
-
矩阵按键工作原理
无论是独立键盘还是矩阵键盘, 单片机检测其是否被按下的依据都是一样 的, 也就是检测与该键对应的 I/O 口是否为低电平。
- 检测方法
行列扫描法:先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。
线翻转法:使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。
- 硬件设计
-
软件设计
(1)初始化按键 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和 输出模式、上拉设置等)
(2)按键检测程序
(3)按键控制程序
key.h
#ifndef KEY_H_
#define KEY_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
#define KEY_L1_SetL (GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL (GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL (GpioDataRegs.GPBCLEAR.bit.GPIO50=1)
#define KEY_L1_SetH (GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH (GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH (GpioDataRegs.GPBSET.bit.GPIO50=1)
#define KEY_H1 (GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_H2 (GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_H3 (GpioDataRegs.GPADAT.bit.GPIO14)
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY5_PRESS 5
#define KEY6_PRESS 6
#define KEY7_PRESS 7
#define KEY8_PRESS 8
#define KEY9_PRESS 9
#define KEY_UNPRESS 0
void KEY_Init(void);
char KEY_Scan(char mode);
#endif /* KEY_H_ */
key.c
#include "key.h"
void KEY_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//KEY端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
GpioCtrlRegs.GPADIR.bit.GPIO12=0;
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
GpioCtrlRegs.GPADIR.bit.GPIO13=0;
GpioCtrlRegs.GPAPUD.bit.GPIO13=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
GpioCtrlRegs.GPADIR.bit.GPIO14=0;
GpioCtrlRegs.GPAPUD.bit.GPIO14=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;
GpioCtrlRegs.GPBDIR.bit.GPIO49=1;
GpioCtrlRegs.GPBPUD.bit.GPIO49=0;
GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;
GpioCtrlRegs.GPBDIR.bit.GPIO50=1;
GpioCtrlRegs.GPBPUD.bit.GPIO50=0;
EDIS;
GpioDataRegs.GPBSET.bit.GPIO48=1;
GpioDataRegs.GPBSET.bit.GPIO49=1;
GpioDataRegs.GPBSET.bit.GPIO50=1;
}
char KEY_Scan(char mode)
{
static char keyl1=1;
static char keyl2=1;
static char keyl3=1;
//第1列扫描
KEY_L1_SetL;
KEY_L2_SetH;
KEY_L3_SetH;
if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
{
DELAY_US(10000);//延时10us,消抖
keyl1=0;
if(KEY_H1==0)
{
return KEY1_PRESS;
}
else if(KEY_H2==0)
{
return KEY4_PRESS;
}
else if(KEY_H3==0)
{
return KEY7_PRESS;
}
}
else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
{
keyl1=1;
}
if(mode)
keyl1=1;
//第2列扫描
KEY_L2_SetL;
KEY_L1_SetH;
KEY_L3_SetH;
if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
{
DELAY_US(10000);
keyl2=0;
if(KEY_H1==0)
{
return KEY2_PRESS;
}
else if(KEY_H2==0)
{
return KEY5_PRESS;
}
else if(KEY_H3==0)
{
return KEY8_PRESS;
}
}
else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
{
keyl2=1;
}
if(mode)
keyl2=1;
//第3列扫描
KEY_L3_SetL;
KEY_L1_SetH;
KEY_L2_SetH;
if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
{
DELAY_US(10000);
keyl3=0;
if(KEY_H1==0)
{
return KEY3_PRESS;
}
else if(KEY_H2==0)
{
return KEY6_PRESS;
}
else if(KEY_H3==0)
{
return KEY9_PRESS;
}
}
else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
{
keyl3=1;
}
if(mode)
keyl3=1;
return KEY_UNPRESS;
}
main.c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "leds.h"
#include "key.h"
void main()
{
int i=0;
char key=0;
InitSysCtrl();
LED_Init();
KEY_Init();
while(1)
{
key=KEY_Scan(0);
switch(key)
{
case KEY1_PRESS: LED2_TOGGLE;break;
case KEY2_PRESS: LED3_TOGGLE;break;
case KEY3_PRESS: LED4_TOGGLE;break;
case KEY4_PRESS: LED5_TOGGLE;break;
case KEY5_PRESS: LED6_TOGGLE;break;
case KEY6_PRESS: LED7_TOGGLE;break;
}
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}