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

来源:本站
导读:目前正在解读《用51单片机做的小旋磁美容仪》的相关信息,《用51单片机做的小旋磁美容仪》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《用51单片机做的小旋磁美容仪》的详细说明。
简介:给大家发一个用单片机做的小旋磁美容仪的c语言代码。

99分钟可调倒计显示控制关机设置,同时,有蜂鸣器倒数十秒蜂叫及按键时鸣叫,时间显示数码管里有小数点按一秒周期闪烁的程序控制,按键为P1端中的P1。0及P1。1做为行线,P1。2~P1。5为列线,按键分别为开关机,时间加减,占空比调节加减键两组共四个按键,有两路实际输出占空比端口,标号为:hotout 和 xuanout 两个引脚,为数码管显示档位状态,控制时以外部硬件低电平时间长使输出功率大的基准而进行调节,0档时输出为高电平,8档(最高档)时输出为低电平低,其它从1~7档时,以占空比为准。且每一档的增量不是线性的,只为配合外部硬件的启动电平要求,低几档导通量较大些

#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的程序体全部加以代码优化,解决掉原程序执行过程中中断停留时间过长,影响数码管显示,闪烁的问题,同时处理掉按键在开至最高档时检测灵敏度下降问题.

提醒:《用51单片机做的小旋磁美容仪》最后刷新时间 2024-03-14 01:00:01,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《用51单片机做的小旋磁美容仪》该内容的真实性请自行鉴别。