【Proteus仿真】51单片机过零检测触发控制光耦+可控硅调光电路
【Proteus仿真】51单片机过零检测触发控制光耦+可控硅调光电路
可以进行仿真,但是没有预期的效果。


电路搭建注意事项
程序代码
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
|
| 何时何地,你都要明白,你是活给自己看的,别把别人的评价看得太重,凡事只要于心无愧,就不必计较太多。那些肤浅的赞美,是阳光中的尘埃,迷惑你的视界;那些非议与诅咒,亦是麻醉你的毒药,终会让你乱了心智。无论路途多险,步履维艰,切勿被动地改变自己,唯如此,你才可能会与众不同。 |
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!