/******************************************************/
//程序功能:通过测量热敏电阻温度计的值,来控制继电器是否吸合
//详细说明:1.PD4接继电器的信号引脚来控制继电器
// 2.PD5也即AIN5进行AD转换,接收电阻R1的电压,并转换为AD值
// 3.MCU不停地进行AD转换,实现24小时检测当前温度
/******************************************************/
#include <iostm8s003f3.h> //开发板MCU为STM8S003
#define Fix_ADC_Value 300 //假定这个值就是温度达到40度时ADC的值
#define S1 4
#define S1_ON() PD_ODR |= (1<<(S1)) //控制继电器开
#define S1_OFF() PD_ODR &= ~ (1<<(S1)) //控制继电器关,默认是关的
void GPIO_Init(void)
{
PD_DDR = 0xFF; //PD所有引脚为输出引脚
PD_CR1 = 0xFF; //PD所有引脚为推挽输出
PD_CR2 = 0x0; //PD所有引脚输出速度最大为2MHZ
}
void ADC_Init(void)
{
ADC_CR1 = 0x00;//FADC=FMASTER/2、单次转换、ADC转换开关关
ADC_CR2 = 0x00;//禁止外部触发转换(选择软件启动)、数据左对齐
ADC_TDRL = 0x20;//关闭 (AIN5)施密特触发器
}
void GetAdcValue(void)
{
ADC_CSR = 0x05; //选择通道AIN5
ADC_CR1 |= 0x01; //使能ADC
i = 12; //等待7us以上的时间确保ADC上电完成
while(i--);
ADC_CR1 |= 0x01; //再次置位ADON来启动ADC转换
while(!(ADC_CSR & 0x80)); //等待转换完成
AD_Value=ADC_DRH; //读取转换的高八位数据
ADC_CSR &= 0x7F; //第8位EOC置0,本次转换结束
}
void CheckAdc(void)
{
if(AD_Value > Fix_ADC_Value) //比较测量值和设定值
{
S1_ON(); //超过一定的温度了,开启继电器
}
else
{
S1_OFF(); //温度还未超过设定值,关闭继电器
}
}
int main(void)
{
int AD_Value=0; //记录ADC的值,便于与设定的值进行比较
GPIO_Init(); //准备好继电器引脚
ADC_Init(); //准备好ADC
while(1)
{
GetAdcValue(); //获得ADC的值
CheckAdc();
}
return 0;
}
|