数码之家

 找回密码
 立即注册
搜索
查看: 8460|回复: 12

[C51] 用STC15W104 做一个On/Off 电子开关

[复制链接]
发表于 2021-5-10 21:55:37 | 显示全部楼层 |阅读模式
本帖最后由 shenlan121 于 2021-5-10 21:58 编辑

最近公司产品需要做On/Off 实验(即每隔一定时间上电,再每隔一定时间断电,如此循环),之前是用时间继电器控制的,那这次需要再增加几个控制器,就想用单片机控制MOS 管通断来实现功能。
以下为电路图,使用STC15W104单片机(拆片),基本不需要外围元件。其中R3电阻放着,Q1三极管控制不了,后来索性就把R3 拆掉了,可以正常控制
STC15W104单片机也是第一次使用,程序其实不复杂,但前后也花了几天空余时间把程序搞定。晶振选12M,通过定时器中断计时,EC11编码器使用外部中断编写函数,按键也同样是使用外部中断来编写函数。
  1. #include "STC15W.h"
  2. #include "oled.h"

  3. unsigned int t,f=1,temp=200;
  4. unsigned long k;

  5. sbit CRL                = P3^5;
  6. sbit keyA                = P3^2;                                                                //编码器A            
  7. sbit keyB                = P3^3;                                                                //编码器B
  8. sbit keyC                = P3^4;                                                                //编码器C

  9. void Delay_ms(unsigned int n)
  10. {
  11.         unsigned int i=0,j=0;
  12.         for(i=0;i<n;i++)
  13.                 for(j=0;j<295;j++);
  14. }

  15. /*
  16. void Timer0_Init()
  17. {
  18.         AUXR |= 0x00;                        //定时器0为12T模式
  19.         TMOD=0x00;                                //工作模式0,16位自动冲装载。

  20.         TH0=(65535-50000)/256;
  21.         TL0=(65535-50000)%256;

  22.         TR0=1;
  23.         ET0=1;
  24.         EA=1;
  25. }

  26. void Timer0() interrupt 1
  27. {
  28.         static unsigned int i = 0;
  29.         TH0=(65535-50000)/256;
  30.         TL0=(65535-50000)%256;
  31.         i++;
  32.         if(i==200)
  33.         {
  34.                 CRL = ~CRL;
  35.                 i=0;
  36.         }
  37. }
  38. */
  39. void Timer2_Init()
  40. {
  41.         AUXR = 0x00;                 //定时器2为12T模式

  42.         T2H = (65535-50000)/256;                //设置定时初值
  43.         T2L = (65535-50000)%256;                //设置定时初值

  44.         IE2 |= 0x04;          //开定时器2中断
  45.         AUXR |= 0x10;                //定时器2开始计时
  46.         EA = 1;                                  //总中断开
  47. }

  48. void Timer2() interrupt 12         //定时器2中断;
  49. {
  50.         static unsigned int i = 0;
  51.         
  52.         T2H = (65535-50000)/256;                //设置定时初值
  53.         T2L = (65535-50000)%256;                //设置定时初值
  54.   i++;
  55.   if( i >= k )
  56.         {
  57.                 CRL = ~CRL;
  58.                 i=0;
  59.   }
  60. }

  61. void counter0( ) interrupt 0                                                        //INT0中断入口--KeyA
  62. {
  63.     EA=0;                                                                                                                                                //关闭中断
  64.                 Delay_ms(1);
  65.     if(keyA==0){                                                                                                                //顺时针转
  66.       if (keyB==1)
  67.                         {
  68.                                 temp=temp+20;                                                                                                //正转计数加
  69.                      if (temp>=1200) temp=1200;
  70.                         }
  71.                         else{                                                                                                                                        //逆时针转
  72.                                 temp=temp-20;                                                                                                //反转计数减
  73.                                 if(temp<=20) temp=20;
  74.                         }
  75.                 }
  76.                 EA=1;                                                                                                                                                //打开中断
  77. }

  78. void EC11_Key( ) interrupt 10                                                        //INT2中断入口--KeyC
  79. {
  80.         EA=0;                                                                                                                                                        //关闭中断
  81.         Delay_ms(2);
  82.         if(keyC==0)        f=1-f;
  83.         EA=1;                                                                                                                                                        //打开中断
  84. }

  85. void main(void)
  86. {
  87.         P3M1=0x00;
  88.         P3M0=0x20;                        //开启 P3.5 推挽模式
  89.         IT0=1;                                        //开启 INT0 下降沿触发
  90.         EX0=1;                                        //开启 INT0
  91.         INT_CLKO=0x10;        //开启 INT2
  92.         
  93.         Timer2_Init();        //T2初始化
  94.         Delay_ms(1000);
  95.         OLED_Init();                //OLED初始化
  96.         CRL=0;
  97.         
  98.         while(1)
  99.         {
  100.                 if(f)
  101.                 {
  102.                         OLED_P16x16Ch(36,0,1);
  103.                         OLED_P16x16Ch(60,0,3);
  104.                         OLED_P16x16Ch(76,0,4);
  105.                         k=temp;
  106.                 }
  107.                 else
  108.                 {
  109.                         OLED_P16x16Ch(36,0,2);
  110.                         OLED_P16x16Ch(60,0,3);
  111.                         OLED_P16x16Ch(76,0,4);                        
  112.                         k=temp*60;
  113.                 }
  114.                
  115.                 t=temp/20;
  116.                 OLED_P16x32num(45,2,t/10);
  117.                 OLED_P16x32num(67,2,t%10);
  118.         }
  119. }
