【Proteus仿真】51单片机过零检测触发控制光耦+可控硅调光电路

【Proteus仿真】51单片机过零检测触发控制光耦+可控硅调光电路


  • Proteus仿真截图

可以进行仿真,但是没有预期的效果。

在这里插入图片描述
在这里插入图片描述

电路搭建注意事项

  • 整流桥输出负极端一定要接地,不然运行仿真会报错。

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SW1=P2^0;//用于调高灯的亮度
sbit SW2=P2^1;//用于调低灯的亮度
sbit CF=P2^2;//用于触发可控硅
sbit SW3=P2^3;//用于控制灯的亮灭
void kdelay();
void maichong();
void delay500us(uint z);
void delay10us();
void liangmie();
uint x,y,z,k,i,j;
void main()
{
IT0=1;//设定外部中断 0 为下降沿触发方式
EX0=1;//开外部中断 0
P2=0xff;
z=10;
j=0;
while(1)
{
if(SW1==0)
{
kdelay(); //软件 2ms 延时防抖
if(SW1==0)
{
z--;
if(z==0) {
z=19; //灯达到最亮以后继续按下 SW2,灯会变到最暗
}
}
while(!SW1);//等待按键弹起
}
if(SW2==0)
{
kdelay();
if(SW2==0)
{
z++;
if(z==20) {
z=0; //灯达到最暗以后继续按下 SW1,灯会变到最亮
}
}
while(!SW2);
}
liangmie();
if(j==0)
{
EA=1; //开总中断
}
else
{
EA=0; //关总中断
}

}
}
/\*\*\*\*\*\*\*\*\*\*\*\*2ms 按键防抖动延时函数\*\*\*\*\*\*\*\*\*\*/
void kdelay()
{
for(i=0; i<200; i++)
{
delay10us(); //调用 200 次 10us 约为 2ms
}
}
/\*将半周期 0.01 秒平均分成 20 等分,每等分为 0.5 毫秒,即 500us\*/
/\*\*\*\*\*\*\*\*\*\*\*\*0.5ms 倍数的子函数\*\*\*\*\*\*\*\*\*\*\*\*/
void delay500us(uint z)
{
uchar x,y;

for(x=0; x<z; x++)
{
for(y=0; y<50; y++)
{
delay10us();//调用 50 次 10us 约为 502us
}
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*脉冲函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void maichong()
{
CF=0;
for(k=0; k<10; k++)
{
delay10us();//调用 10 次 10us 约为 102us
}
CF=1;
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*10us 延时函数\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void delay10us()
{
\_nop\_();
\_nop\_();
\_nop\_();
\_nop\_();
\_nop\_();
\_nop\_();
}
/\*\*\*\*\*\*\*\*\*\*\*\*灯的亮灭控制函数\*\*\*\*\*\*\*\*\*\*\*/
void liangmie()
{
if(SW3==0)
{
kdelay();
if(SW3==0)
{
j++;
if(j==2) {
j=0;
}
}
while(!SW1);//等待按键弹起
}
}
/\*\*\*\*\*\*\*\*\*\*外部中断 0 函数\*\*\*\*\*\*\*\*\*\*/
void Int0(void) interrupt 0
{
delay500us(z);//控制角的大小由 z 决定
maichong();//发脉冲
}

程序代码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/13mVgpPjmTfZSiDbk1NWcDQ 
提取码:e2sr


何时何地,你都要明白,你是活给自己看的,别把别人的评价看得太重,凡事只要于心无愧,就不必计较太多。那些肤浅的赞美,是阳光中的尘埃,迷惑你的视界;那些非议与诅咒,亦是麻醉你的毒药,终会让你乱了心智。无论路途多险,步履维艰,切勿被动地改变自己,唯如此,你才可能会与众不同。