好资料,51黑有你更精彩!!! |
/* 单片机白炽灯调光程序(适配电路图:STC12C2052AD + MOC3020 + BTA16) 晶振:11.0592MHz */ #include "reg52.h" // 包含STC12C2052AD寄存器定义 #include <intrins.h> // 提供_nop_()函数 // 引脚定义(与电路图严格对应) sbit lamp_pwm = P1^0; // 可控硅触发引脚(接MOC3020的2脚,经350Ω电阻) sbit key0 = P1^1; // 降低亮度按键(接P1.1) sbit key1 = P1^2; // 增加亮度按键(接P1.2) // 全局变量 unsigned int inc = 8000; // 定时器延时初值(800~8000,对应亮度从暗到亮) /************************************************ * 函数名:Key_Scan * 功能: 按键扫描(带10ms软件消抖) ************************************************/ void Key_Scan(void) { static unsigned char key_state = 1; // 按键状态:1=未按,0=按下 static unsigned int key_delay = 0; // 消抖延时计数器 if((key0 == 0 || key1 == 0) && key_state == 1) { key_delay++; if(key_delay >= 10000) { // 约10ms消抖(11.0592MHz) key_state = 0; if(key0 == 0) { // 降低亮度(增大延时,触发更晚) inc += 50; if(inc >= 8000) inc = 8000; } if(key1 == 0) { // 增加亮度(减小延时,触发更早) inc -= 50; if(inc <= 800) inc = 800; } key_delay = 0; } } else if(key0 == 1 && key1 == 1 && key_state == 0) { key_delay++; if(key_delay >= 10000) { key_state = 1; key_delay = 0; } } else { key_delay = 0; } } /************************************************ * 函数名:INT0_ISR * 功能: 外部中断0(过零检测)服务函数 * 说明: 交流电过零时重置定时器,准备触发可控硅 ************************************************/ void INT0_ISR(void) interrupt 0 using 0 { TR0 = 0; // 关闭定时器,防止冲突 TH0 = (65536 - inc) / 256; // 加载延时初值(高8位) TL0 = (65536 - inc) % 256; // 加载延时初值(低8位) TR0 = 1; // 启动定时器,开始延时 } /************************************************ * 函数名:Timer0_ISR * 功能: 定时器0中断服务函数(可控硅触发) * 说明: 延时结束后输出触发脉冲,驱动MOC3020 ************************************************/ void Timer0_ISR(void) interrupt 1 using 0 { TR0 = 0; // 关闭定时器,避免重复触发 lamp_pwm = 0; // 输出低电平,触发MOC3020内部LED _nop_();_nop_(); // 极短延时(确保LED导通) lamp_pwm = 1; // 恢复高电平,结束触发 } /************************************************ * 函数名:main * 功能: 主函数(初始化+循环扫描) ************************************************/ void main(void) { TMOD |= 0x01; // 定时器0:工作方式1(16位定时) IT0 = 1; // INT0:下降沿触发(匹配过零检测的电平变化) EX0 = 1; // 使能外部中断0 ET0 = 1; // 使能定时器0中断 EA = 1; // 使能总中断 while(1) { Key_Scan(); // 主循环持续扫描按键 } } |
谢谢了 下载看看 |
学习一下! |
这个是不是可以应用在电风扇上面? |
这个是不是可以应用的电风扇上面 |
谢谢提供,刚好想用单片机控制电烙铁 |
谢谢分享,学到了很多东西! |
双向可控硅开启的条件为:双向可控硅第一阳极T1与第二阳极T2间,无论所加电压极性是正向还是反向,只要控制极G和第一阳极T1间加有正负极性不同的触发电压,就可触发导通呈低阻状态。 双向可控硅关闭的条件为:双向可控硅一旦导通,即使失去G极触发电压,也能继续保持导通状态。只有当第一阳极T1、第二阳极T2电流减小,小于维持电流或T1、T2间当电压极性改变且没有触发电压时,双向可控硅才截断,此时只有重新加触发电压方可导通。 在其电特性参数中可以看到门极触发电流、触发电压分了I、II、III、IV,这里引入了一个概念,双向可控硅按其门极G与控制极T2的电压正负关系(即VGT1的电压正负,VT2T1的电压正负),分为三象限可控硅和四象限可控硅: ![]() 由于生产工艺等问题使可控硅第四象限需要的触发电流较大,以及容易误触发等原因,三象限可控硅是四象限可控硅的优化产品,所以直接将第四象限给屏蔽了 |
gongzhu 发表于 2024-3-13 13:34 没有变压器,应该是5V开关电源 |
输出只是半波吧,因为过零信号只取了一半,怎么没有人发现? |
本来就有降压变压器了,为何过零不从低压端取? |
挺好的!原理分析透彻![]() |
下来学习一下。51黑有你很精彩!!! |
感謝分享,正好要用到可控硅,學習一下 |
51很少出控制交流的文章了,比如交流电机,变频电机NTC,顶你 |
好评,学习了 |
有3相实用的电路吗 |
好办法,好资料 |
我用于驱动单相电机时候,启动的时候,电机噪音很大,是什么原因?可以解决吗? |
好资料,51黑有你更精彩!!! |
yanstay 发表于 2019-9-4 08:28 应该和这个差不多 加两个中断吧 |
三相的道理应该差不多 |
好评,帮顶,学习了 |
好资料 问题一直困扰啊 终于找到了 |
不错的资料 |
以前做过三相电镀电源的触发板。现在都是高频电源了。 |
好资料,51黑有你更精彩!!! |
谢谢,不错的帖子学习一下! |
看看,学习一下。 |
学习了 |
资料挺好,对于刚接触可控硅的小白挺合适。 |
好资料,51黑有你更精彩!!! |
谢谢超级棒 |
有三相的相序检测方面的吗? |
这样的过零检测电路风险太大,只要三极管击穿,单片机很容易烧,建议接L的1M电阻用多个电阻串联代替,或用光耦隔离,形成单片机完全可隔离方案更佳 |
很不错的资料,谢谢! |
谢谢分享! |
一如即往,对文字部分有兴趣,但电路问题很多, 1、移相部分高压、低压没有隔离; 2、触发部分不相信在某象限可以高压、低压不隔离; 精神可嘉,做为研究可以,但单片机+可控硅,有点复杂化。原以为是ABC三相移相。 |
赞一个 |