复制代码
再发几张实物照吧


再分享一本书 《51单片机轻松入门--基于STC15W4K系列 429页 85.9M 高清书签版》

链接:https://pan.baidu.com/s/1x2NfXAlhatBPr6H17uh-Uw  提取码:1302  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +90 收起 理由
玛德陛下 + 10 謝謝分享
家睦 + 60
cutter + 8
作死的家伙 + 12 謝謝分享

查看全部打赏

发表于 2021-5-10 22:03:01 | 显示全部楼层
赞一个。
自鼠标垫。
回复 支持 反对

使用道具 举报

发表于 2021-5-11 13:02:35 | 显示全部楼层
实用才是最有用的DIY!!!!
回复 支持 反对

使用道具 举报

发表于 2021-5-11 16:05:53 来自手机浏览器 | 显示全部楼层
最近在做基于15f104e+18b20的温控风扇,读不到温度值!
回复 支持 反对

使用道具 举报

发表于 2021-5-12 12:23:08 | 显示全部楼层
加电阻推npn,可以了。
回复 支持 反对

使用道具 举报

发表于 2021-5-12 13:19:25 来自手机浏览器 | 显示全部楼层
再改改,看着就变成点焊机控制程序了。:praise:
回复 支持 反对

使用道具 举报

发表于 2021-5-12 23:28:55 | 显示全部楼层
oydl82 发表于 2021-5-11 16:05
最近在做基于15f104e+18b20的温控风扇,读不到温度值!

现在DS18B20假货多,虽然也能用
回复 支持 反对

使用道具 举报

发表于 2021-5-16 10:08:58 | 显示全部楼层
谢谢楼主的分享。
回复 支持 反对

使用道具 举报

发表于 2021-5-26 08:41:44 | 显示全部楼层
谢谢分享书籍~~~~~
回复 支持 反对

使用道具 举报

发表于 2021-5-26 09:06:46 | 显示全部楼层
应该把立创EDA的图纸分享出来啊!
回复 支持 反对

使用道具 举报

发表于 2021-5-26 16:22:05 | 显示全部楼层
oydl82 发表于 2021-5-11 16:05
最近在做基于15f104e+18b20的温控风扇,读不到温度值!

一般是时序问题,比如脉宽要精准、等待转换完成最大要750ms,一次读取完成后,下一次读取前的时间间隔要稍微长一些(2s以上)
回复 支持 反对

使用道具 举报

发表于 2021-5-28 13:00:28 来自手机浏览器 | 显示全部楼层
楼主真棒6666666
回复 支持 反对

使用道具 举报

发表于 2021-12-31 21:16:45 | 显示全部楼层
不错为支持下
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-3 14:21 , Processed in 0.436801 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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