图4-2 窗磁检测的电路图
4.2.3程序函数的设计
在窗磁报警模块的设计中,需要用到开发板上的按键4、 LED灯以及蜂鸣器,首先在主函数定义之前定义KEY4,使用了GPIO口中A组的PORT4(在开发板上应该短接PA_4):
#define KEY4_PERIPH SYSCTL_PERIPH_GPIOA
//定义按键4的窗磁A组的GPIO口
#define KEY4_PORT GPIO_PORTA_BASE
#define KEY4_PIN GPIO_PIN_4 //定义PA4
然后是定义LED灯,使用了GPIO口中C组的PORT4(在开发板上应该短接PC_4):
#define LED_PERIPH SYSCTL_PERIPH_GPIOC
//定义LED灯的C组的GPIO口
#define LED_PORT GPIO_PORTC_BASE
#define LED_PIN GPIO_PIN_4 //定义PC_4
#define ledOn() GPIOPinWrite(LED_PORT , LED_PIN , 0x00 << 4)
//定义LED灯开启
#define ledOff() GPIOPinWrite(LED_PORT , LED_PIN , 0x01 << 4)
//定义LED灯关闭
#define ledToggle() GPIOPinWrite(LED_PORT , LED_PIN ,
~GPIOPinRead(LED_PORT , LED_PIN))
//定义LED灯反转
接着是定义蜂鸣器,使用了GPIO口中A组的PORT5(在开发板上应该短接PA_5):
#define SPEAK_PERIPH SYSCTL_PERIPH_GPIOA //定义蜂鸣器A组的PGIO口
#define SPEAK_PORT GPIO_PORTA_BASE
#define SPEAK_PIN GPIO_PIN_5 //定义PA_5
#define SPEAK_ON() GPIOPinWrite(SPEAK_PORT , SPEAK_PIN , 0x00 << 5)
//定义蜂鸣器开启
#define SPEAK_OFF() GPIOPinWrite(SPEAK_PORT , SPEAK_PIN , 0x01 << 5)
//定义蜂鸣器关闭
4.3烟雾报警模块的设计
4.3.1工作原理介绍
烟雾报警模块需要在DC12V的供电下进行工作,该模块不但能对环境中烟雾的检测,也能对环境中热能的检测。模块一旦检测环境中有烟雾或者温度过高,则会进行声光报警。在烟雾报警模块中,有五条引线(如图4-1),其功能为:红色的线接DC+12V,黑色的线接EasyARM615开发板的GND引脚,黄、绿、橙三条线为信号线。
图4-3 烟雾报警器的引线
4.5温度检测模块(采样功能)的设计
4.5.1群星模数转换模特点
群星(Stellaris)ADC 模块的转换分辨率为10 位,含2个输入通道和一个内部温度传感器。ADC 模块包含一个可编程的序列发生器,无需控制器参与,允许对多个模拟输入源进行采样。每个采样序列均可以灵活的编程,其输入源、触发事件、中断的发生和序列优先级都是可配置的。
4.5.2 ADC结构图
图4-4 ADC模块结构图
4.5.3 ADC的初始化和配置
为了使用ADC 模块,必须使能PLL,同时使用所支持的晶振频率。使用不支持的频率可能会导致ADC 模块的的运作发生错误。
一、模块初始化
ADC 模块的初始化过程很简单,只需几个步骤。主要的步骤包括使能ADC 时钟和配置采样序列发生器的优先级(如有必要)。
ADC 初始化的顺序如下:
1. 通过写0x00010000 到系统控制模块中的RCGC1寄存器将ADC 时钟使能
2. 一经应用要求,必须在ADCSSPRI寄存器中对采样序列发生器的优先级进行配
置。默认的配置是采样序列发生器0 优先级最高,采样序列发生器3 优先级最低。
二、采样序列发生器的配置
采样序列发生器的配置要稍微比模块初始化的过程复杂,因为每个采样序列是完全可
编程的。
每个采样序列发生器按照以下步骤进行配置:
1. 保证采样序列发生器被禁能,这可以通过写0到ADCACTSS寄存器中对应的ASEN位来实现。采样序列发生器无需使能就可编程。如果在配置过程发生触发事件,那么在编程过程中禁能序列发生器就可以预防发生错误的执行操作。
2. 为ADCEMUX寄存器中的采样序列发生器配置触发事件。
3. 在ADCSSMUXn寄存器中为采样序列中的每个采样配置相应的输入源。
4. 在ADCSSCTLn寄存器中为采样序列中的每个采样配置采样控制位。在对最后半个字节进行编程时,确保END 位已置位。不过置位END 位失败可能会引发不可预测的行为。
5. 如果要使用中断,必须写1到ADCIM寄存器中相应的MASK位。
6. 通过写1到ADCACTSS寄存器中相应的ASEN 位将采样序列发生器逻辑使能。
三、模数转换程序关键部分
首先在主函数中初始化ADC,代码如下:
void adcInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样速率
ADCSequDisable(ADC_BASE, 3); // 配置前先禁止采样序列
ADCSequConfig(ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequStepConfig(ADC_BASE, 3, 0, ADC_CTL_TS |
ADC_CTL_END |
ADC_CTL_IE);
// 采样步进设置:ADC基址,采样序列编号,步值,通道设置
ADCIntEnable(ADC_BASE, , 3); // 使能ADC中断 IntEnable(INT_ADC3); // 使能ADC采样序列中断
IntMasterEnable(); // 使能处理器中断
ADCSequEnable(ADC_BASE, 3); // 使能采样序列
}
然后进行ADC的采样,函数如下:
unsigned long adcSample(void)
{
unsigned long ulValue;
ADCProcessorTrigger(ADC_BASE, 3); // 处理器触发采样序列
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
ADCSequDataGet(ADC_BASE, 3, &ulValue); // 读取ADC转换结果
return(ulValue);
}
最后,需要把ADC采样的结果显示在EasyARM615的LCD液晶屏上:
void Task_Disp(unsigned long ulValue)
{
int ulTemp_buff;
long In_Temp;
unsigned char D1,D2,D3;
// 显示CPU的工作温度
In_Temp = 151040UL - 225 * ulValue;
ulTemp_buff = In_Temp/10-400;
D1 = (unsigned char) (ulTemp_buff/1000);
D2 = (unsigned char) ((ulTemp_buff-D1*1000)/100);
D3 = (unsigned char) ((ulTemp_buff-D1*1000-D2*100)/10);
Lcd_Seg.D2 = HexToSeg(D1);
Lcd_Seg.D3 = HexToSeg(D2)+LCD_DP;
Lcd_Seg.D4 = HexToSeg(D3);
Lcd_Seg.Sign = LCD_TMP;
delay(3000); //延时0.5秒左右刷新一次
Lcd_Update(); // 刷新LCD的内容
delay( 100 ); // 延时
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>