- /******************************************************/
- //程序功能:通过测量热敏电阻温度计的值,来控制继电器是否吸合
- //详细说明: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;
- }
|