按你的原理图给你写个的程序,未经实物验证,仅供参考。
- /*******************************
- 本程序只适合STC15系列1T单片机
- 使用内部时钟11.0592MHz
- 磁保持继电器与输出端口需要对应
- *******************************/
- #include <reg51.h>
- #include <intrins.h>
- //特殊功能寄存器声明
- sfr P3M0=0xB2; //端口3模式寄存器0
- sfr P3M1=0xB1; //端口3模式寄存器1
- //端口声明
- sbit key =P3^0;
- sbit OUT1=P3^2;
- sbit OUT2=P3^3;
- //变量声明
- unsigned int count=0;//消抖计数变量
- bit lock=0;//按键自锁位变量
- bit flag=0;//按键状态位变量
- //延时函数
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- //主函数
- void main()
- {
- OUT1=0;//初始化输出端口
- OUT2=0;//初始化输出端口
- P3M1 = 0x00;//设置P3.2/P3.3推挽模式
- P3M0 = 0x0c;//设置P3.2/P3.3推挽模式
- while(1)
- {
- if(!key)//按键按下
- {
- if(++count>=500 && lock==0)//消抖与自锁
- {
- lock=1;//自锁,防止长按重复响应
- flag=~flag;//按键状态标志取反
- if(flag)
- {
- OUT1=1;//继电器吸合
- Delay100ms();
- OUT1=0;
- }
- else
- {
- OUT2=1;//继电器释放
- Delay100ms();
- OUT2=0;
- }
- }
- }
- else//按键松手
- {
- lock=0;//自锁标志清0
- count=0;//消抖计数清0
- }
- }
- }
复制代码 |