本帖最后由 shenlan121 于 2021-5-10 21:58 编辑
最近公司产品需要做On/Off 实验(即每隔一定时间上电,再每隔一定时间断电,如此循环),之前是用时间继电器控制的,那这次需要再增加几个控制器,就想用单片机控制MOS 管通断来实现功能。 以下为电路图,使用STC15W104单片机(拆片),基本不需要外围元件。其中R3电阻放着,Q1三极管控制不了,后来索性就把R3 拆掉了,可以正常控制。 STC15W104单片机也是第一次使用,程序其实不复杂,但前后也花了几天空余时间把程序搞定。晶振选12M,通过定时器中断计时,EC11编码器使用外部中断编写函数,按键也同样是使用外部中断来编写函数。 - #include "STC15W.h"
- #include "oled.h"
- unsigned int t,f=1,temp=200;
- unsigned long k;
- sbit CRL = P3^5;
- sbit keyA = P3^2; //编码器A
- sbit keyB = P3^3; //编码器B
- sbit keyC = P3^4; //编码器C
- void Delay_ms(unsigned int n)
- {
- unsigned int i=0,j=0;
- for(i=0;i<n;i++)
- for(j=0;j<295;j++);
- }
- /*
- void Timer0_Init()
- {
- AUXR |= 0x00; //定时器0为12T模式
- TMOD=0x00; //工作模式0,16位自动冲装载。
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- void Timer0() interrupt 1
- {
- static unsigned int i = 0;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- i++;
- if(i==200)
- {
- CRL = ~CRL;
- i=0;
- }
- }
- */
- void Timer2_Init()
- {
- AUXR = 0x00; //定时器2为12T模式
- T2H = (65535-50000)/256; //设置定时初值
- T2L = (65535-50000)%256; //设置定时初值
- IE2 |= 0x04; //开定时器2中断
- AUXR |= 0x10; //定时器2开始计时
- EA = 1; //总中断开
- }
- void Timer2() interrupt 12 //定时器2中断;
- {
- static unsigned int i = 0;
-
- T2H = (65535-50000)/256; //设置定时初值
- T2L = (65535-50000)%256; //设置定时初值
- i++;
- if( i >= k )
- {
- CRL = ~CRL;
- i=0;
- }
- }
- void counter0( ) interrupt 0 //INT0中断入口--KeyA
- {
- EA=0; //关闭中断
- Delay_ms(1);
- if(keyA==0){ //顺时针转
- if (keyB==1)
- {
- temp=temp+20; //正转计数加
- if (temp>=1200) temp=1200;
- }
- else{ //逆时针转
- temp=temp-20; //反转计数减
- if(temp<=20) temp=20;
- }
- }
- EA=1; //打开中断
- }
- void EC11_Key( ) interrupt 10 //INT2中断入口--KeyC
- {
- EA=0; //关闭中断
- Delay_ms(2);
- if(keyC==0) f=1-f;
- EA=1; //打开中断
- }
- void main(void)
- {
- P3M1=0x00;
- P3M0=0x20; //开启 P3.5 推挽模式
- IT0=1; //开启 INT0 下降沿触发
- EX0=1; //开启 INT0
- INT_CLKO=0x10; //开启 INT2
-
- Timer2_Init(); //T2初始化
- Delay_ms(1000);
- OLED_Init(); //OLED初始化
- CRL=0;
-
- while(1)
- {
- if(f)
- {
- OLED_P16x16Ch(36,0,1);
- OLED_P16x16Ch(60,0,3);
- OLED_P16x16Ch(76,0,4);
- k=temp;
- }
- else
- {
- OLED_P16x16Ch(36,0,2);
- OLED_P16x16Ch(60,0,3);
- OLED_P16x16Ch(76,0,4);
- k=temp*60;
- }
-
- t=temp/20;
- OLED_P16x32num(45,2,t/10);
- OLED_P16x32num(67,2,t%10);
- }
- }
复制代码再发几张实物照吧
再分享一本书 《51单片机轻松入门--基于STC15W4K系列 429页 85.9M 高清书签版》
|