一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2714|回复: 15
收起左侧

有要电扇调速定时程序的吗?

[复制链接]
发表于 2013-6-10 21:23 | 显示全部楼层 |阅读模式
本帖最后由 384065902 于 2013-6-11 07:08 编辑

用小单片机做的,频率12m,要是没有也可用stc89?52之类的。

IMG_0376.jpg

这是电路图
IMG_0371.jpg

单片机用的是stc15f104.
因为引脚少所以用的是正反矩阵扫描
灯的扫描顺序是1-4-3-2-5-8-7-6
上面的1234是速度指示,5678是剩余时间,均可指示16种状态,由单个灯闪烁的长短决定。
按钮长按是切换设置,短按是+1.
控制输出是一个低频的pwm调速,场效应管是n沟道的。



下面是程序,基于keil的tiny准系统做的。
//_________________________________________________________________________
include <rtx51tny.h> //频率12M,tiny时钟轮片为200
#include <reg52.h>
sbit NN=P3^2;//-----------------------更改io口时须同时更改job_0中的open_io,以起到消隐作用
sbit PP=P3^3;
sbit NP=P3^1;
sbit PN=P3^0;
sbit PWM=P3^5;
sbit key=P3^4;
sfr p3m1 =0xb1;  //io口状态控制寄存器
sfr p3m0 =0xb2;
sfr contr =0xc7;//系统软复位使用的寄存器
char speed =14;//速度变量
char time  =16;//计时变量
bit time_end ;//计时结束标志位
bit time_en;  //计时判断有效标志位
bit t_stop;   //计时停止标志位
char code sm[]={1,1,0,0,1,1,0,0};
char code sd[]={0,8,12,16,20,25,30,35,40,46,52,60,68,76,84,92,100};//非线性16级速度
char buff[8]={0,0,0,0,0,0,0,0}; //八个灯的显示使能位;            
  //          1,4,3,2,5,8,7,6
void clock(char i)//0.025s delay time
{
while(i--)
os_wait2(2,125);
}

void open_io(char io)//悬空io口,P3.0--P3.3
{
if(io==-1)
{p3m1=0x0f;
p3m0=0x28;}
if(io==0)
{p3m1=0x01;
p3m0=0x2e;}
    if(io==1)
{p3m1=0x02;
p3m0=0x2d;}
if(io==2)
{p3m1=0x04;
p3m0=0x2b;}
    if(io==3)
{p3m1=0x08;
p3m0=0x27;}
if(io==4)
{p3m1=0x00;
p3m0=0x2f;}
if(io==5)
{p3m1=0x0c;
p3m0=0x23;}
}

void pwm(unsigned char zk)//100级pwm发生器,载波频率22hz。
{
char pwm_js;
pwm_js=pwm_js%100;
if(zk>pwm_js)
PWM=1;
else
PWM=0;
os_wait2(2,2);//(2,x)x=2 F=25hz; x=1 F=50hz.
pwm_js++;
}
void dis_sd(char i)//简易写灯函数
{
if(i==0)
  {buff[0]=0;
  buff[1]=0;
  buff[2]=0;
  buff[3]=0;
  }
if(i==1)
  {buff[0]=1;
  buff[1]=0;
  buff[2]=0;
  buff[3]=0;
  }
if(i==2)
  {buff[0]=1;
  buff[1]=0;
  buff[2]=0;
  buff[3]=1;
  }
if(i==3)
  {buff[0]=1;
  buff[1]=1;
  buff[2]=0;
  buff[3]=1;
  }
if(i==4)
  {buff[0]=1;
  buff[1]=1;
  buff[2]=1;
  buff[3]=1;
  }
}
void dis_tm(char i)//简易写灯2
{
if(i==0)
  {buff[4]=0;
  buff[5]=0;
  buff[6]=0;
  buff[7]=0;
  }
if(i==1)
  {buff[4]=1;
  buff[5]=0;
  buff[6]=0;
  buff[7]=0;
  }
if(i==2)
  {buff[4]=1;
  buff[5]=0;
  buff[6]=0;
  buff[7]=1;
  }
if(i==3)
  {buff[4]=1;
  buff[5]=1;
  buff[6]=0;
  buff[7]=1;
  }
if(i==4)
  {buff[4]=1;
  buff[5]=1;
  buff[6]=1;
  buff[7]=1;
  }
}

