光敏电阻控制继电器(STM32F103C8T6)

一、前言

        本文是通过光敏电阻检测环境亮度,当亮度小于设定值时控制继电器打开,超过设定时关闭继电器。光敏电阻的数值转换是通过XP2046进行转换,使用STM32作为主控,用库函数进行编程实现功能。

二、概述

(一)继电器

        继电器是一种电控制器件,是当输入量的变化达到规定要求时,在电气输出电咱中使用被控量发生预定的阶跃变化的一种电器。

单片机是一个弱电器件,一般工作于5v甚至更低的电压下。驱动电流在mA级以下,而在一些大功率场合下,如控制电动机,显然是不行的。因此,需要一个环节进行连接,这个环节称为“功率驱动”,而电继器驱动则是一个典型的、简单的功率驱动环节。继电器本身对于单片机来说是一个功率器件,继电器就是单片机实现控制大功率负载的接口。

        本例程的继电器电路是使用三极管,控制继电器开关,当MCU输出高电平时,打开继电器;当MCU输出低电平时,继电器则闭合。所使用的是电磁式继电器。

(二)光敏电阻

光敏电阻是用硫化镉等半导体材料的特殊电阻器件,其工作原理是基于内光电效应。光照越强,阻值就越低,随着光照强度的升高,电阻值讯速降低。

三、硬件连接

 

四、程序例程

1、XPT2046程序请参考: XPT2046程序例程

2、主函数

int main(void)
{
	int relay_vlaue = 0;

	Relay_Pin_Init();  // 继电器控制引脚初始化
	XPT2046_Pin_Init();
	Sys_Delay_Init();
	Usart1_Pin_Init(115200);
	printf("初始化成功\r\n");
	
	while(1)
	{
		relay_vlaue = XPT2046_Read_Date(0xA4);
		
		if (relay_vlaue < 200) {
			PBout(1) = 0;  // 开
		} 
		else {
			PBout(1) = 1;  // 关
		}
		
        printf("光敏电阻的值 = %d\r\n",relay_vlaue);*/
		delay_ms(500);
	}
}

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,你需要将光敏电阻连接到STM32F103C8T6的ADC引脚上。接下来,你需要设置ADC的寄存器,以便对光敏电阻的电压进行采样和转换。你还需要设置ADC的时钟和分辨率等参数。 在采集到光敏电阻的电压值后,你可以使用条件语句判断光线强度是否超过了某个阈值。如果超过了阈值,你可以使用GPIO控制继电器,以便控制外部设备的开关。 以下是一个可能的代码示例: ```c #include "stm32f10x.h" #define ADC1_DR_Address ((u32)0x4001244C) // ADC数据寄存器地址 void ADC1_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1时钟 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 禁止扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 禁止连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换由软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 转换通道数为1 ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); // 使能ADC1 ADC_ResetCalibration(ADC1); // 复位ADC1校准寄存器 while (ADC_GetResetCalibrationStatus(ADC1)); // 等待ADC1校准寄存器复位完成 ADC_StartCalibration(ADC1); // 开始ADC1校准 while (ADC_GetCalibrationStatus(ADC1)); // 等待ADC1校准完成 } u16 Get_ADC(u8 ch) { ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); // 配置转换通道和采样时间 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换 while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成 return ADC_GetConversionValue(ADC1); // 返回转换结果 } void GPIO_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // PC13控制继电器 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); } int main(void) { ADC1_Init(); GPIO_Init(); while (1) { u16 adc_val = Get_ADC(ADC_Channel_0); // 采集光敏电阻的电压值 if (adc_val > 1000) // 如果光线强度超过阈值 { GPIO_SetBits(GPIOC, GPIO_Pin_13); // 控制继电器开启 } else { GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 控制继电器关闭 } } } ``` 以上是一个基本的例子,你可以根据自己的需要进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员超庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值