本实验源码为参考代码,可以在EK-TM4C123GXL上进行验证。 演示代码并非最优代码,是从易于理解的角度出发,争取做到最好理解的代码。 //*****************************************************************************
// 基础练习1.7: 蜂鸣器发声
//
// 过程描述:
// 1. 从硬件电路中可知,按键未按下时,读取引脚的值是高电平;按键按下时,接地,读取引脚的值是低电平;
// 按键相关的引脚设置为GPIO,输入. 采用轮询的方式读取按键(非中断的方式).
// 2. 把引脚配置成GPIO,输出。 通过输出高电平和低电平来控制LED的亮和灭。
// 3. 读取到低电平时,说明用户按键;根据按键,来做相应的动作.
// 4. 有源蜂鸣器内部带震荡源,只要一通电就会叫;
// 而无源内部不带震荡源,如果用直流信号无法令其鸣叫。必须用一定频率的方波去驱动它
// 5.
// 通过GPIO口的操作,控制蜂鸣器的发声,通过按键K1可以改变声音, 发出5种不同的声音;
// D3用作程序运行指示灯,即程序运行时该LED慢闪;
//
// 硬件描述:
// LED2(蓝色) –PF0
// LED3(绿色) –PA4 –使用
// LED4(红色) –PD6
// K1 — PD7 –使用
// K2 — PF4
// K3 — PA3
// K4 — PA2
//
// PC5 — 接蜂鸣器
//
// 注意事项:
// 引脚PF0和PD7比较特殊,默认是保护的。要重新编程操作的话,需要先解锁
// 小技巧:
// 通过SysConfig工具进行引脚的初始配置,就不用考虑这些因素了.
// SysConfig的使用可参考链接: https://www.bilibili.com/read/cv6258251
//
//
// 思考:
// 1. 在LED闪烁的时候,修改蜂鸣器的延时,也会影响LED的延时
// –LED延时的大循环里边,又包含一个Beep的小循环
// –建议: 通过定时器实现运行指示灯;
//
//*****************************************************************************
#include <stdbool.h> #include <stdint.h> #include "inc/hw_gpio.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" //如果有示波器的话,可以根据延时参数,调整出不同的频率; //没示波器的话,就靠耳朵啦(可以大致计算下的) uint32_t const delay_tab[]={0,500,1000,1500,2000,3000,4000,5000,8000}; void main(void) { uint32_t ui32_led_delay; uint32_t ui32_beep_delay; uint32_t ui32_delay_config; uint8_t index; //-----------外设使能------------- //使能PA外设的时钟,并等待Ready SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA)) { } //使能PC外设的时钟,并等待Ready SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOC)) { } //使能PD外设的时钟,并等待Ready SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD)) { } //使能PF外设的时钟,并等待Ready SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) { } //-----------引脚配置------------- //PA4->绿色LED,将PA4配置成GPIO,输出 GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4); //PD6->红色LED,将PD6配置成GPIO,输出 GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6); //PF0->蓝色LED,将PF0配置成GPIO,输出 HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE+GPIO_O_CR) |= GPIO_PIN_0; HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK) = 0x0; GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0); //PD7->K1,将PD7配置成GPIO,输入 HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTD_BASE+GPIO_O_CR) |= GPIO_PIN_7; HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) = 0x0; GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7); //PF4->K2,将PF4配置成GPIO,输入 GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); //PA3->K3,将PA3配置成GPIO,输入 GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_3); //PA2->K4,将PA2配置成GPIO,输入 GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2); //将PC5配置成GPIO,输出 GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5); //-----------LED状态初始化------------- //PA4输出高电平,绿色LED灭 GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0xFF); //PD6输出高电平,红色LED灭 GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,0xFF); //PF0输出高电平,蓝色LED灭 GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,0xFF); index = 5; ui32_delay_config =delay_tab[index]; while(1) { //采用轮询的方式读取引脚的输入值 //-----LED灯闪烁--- //输出低电平 GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0x00); for(ui32_led_delay=0;ui32_led_delay<200;ui32_led_delay++) { //PD7->K1 //判断第一个按键,引脚电平是否为低电平,为低表示按键按下 if(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7)) { //每次按键按下,数组下标左移一位,时间变短,闪烁变快 index --; if(0 == index) index = 8; ui32_delay_config =delay_tab[index]; //等待按键释放, 不然执行完大循环 之后又会再次进入 while(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7)); } //PF4->K2 //判断第一个按键,引脚电平是否为低电平,为低表示按键按下 if(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)) { //每次按键按下,数组下标右移一位,时间变长,闪烁变慢 index ++; if(9 == index) index = 1; ui32_delay_config =delay_tab[index]; //等待按键释放, 不然执行完大循环 之后又会再次进入 while(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)); } //把蜂鸣器的控制放到软件延时里. 会影响LED的闪烁速度.而且在两个地方都要放 //更合适的方式,其实是通过定时器来控制,而不是软件延时 //-----蜂鸣器播放,PC5通过高低电平来输出交流--- //输出低电平 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0x00); for(ui32_beep_delay=0;ui32_beep_delay<ui32_delay_config;ui32_beep_delay++); //输出高电平 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0xFF); for(ui32_beep_delay=0;ui32_beep_delay< ui32_delay_config;ui32_beep_delay++); } //输出高电平 GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0xFF); for(ui32_led_delay=0;ui32_led_delay< 200;ui32_led_delay++) { //PD7->K1 //判断第一个按键,引脚电平是否为低电平,为低表示按键按下 if(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7)) { //每次按键按下,数组下标左移一位,时间变短,闪烁变快 index --; if(0 == index) index = 8; ui32_delay_config =delay_tab[index]; //等待按键释放, 不然执行完大循环 之后又会再次进入 while(0 == GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7)); } //PF4->K2 //判断第一个按键,引脚电平是否为低电平,为低表示按键按下 if(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)) { //每次按键按下,数组下标右移一位,时间变长,闪烁变慢 index ++; if(9 == index) index = 1; ui32_delay_config =delay_tab[index]; //等待按键释放, 不然执行完大循环 之后又会再次进入 while(0 == GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)); } //把蜂鸣器的控制放到软件延时里. 会影响LED的闪烁速度.而且在两个地方都要放 //更合适的方式,其实是通过定时器来控制,而不是软件延时 //-----蜂鸣器播放,PC5通过高低电平来输出交流--- //输出低电平 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0x00); for(ui32_beep_delay=0;ui32_beep_delay<ui32_delay_config;ui32_beep_delay++); //输出高电平 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,0xFF); for(ui32_beep_delay=0;ui32_beep_delay< ui32_delay_config;ui32_beep_delay++); } } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
官方软件产品操作指南 (170)