课程3时进一步的进阶学习。
第一部分
加入了蜂鸣器的使用,按键增加蜂鸣器的音效。这一步最终需要实现的是通过按键按下后增加蜂鸣器的音效,并使数码管增加数值,由于课程2中使用延时的方法采集按键状态,效果不太理想,我们在这节课程中使用外部中断采集。
在之前的S2配置中加入下降沿触发中断:
增加的新模块是蜂鸣器模块:
它可以直接通过高低电平控制,课程中选取了PA15进行控制,依然通过配置文件初始化。
如何时间功能呢:
void GROUP1_IRQHandler(void) { switch (DL_GPIO_getPendingInterrupt(GPIO_S2_PORT)) { case GPIO_S2_PIN_14_IIDX: Dutytmp++; keyflag = 1; break; default: break; } }
通过按键中断程序里面直接对显示的数据Dutytmp进行增加,按下只能触发一次,中断方式还是比较好的,论坛大佬的方法还是不错的。将标志位置位后,在定时器中断中进行蜂鸣器响的时间控制:
void TIMER_0_INST_IRQHandler(void){ switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: if(keyflag == 1){ keyflag++; DL_GPIO_clearPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_15_PIN); } else if(keyflag > 1){ keyflag = 0; DL_GPIO_setPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_15_PIN); } break; default: break; } }
第二部分
通过数码管显示温度,课程中是通过热敏电阻来反馈温度变化的,板载了一颗热敏电阻,这里用到的主要是adc采集部分:
ADC采集连接的是PA15,看样子上一部分刚用的引脚就要换一下了,蜂鸣器控制切换到PA16,然后进行ADC采集的配置:
通过定时器定时100ms'采集转化一次ADC的值,初始化时通过DL_ADC12_startConversion(ADC12_0_INST);开启转换。
第三部分与课后作业
课程是通过ADC采集的数值进行的温度转换实现的温度报警器功能,在第二部分已经实现了ADC的采集,所以这一部分主要是进行转换判断,这次就跳过直接实现DS18B20的采集,然后判断温度值进行报警功的实现。
DS18B20是一个单总线通信的温度传感器,我们通过一个引脚就能实现数据的读取,这里面我们使用论坛网友提供的DS18B20的驱动进行采集,在定时器中,每100ms采集一次。代码如下:
void TIMER_0_INST_IRQHandler(void){ switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: Dutytmp = DS18B20_GetTemp(); if(keyflag == 1){ keyflag++; DL_GPIO_clearPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_16_PIN); } else if(keyflag > 1){ keyflag = 0; DL_GPIO_setPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_16_PIN); } if(Dutytmp > 300){ DL_GPIO_clearPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_16_PIN); } else DL_GPIO_setPins(GPIO_Buzzer_PORT, GPIO_Buzzer_PIN_16_PIN); break; default: break; } }
为了能够显示小数,我们弄了一个标志位代表小数位数,对于数码管来说小数点就相当于对现实数据&0x7f,最高位为0就可以点亮,超过30℃的报警器完成。