找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12225|回复: 5
收起左侧

单片机控制光耦+可控硅调节亮度程序+过零检测触发电路图

  [复制链接]
ID:470155 发表于 2019-1-21 17:25 | 显示全部楼层 |阅读模式
用光耦实现过零检测触发可控硅电路原理图如下:

原理图

原理图


单片机可控调节程序:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit SW1=P2^0;//用于调高灯的亮度
  6. sbit SW2=P2^1;//用于调低灯的亮度
  7. sbit CF=P2^2;//用于触发可控硅
  8. sbit SW3=P2^3;//用于控制灯的亮灭
  9. void kdelay();
  10. void maichong();
  11. delay500us(uint z);
  12. void delay10us();
  13. void liangmie();
  14. uint x,y,z,k,i,j;
  15. void main()
  16. {
  17. IT0=1;//设定外部中断 0 为下降沿触发方式
  18. EX0=1;//开外部中断 0

  19. P2=0xff;
  20. z=10;
  21. j=0;
  22. while(1)
  23. {
  24. if(SW1==0)
  25. {
  26. kdelay(); //软件 2ms 延时防抖
  27. if(SW1==0)
  28. {
  29. z--;
  30. if(z==0){z=19;}//灯达到最亮以后继续按下 SW2,灯会变到最暗
  31. }
  32. while(!SW1);//等待按键弹起
  33. }
  34. if(SW2==0)
  35. {
  36. kdelay();
  37. if(SW2==0)
  38. {
  39. z++;
  40. if(z==20){z=0;}//灯达到最暗以后继续按下 SW1,灯会变到最亮
  41. }
  42. while(!SW2);
  43. }
  44. liangmie();
  45. if(j==0)
  46. {
  47. EA=1; //开总中断
  48. }
  49. else
  50. {
  51. EA=0; //关总中断
  52. }

  53. }
  54. }
  55. /************2ms 按键防抖动延时函数**********/
  56. void kdelay()
  57. {
  58. for(i=0;i<200;i++)
  59. {
  60. delay10us(); //调用 200 次 10us 约为 2ms
  61. }
  62. }
  63. /*将半周期 0.01 秒平均分成 20 等分,每等分为 0.5 毫秒,即 500us*/
  64. /************0.5ms 倍数的子函数************/
  65. delay500us(uint z)
  66. {
  67. uchar x,y;

  68. for(x=0;x<z;x++)
  69. {
  70. for(y=0;y<50;y++)
  71. {
  72. delay10us();//调用 50 次 10us 约为 502us
  73. }
  74. }
  75. }
  76. /*************脉冲函数*****************/
  77. void maichong()
  78. {
  79. CF=0;
  80. for(k=0;k<10;k++)
  81. {
  82. delay10us();//调用 10 次 10us 约为 102us
  83. }
  84. CF=1;
  85. }
  86. /*************10us 延时函数**************/
  87. void delay10us()
  88. {
  89. _nop_(); _nop_();_nop_();
  90. _nop_(); _nop_();_nop_();
  91. }
  92. /************灯的亮灭控制函数***********/
  93. void liangmie()
  94. {
  95. if(SW3==0)
  96. {
  97. kdelay();
  98. if(SW3==0)
  99. {
  100. j++;
  101. if(j==2){j=0;}
  102. }
  103. while(!SW1);//等待按键弹起
  104. }
  105. }
  106. /**********外部中断 0 函数**********/
  107. void Int0(void) interrupt 0
  108. {
  109. delay500us(z);//控制角的大小由 z 决定
  110. maichong();//发脉冲
  111. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:496131 发表于 2019-5-21 17:02 | 显示全部楼层
谢谢大神的分享 好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:43387 发表于 2020-2-10 15:51 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:848824 发表于 2021-3-15 04:17 来自手机 | 显示全部楼层
成功了吗?
回复

使用道具 举报

ID:1003611 发表于 2022-2-23 19:09 | 显示全部楼层
要是有原文件就更好了
回复

使用道具 举报

ID:65237 发表于 2023-2-10 09:08 | 显示全部楼层
楼主打个包发一下哦 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表