找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8340|回复: 7
收起左侧

单片机按键调节电热丝功率大小 已做出实物和程序

  [复制链接]
ID:37147 发表于 2017-5-31 10:12 | 显示全部楼层 |阅读模式
这是一个取暖功能,风扇是起给外壳降温作用的,还用了一个电子式倾倒开关,一旦倾倒,立即关闭取暖功能,起保护作用,以免发生火灾,并且在倾倒后,风扇继续延时散热,给外壳降温,我这里为了迅速看到效果,延时时间设置10S,经测试,良好,没有发现程序控制错乱问题,如果大家有发现,告知哈,一起学习~~

实物图:
0.png

电路原理图如下:
0.png 0.png

单片机源程序如下:
  1. #include <STC15F2K60S2.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit led1=P1^0;
  5. sbit led2=P3^7;
  6. sbit pwm=P1^1;
  7. sbit wind=P3^6;
  8. sbit k1=P5^5;
  9. sbit sw=P1^2;//倾倒开关
  10. uchar num=0,num2=0,scale=0;
  11. uint a=0,t=0,t1=0;
  12. bit flag1=0,flag2=0,flag3=0;
  13. bit flag4=0,flag5=1;
  14. void delay(uint xms)
  15. {
  16.         uint i,j;
  17.         for(i=xms;i>0;i--)
  18.                 for(j=110;j>0;j--);
  19. }

  20. void cloud()
  21. {
  22.         if(flag3==1)
  23.         {
  24.                 num2++;
  25.                 if(num2==200)
  26.                 {
  27.                         num2=0;
  28.                         a++;
  29.                         if(a==500)         //50一秒,500就是10秒
  30.                         {
  31.                                 TR0=0;               
  32.                                 a=0;
  33.                                 wind=0;
  34.                                 flag1=0;
  35.                                 flag2=0;       
  36.                         }
  37.                 }
  38.         }
  39. }

  40. void keyscan()
  41. {
  42.         if(flag4==0)
  43.                 {
  44.                 if(flag2==0)
  45.                         {       
  46.                                 if(flag1==0)
  47.                                         {
  48.                                                 if(k1==0)                //一档
  49.                                                 delay(10);
  50.                                                 if(k1==0)
  51.                                                 {
  52.                                                         while(!k1);        //松手检测
  53.                                                         EX0=1;                //开外部中断
  54.                                                         wind=1;                //开风扇
  55.                                                         scale=10;        //赋初值
  56.                                                         led1=0;                //点亮LED1
  57.                                                         led2=1;                //关闭LED2
  58.                                                         flag1=1;        //置1
  59.                                                         flag3=0;        //清零
  60.                                                 }
  61.                                         }
  62.                                 if(flag1==1)
  63.                                         {
  64.                                                 if(k1==0)                //二档
  65.                                                 delay(10);
  66.                                                 if(k1==0)
  67.                                                 {
  68.                                                         while(!k1);
  69.                                                         EX0=1;                //
  70.                                                         scale=60;
  71.                                                         led1=1;
  72.                                                         led2=0;
  73.                                                         flag1=0;
  74.                                                         flag2=1;
  75.                                                         flag3=0;
  76.                                                 }                                                                                               
  77.                                         }
  78.                          }
  79.                 if(flag2==1)
  80.                         {
  81.                                         if(k1==0)                   //三档
  82.                                         delay(10);
  83.                                         if(k1==0)
  84.                                         {
  85.                                                 while(!k1);
  86.                                                 EX0=0;                   //关外部中断
  87.                                                 led1=1;                   //关2个LED指示灯
  88.                                                 led2=1;
  89.                                                 num2=0;                   //清零
  90.                                                 a=0;
  91.                                                 flag2=0;           //
  92.                                                 flag3=1;           //调用风扇延时函数。
  93.                                         }               
  94.                         }
  95.                 }
  96.        
  97.                 if(sw==1)          //判断倾倒
  98.                 delay(10);
  99.                 if(sw==1)
  100.                         {
  101.                                 flag4=1; //一旦倾倒,调用倾倒程序
  102.                         }       
  103.                
  104.                 if(sw==0)         //倾倒复位
  105.                 delay(10);
  106.                 if(sw==0)
  107.                         {
  108.                                 flag4=0; //清零,不调用倾倒程序。
  109.                                 t=0;
  110.                         }               
  111. }

  112. void main()
  113. {
  114.         P3M0=0x40;
  115.         P3M1=0x00;
  116.         TMOD=0x01;
  117.         TH0=0xff;//定时0.1ms
  118.         TL0=0x9c;         
  119.         EA=1;
  120.         ET0=1;
  121.         IT0=0;//必须设外部中断触发方式为上升沿下降沿同时触发。STC最新15系列单片机外部中断INT0口有上下沿同时触发功能       
  122.         led1=1;
  123.         led2=1;
  124.         pwm=1;
  125.         wind=0;
  126.         k1=1;
  127.         while(1)
  128.         {
  129.                 keyscan();        //按键扫描程序                               
  130.         }
  131. }

  132. void ex0() interrupt 0
  133. {
  134.         IE0=0;
  135.         num=0;
  136.         TR0=1;          //交流过零点的时候,清楚标志、计数变量并启动定时器。
  137. }

  138. void t0() interrupt 1
  139. {
  140.         unsigned char i;
  141.         TH0=0xff;
  142.         TL0=0x9c;
  143.         if(flag3==0)
  144.         {
  145.                 num++;
  146.                 if(num==scale)                //改变num的值即可改变移相触发时间,即改变负载功率大小
  147.                         {
  148.                                 pwm=0;        //触发MOC3021导通,即触发可控硅导通
  149.                                 for(i=0;i<2;i++);//延时2us
  150.                                 pwm=1;        //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
  151. ……………………

  152. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
取暖设备控制.rar (253.62 KB, 下载次数: 67)

评分

参与人数 2黑币 +108 收起 理由
zqy181818 + 8 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:205314 发表于 2017-5-31 16:37 | 显示全部楼层
顶顶楼主用用心了,有点不懂的地方可控规的控制是怎么完成的?小白一个希望楼主给解答
回复

使用道具 举报

ID:37147 发表于 2017-6-1 08:21 | 显示全部楼层
shixijiang 发表于 2017-5-31 16:37
顶顶楼主用用心了,有点不懂的地方可控规的控制是怎么完成的?小白一个希望楼主给解答

你可以看我上个帖子,你参考下,我有说明。我也是花了几个礼拜才搞明白的,想搞明白,自己好好琢磨琢磨哈。
回复

使用道具 举报

ID:105786 发表于 2017-7-25 16:45 | 显示全部楼层
正在寻找资料,收藏了,谢谢
回复

使用道具 举报

ID:369516 发表于 2018-7-11 15:33 | 显示全部楼层
正在寻找资料
回复

使用道具 举报

ID:119238 发表于 2018-7-11 16:02 | 显示全部楼层
交流直流共地会不会不太安全啊?过零检测应该可以光耦隔离吧
回复

使用道具 举报

ID:380389 发表于 2018-7-29 09:39 来自手机 | 显示全部楼层
收藏了,谢谢提供资料
回复

使用道具 举报

ID:377382 发表于 2018-7-31 09:30 | 显示全部楼层
非常的给力,谢谢了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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