专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

用51单片机做的小旋磁美容仪

作者:51hei   来源:本站原创   点击数:  更新时间:2009年08月19日   【字体:

  给大家发一个用单片机做的小旋磁美容仪的c语言代码。99分钟可调倒计显示控制关机设置,同时,有蜂鸣器倒数十秒蜂叫及按键时鸣叫,时间显示数码管里有小数点按一秒周期闪烁的程序控制,按键为P1端中的P1。0及P1。1做为行线,P1。2~P1。5为列线,按键分别为开关机,时间加减,占空比调节加减键两组共四个按键,有两路实际输出占空比端口,标号为:hotout  和 xuanout 两个引脚,为数码管显示档位状态,控制时以外部硬件低电平时间长使输出功率大的基准而进行调节,0档时输出为高电平,8档(最高档)时输出为低电平低,其它从1~7档时,以占空比为准。且每一档的增量不是线性的,只为配合外部硬件的启动电平要求,低几档导通量较大些。本程序为单片机网http://www.51hei.com 会员“狼图腾”呕心沥血的的原创作品,所有的c语言代码都已经测试通过,并且做成了成品投入到了实际的使用中,希望能对大家有所帮助有问题可联系作者帮忙处理的。
#include < reg51.H>
#define uint unsigned int
#define uchar unsigned char
#define duan P0
#define ton 2
#define t 20
uchar code tab[]={0x09,0x5f,0x2a,0x1a,0x5c,0x98,0x88,0x1f,0x08,0x18};
sbit xsd_display=P0^3;//小数点的位显示,根据实际情况决定
sbit shila=P2^4;
sbit gela=P2^5;
sbit hotla=P2^6;
sbit xuanla=P2^7;
sbit hotout=P2^0;
sbit xuanout=P2^1;
sbit fmqbit=P2^2;
bit openbit,xsd;//开关机、小数点、加热、旋转标志位
uchar time;      //分钟值
uint d;                //计分钟变量
bit fmq;
uchar hot,hot1,hotoff,hotoff1,hotled; //加热波形处理相关变量
uchar xuan,xuan1,xuanoff,xuanoff1,xuanled; //旋转相关变量
bit biaobit0,biaobit1,biaobit2,biaobit3;// 控制波形占空时的循环条件标志位//以下为延时子程序
void delay(uint a)
{
uchar c,d;
for(c=a;c>0;c--)
  for(d=80;d>0;d--);
}
//以下为显示函数
void display(uchar x,uchar y,uchar k)
{
uchar ge,shi;  //对传递时间函数进行分解
shi=x/10;
ge=x%10; duan=tab[shi];
shila=0;
delay(2);
shila=1; duan=tab[ge];
gela=0;
xsd_display=xsd;
delay(2);
gela=1; duan=tab[y];
hotla=0;
delay(2);
hotla=1; duan=tab[k];
xuanla=0;
delay(2);
xuanla=1;//  duan_display=0xff;
}//以下为变量改变处理程序
void bianlian(uchar xy)
{
switch(xy)
  {
   case 2: d=0;  //有按键按动时即使计数值初始为0
     if(time!=99)
     {
      time++;
     }
     break;   case 3: d=0;   //有按键按动时即使计数值初始为0
     if(time!=0)
     {
      time--;
     }
     break;   case 4: if(hotled!=8)
     {
      hotled++;
      if(hotled==8)
      biaobit0=1;
      else
      biaobit0=0;
      if(hotled==0)
      biaobit1=1;
      else
      biaobit1=0;
       if(hotled<5)
      {
       hot=hot+3;
      }
      else
      {
       hot=hot+ton;
      }      hot1=hot;
      hotoff=t-hot;
      hotoff1=hotoff;
     }
     break;   case 5:if(hotled!=0)
     {  
      hotled--;      if(hotled==8)
      biaobit0=1;
      else
      biaobit0=0;      if(hotled==0)
      biaobit1=1;
      else
      biaobit1=0;      if(hotled<4)
      {
       hot=hot-3;
      }
      else
      {
       hot=hot-ton;
      }      hot1=hot;
      hotoff=t-hot;
      hotoff1=hotoff;
           }
     break;
   case 6:
       if(xuanled!=8)
     {
      xuanled++;      if(xuanled==8)
      biaobit2=1;
      else
      biaobit2=0;
      if(xuanled==0)
      biaobit3=1;
      else
      biaobit3=0;      if(xuanled==1)
      xuan=xuan+6;
      else
      xuan=xuan+ton;      xuan1=xuan;
      xuanoff=t-xuan;
      xuanoff1=xuanoff;
     }
     break;
   case 7:
     if(xuanled!=0)
     {      if(xuanled==1)
      xuan=xuan-6;
      else
      xuan=xuan-ton;      xuan1=xuan;
      xuanoff=t-xuan;
      xuanoff1=xuanoff;
      xuanled--;      if(xuanled==8)
      biaobit2=1;
      else
      biaobit2=0;
      if(xuanled==0)
      biaobit3=1;
      else
      biaobit3=0;     }
   default:break;
  }
}
//以下为按键检测子程序
void key(void)
{
uchar num,num1=0;
uint a;
P1=0xfc;
num=P1;
if(num!=0xfc)
  {   fmqbit=0;    //检测按键有输入键值时使蜂鸣器鸣叫
   if(openbit!=0)
   {
   
    for(a=17;a>0;a--)
     {
      display(time,hotled,xuanled);
     }
   }
   else
   {
    for(a=200;a>0;a--)
    {
     duan=0xfe;   //此处随便加入值
     shila=0;
     gela=0;
     hotla=0;
     xuanla=0;//打开四路数码管位显示控制
     delay(1);
    }
     hotla=1;
     shila=1;
     gela=1;
     xuanla=1;//关闭四路数码管位显示控制
   }
   P1=0xfc;
   num=P1;
   if(num!=0xfc)
    {     P1=0xfe;
     num=P1;
     if(num!=0xfe)
      {
       switch(num)
        {
         case 0xfa: num1=7; break;//旋转减
         case 0xf6: num1=5; break;//hot 减
         case 0xee: num1=3; break;//时间减
         case 0xde:
            if(openbit!=0)
             {
              for(a=40;a>0;a--)
              display(time,hotled,xuanled);
            }
            else
             {
              for(a=400;a>0;a--)
               {
                duan=0xfe;   //此处随便加入值
                hotla=0;
                shila=0;
                gela=0;
                xuanla=0;//打开四路数码管位显示控制
                delay(2);
               }
              hotla=1;
              shila=1;
              gela=1;
              xuanla=1;//关闭四路数码管位显示控制
             }
             openbit=~openbit;//改变开关机标志位                  
                default:break;
        }
     
      }
     else
      {
       P1=0xfd;
       num=P1;
       switch(num)   
        {
         case 0xf9: num1=6; break;
         case 0xf5: num1=4; break;
         case 0xed: num1=2; break;
         default: break;
        }       }
     if(openbit!=0)
     bianlian(num1);//开机即可改变相关变量值,条件为开机后使能    }
  }   P1=0xfc;
}//以下为定时0中断程序,定时时间为50MS
void time0_int(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0; //进入装初值
d++;
fmq=~fmq;
if(d%10==0)
xsd=~xsd;
if(d==1200)
  {
   d=0;
   if(time!=0)
   time--;          //此处停机变量处理已OK了。
   else
   openbit=0;
  
  }
}//以下为定时1中断程序,定时时间为1000US
void time1_int(void) interrupt 3
{
TH1=0xff;
TL1=0xe0;//进入装初值if(openbit!=0)
  {
  
    if(hot1)
  {
   hot1--;
   if(hot1==0)
     {
      hotoff1=hotoff;
      if(biaobit0!=0)
      hotout=0;
      else hotout=1;
     }
  }
  if(hotoff1)
  {
   hotoff1--;
   if(hotoff1==0)
    {
     hot1=hot;
     if(biaobit1!=0)
     hotout=1;
     else hotout=0;
    }
  }  if(xuan1)
  {
   xuan1--;
    if(xuan1==0)
     {
      xuanoff1=xuanoff;
      if(biaobit2!=0)
      xuanout=0;
      else xuanout=1;
     }
  }
 
if(xuanoff1)
  {
   xuanoff1--;
    if(xuanoff1==0)
     {
      xuan1=xuan;
      if(biaobit3!=0)
      xuanout=1;
      else xuanout=0;
     }
  }
  
 
   
}
}
void main(void)
{
P1=0xfc;
openbit=0;//使起始状态为停机等待状态
TMOD=0x11;  //定义定时器工作模式
IP=0x08;   //定时器1设置为最高中断级别
TH0=0x3c;
TL0=0xb0; //进入装初值
TH1=0xff;
TL1=0xe0;//进入装初值
ET0=1;
ET1=1;
EA=1; //定时中断至此全部打开开始运作。
while(1)
{
  hotout=1;
  xuanout=1;//将输出都置为0输出状态,待机状态  TR0=0;
  TR1=0;//将返回的定时器全部关闭,避免不必要的误动作
  duan=0xfe;   //待机时显示的笔段控制
  hotla=0;
  shila=0;
  gela=0;
  xuanla=0;//打开四路数码管位显示控制
  delay(1);  //显示维持时间设定
  hotla=1;
  shila=1;
  gela=1;
  xuanla=1;//关闭四路数码管位显示控制

  if(P1!=0xfc)
  fmqbit=0;
  else fmqbit=1;    //对按键扫描进行检测,得出判断蜂鸣器的鸣叫结果。  key();       //按键检测函数调用
   if(openbit!=0)
   {
   
    d=0;       //秒钟计时值置0状态
    TR0=1;
    TR1=1;
    hot=0;
    hot1=hot;
    hotoff=t-hot;
    hotoff1=hotoff;  //将热控制的初值给予设定       xuan=0;
    xuan1=xuan;
    xuanoff=t-xuan;
    xuanoff1=xuanoff;  //将旋转控制的初值给予设定    biaobit0=0;
    biaobit1=1;
    biaobit2=0;
    biaobit3=1;    hotled=0;   //将热输出显示值及状态设置为0状态
    xuanled=0;   //旋转,效果同上    time=30;   //时间初值设置为30分钟整
    while(openbit!=0)
     {
           key(); //按键检测函数
      if((time==0)&&(d>=1000))
      {fmqbit=xsd;}     //倒计至最后10秒时进行鸣叫
      else
      {
       if(P1==0xfc)
       fmqbit=1;
       else fmqbit=0;    //对按键扫描进行检测,得出判断蜂鸣器的鸣叫结果。
      }
      display(time,hotled,xuanled);//调用显示函数
     }
   }
}}
  与hotandxuan10区别于bing1 和bing0两个变量取消,同时定时中断1的程序体全部加以代码优化,解决掉原程序执行过程中中断停留时间过长,影响数码管显示,闪烁的问题,同时处理掉按键在开至最高档时检测灵敏度下降问题.

关闭窗口

相关文章