job0 () _task_ 0  {    //管4线扫描8个LED              
  char shu,pn;  
  os_create_task (1);               
  os_create_task (2);
  os_create_task (4);

  p3m0=0x2f;         
  while (1)  {  
   
shu=shu%8;
    pn=shu%2;
if(shu<4)
{
  if(buff[shu]==1)
     {
  open_io(5);
  PN=pn;
  NP=!pn;
  open_io(3);
  NN=sm[shu];
  }
  if(buff[shu]==0)
  {open_io(5);}
}
    else
{
  if(buff[shu]==1)
     {
  open_io(5);
  PN=pn;
  NP=!pn;
  open_io(2);
  PP=sm[shu];
  }
  if(buff[shu]==0)
  {open_io(5);}
}
shu++;
os_wait2(2,2);
if(time_end==1)
{open_io(-1);}
  }
}
job1 () _task_ 1  {  //pwm调用函数
  while (1)  {
  if(time_end==0)
  pwm(sd[speed]);
  if(time_end==1)
  pwm(0);               
  }
}
job2 () _task_ 2  {  //短长按键设置与一些显示效果
char js=0,js2=0;
char set=0;
os_create_task (3);
os_wait2(2,200);
os_delete_task (3);
os_wait2(2,100);
dis_tm(0);
clock(20);
dis_tm(4);
clock(20);
dis_tm(0);
clock(20);
dis_tm(4);
clock(20);
dis_tm(0);
clock(20);
os_create_task (3);   
while (1)  {
    if(key==0)
    {
clock(4);
  if(key==0)
  {
  clock(4);
   if(key==0)
   {
   clock(4);
    if(key==0)
    {
    clock(4);
     if(key==0)
        {
     clock(4);
      if(key==0)
      {
      clock(4);
       if(key==0)
       {
       clock(4);
        if(key==0)
        {
        clock(6);
            if(key==0)
            {
         clock(6);
          if(key==0)
          {
          clock(6);
           if(key==0)
           {
           clock(6);
            if(key==0)
            {
            clock(6);
             if(key==0)
                {
             clock(6);
              if(key==0)
              {
              clock(6);
               if(key==0)
               {
                clock(6);
                if(key==0)
                {
                 os_delete_task (3);
                 js2=0;
                 set++;
                 set=set%2;
                 if(set==0)
                 {
                 dis_tm(0);
                 clock(20);
                 dis_tm(4);
                 clock(20);
                 dis_tm(0);
                 clock(30);
               
                 }
                 if(set==1)
                 {
                 dis_sd(0);
                 clock(20);
                 dis_sd(4);
                 clock(20);
                 dis_sd(0);
                 clock(30);
               
                 }
                }
               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
os_create_task (3);
  if(js2)
  {if(set==0)
{time++;
time=time%18;
}
if(set==1)
{speed++;
speed=speed%17;
if(speed==0)
speed=1;
}
js=0;  
  }
   }
   
os_wait2(2,200);
os_wait2(2,200);
js++;
js2++;
if(js2)
{js2=1;}
if(js<=50)
time_en=0;
if(js>50)
{time_en=1;
js=51;}
  }
}
job3 () _task_ 3  {   //闪烁灯式速度(15种)显示与定时(16步)显示
char s_dis,t_dis;
char s_to ,t_to ;
char js=0,t_js=0;;
while (1)  {
js=js%4;
s_dis=speed%4;
s_to=speed/4;
t_dis=time%4;
t_to=time/4;
    if(s_to==0)
{
  if(js<s_dis)
  buff[0]=1;
  if(js>=s_dis)
  dis_sd(s_to);
}
    if(s_to==1)
{
  if(js<s_dis)
  buff[3]=1;
  if(js>=s_dis)
  dis_sd(s_to);
}
    if(s_to==2)
{
  if(js<s_dis)
  buff[1]=1;
  if(js>=s_dis)
  dis_sd(s_to);
}
    if(s_to==3)
{
  if(js<s_dis)
  buff[2]=1;
  if(js>=s_dis)
  dis_sd(s_to);
}
if(s_to==4)
dis_sd(4);
//------------------------------
    if(t_to==0)
{
  if(js<t_dis)
  buff[4]=1;
  if(js>=t_dis)
  dis_tm(t_to);
}
    if(t_to==1)
{
  if(js<t_dis)
  buff[7]=1;
  if(js>=t_dis)
  dis_tm(t_to);
}
    if(t_to==2)
{
  if(js<t_dis)
  buff[5]=1;
  if(js>=t_dis)
  dis_tm(t_to);
}
    if(t_to==3)
{
  if(js<t_dis)
  buff[6]=1;
  if(js>=t_dis)
  dis_tm(t_to);
}
    if(t_to==4)
{ if(t_dis==1)
  {buff[4]=1;
  buff[5]=1;
  buff[6]=0;
  buff[7]=0;
  t_stop=1;}
  if(t_dis==0)
  {
  dis_tm(4);
  }
}
if(time!=17)
{
  t_stop=0;
}
js++;
for(t_js=0;t_js<10;t_js++)
{os_wait2(2,125);}
  
  }
}
job4 () _task_ 4  {   //定时判断函数
int js;
while(1){
js=5225;
while(js--)
os_wait2(2,200);
while(t_stop)
os_wait2(2,250);
time--;
if(time==-1)
time=0;
if(time_en==1&time==0)
{time_end=1;
while(time_end)
{os_delete_task(1);
os_delete_task(2);
os_delete_task(3);
buff[0]=0;buff[1]=0;buff[2]=0;buff[3]=0;buff[4]=0;buff[5]=0;buff[6]=0;buff[7]=0;
open_io(-1);
PWM=0;os_wait2(2,200);os_wait2(2,200);
if(key==0)
time_end=0;
}
os_wait2(2,250);
contr=contr|0x20;
}

fan_stc15f104.rar

45.96 KB, 下载次数: 174, 下载积分: 一乐金币 -1

程序包

点评

好吧,第二个图反了,自己倒过来看吧。。。。。。。。。。。  发表于 2013-6-10 21:24

评分

参与人数 1一乐金币 +30 收起 理由
灰太狼8888 + 30 赞一个!

查看全部评分

发表于 2013-6-10 21:48 | 显示全部楼层
简单修改可用于电饭锅煲汤熬稀饭
发表于 2013-6-10 21:54 | 显示全部楼层
灰太狼8888 发表于 2013-6-10 21:48
简单修改可用于电饭锅煲汤熬稀饭

用于电饭锅煲汤熬稀饭
你要做这个,功率控制器件你打算用啥?
发表于 2013-6-10 21:56 | 显示全部楼层
211719t0cah56kdhwwwmmk.jpg.thumb.jpg
看着累,帮改过来吧
 楼主| 发表于 2013-6-10 22:07 | 显示全部楼层
汗一个,程序包没放,明天搂过来。现在这个程序的时钟轮片是200-240之间,默认是10000,这个别忘了。。。。。。
对了,还有谁编51是tiny系统的,挺好用的啊。
发表于 2013-6-10 22:07 | 显示全部楼层
直流低压风扇?
发表于 2013-6-10 23:02 | 显示全部楼层
blackspider_e 发表于 2013-6-10 21:54
用于电饭锅煲汤熬稀饭
你要做这个,功率控制器件你打算用啥?

固态继电器
发表于 2013-6-10 23:26 | 显示全部楼层
楼主如能加入自然风模式就更完美了。
发表于 2013-6-10 23:50 | 显示全部楼层
ZTM的牛B哇!高手
发表于 2013-6-10 23:51 | 显示全部楼层
原创一定要顶,不过靠单键完成这些操作,感觉挺麻烦

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-20 23:48 , Processed in 0.074556 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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