不要用三极管放大,接上拉电阻即可。
做实验直接选用线圈电压为5V的继电器就可以。单片机输出引脚与继电器之间要接一个三极管,单片机I/O直接继电器电流不够。
单片机是一个弱电器件,一般情况下它们大都工作在5V甚至更低。驱动电流在mA级以下。而要把它用于一些大功率场合,比如控制电动机,显然是不行的。
在这里,继电器驱动含有两个意思:一是对继电器进行驱动,因为继电器本身对于单片机来说就是一个功率器件。
扩展资料:
现在,单片机的某一个需要控制这个继电器电路的输出引脚就是一只"手",当单片机的这个引脚输出低电平的时候,就像"手"在打开三极管"水龙头",水就从上往下流,继电器"水轮机"就开始转起来了。
反之,如果是输出高电平,"手"就开始关"水龙头",继电器"水轮机"因为没有水流下来,就会停止。
这就是三极管的开关作用。
简单的理解和记忆就是:三极管是一个开关器件,其实真的可以将它看成是一个开关,只不过它不是用手来控制,而是用电压(电流)来控制的,因此,三极管有些时候也被称做电子开关(与机械开关相区别)。
参考资料来源:百度百科——单片机控制器
你的仿真图有问题,继电器是不会吸合的。发光二极和串联的电阻阻值也大,LED不能亮。
仿真应该如下图这样画
汇编程序
RELAY BIT P2.0 ;继电器控制位
RESET:LJMP MAIN
ORG 000BH
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R2 ,BACK
MOV R2 ,#20 ;中断20次,1秒到,继电器吸合或断开一次
CPL RELAY
BACK: RETI
MAIN: MOV TMOD,#01H
MOV TH0,#3CH; 晶振频率为12M,定时50ms
MOV TL0,#0B0H
MOV IE ,#82H
SETB TR0
MOV R2 ,#20
CLR RELAY
AJMP $
END
请采纳
程序基本逻辑比较简单,定时器定时1ms,每次溢出在中断函数中cnt+1,当cnt=1000时,即定时1s,标志位flag=1。
主函数用个if判断flag就可以了,当falg=1时,翻转IO状态,就可以实现继电器的通断。
C程序如下:
#include <reg52.h>
sbit RL = P2^0; //三极管通断
unsigned char T0RH = 0; //T0 重载值的高字节
unsigned char T0RL = 0; //T0 重载值的低字节
unsigned char flag = 0; //1s标志位
void ConfigTimer0(unsigned int ms);
void main()
{
EA = 1; //使能总中断
ConfigTimer0(1); //配置 T0 定时 10ms
while (1)
{
if(flag == 1) //1s时间到
{
flag = 0;
RL = ~RL; //电平取反,即继电器状态翻转
}
}
}
/* 配置并启动 T0, ms-T0 定时时间 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 13; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = T0RH; //加载 T0 重载值
TL0 = T0RL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
}
/* T0 中断服务函数,用于1s计时 */
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
cnt++;
if (cnt >= 1000) //1s时间到
{
cnt = 0;
flag = 1;
}
}
网上一大堆。单片机直接用12V接7805线性稳压就行。下面的原理图中光耦左边及单片机由7085提供5V,光耦右边的直接用12V
需要控制几路制冷片就买几路继电器,我买个5V
4路继电器的18元。
这样的成品给个低电平(高电平)就行了。有高(低)电平有效
降压模块也有卖的