51单片机制作简易电风扇定时控制器文档格式.docx
《51单片机制作简易电风扇定时控制器文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机制作简易电风扇定时控制器文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![51单片机制作简易电风扇定时控制器文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/23/fef82c83-344e-4474-a3cc-057a90f62b3e/fef82c83-344e-4474-a3cc-057a90f62b3e1.gif)
电风扇简易定时控制器
创键人:
w418781840日期:
2008.7.6
系统功能:
**********************************************/
函数名称:
声明区
功能描述:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSEGP0//数码管段选。
#defineDIGP2//数码管位选
uchardis[2];
//数码驱动组
ucharcodeTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,//0-4共阳。
0x92,0x82,0xF8,0x80,0x90,0xff};
//5-9,熄灭符
ucharstart,stop,close,sum,time;
//各其本变量
ucharfliflag,cflag,zflag,x,y;
//各标志位
uintcount_T0,count_T1,c_count;
//计数变量
sbitK1=P3_;
//功能移位键
sbitK2=P3_;
//加一键和切换移位键。
sbitK3=P3_;
//减一。
sbitRLED=P2_;
//红灯,表风扇转动状态。
sbitYLED=P2_;
//黄灯,表风扇暂停状态
sbitBLED=P2_;
//蓝灯,表系统状态
sbitCLED=P2_;
//风扇控制位
sbitZLED=P2_;
//系统工作控制位
延时1MS函数
显示调用。
voiddelay1ms(ucharx)
{
uchari,j;
for(i=0;
ifor(j=0;
j《120;
j++);
}
显示函数
显示分走时,两位显示。
voiddisplay(void)
uchari,scan=1;
i《2;
i++)
{SEG=0xff;
DIG=~scan;
SEG=TAB[dis[i]];
delay1ms(5);
scan《《=1;
延时5MS函数
按键消抖调用。
voiddelay5ms(ucharx)
ucharj;
for(j=0;
jdisplay();
初始化函数
各变量初始化。
voidinit()
{fliflag=0;
//闪烁标志。
cflag=1;
//风扇状态标志。
zflag=0;
//转动标志。
x=30;
//暂存
y=10;
CLED=1;
//系统工作。
sum=0;
//移位
start=30;
//风扇转动时间
stop=10;
//暂停时间。
close=5;
//系统关闭剩余时间
count_T0=0;
//T0,T1相关
count_T1=0;
c_count=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
分离函数
分离显示十位,个位
voiddisnner(void)
{if(cflag==1)//1
{RLED=0;
YLED=1;
BLED=1;
//红灯闪烁。
time=start;
//显示转动时间。
if(cflag==2)
{RLED=1;
YLED=0;
time=stop;
if(cflag==3)
BLED=0;
time=close;
dis[0]=time/10;
dis[1]=time%10;
T0中断函数
产生1分钟。
voidtimer0(void)interrupt1
{TH0=(65536-50000)/256;
if(++count_T0==1200)//一分钟。
{count_T0=0;
if(zflag==0)//为0
{ZLED=1;
//则转动。
if(start!
=99)//转动时间为99,显示99,不切换标志。
一直转动。
start--;
//不,则倒计时。
if(start==0)
{zflag=1;
//倒时时间到。
切换标志。
cflag=2;
start=x;
//重赋值
else
{ZLED=0;
//否则暂停。
stop--;
//倒计时计数。
if(stop==0)
{cflag=1;
//时间到。
stop=y;
if(close!
=99)//系统时间为99,显示99,系统一直工作。
.
{if(++c_count==60)//对一分计数60,即一小时后。
{c_count=0;
close--;
//做一小时倒计时。
if(close==0)//时间到,系统断电。
CLED=0;
//低电平有效。
disnner();
//分离。
送显示/
T1中断服务函数
调整时间闪烁用。
voidtimer1(void)interrupt3
if(++count_T1==6)//闪烁周期30MS
fliflag=~fliflag;
//切换
if(fliflag==0)//标志有效。
if(sum==1)cflag=1;
//选用状态闪烁。
if(sum==2)cflag=2;
if(sum==3)cflag=3;
//闪烁用。
dis[0]=10;
//放熄灭符。
dis[1]=10;
else//否则,正常显示。
RLED=1;
键扫描函数
调整时间
voidscanner(void)
{if(K1==0)//为0,表有键按下。
delay5ms(100);
//延时500MS.
if(K1==0)//还按下。
刚退出。
while(K1==0)display();
//等待释放。
delay5ms
(2);
//消抖。
//退出显示状态1.
//启动T0
TR1=0;
//关闪烁
//归位。
x=start;
//暂存。
y=stop;
{//否则,有移位键按下。
TR0=0;
//时间走动停止。
TR1=1;
//开闪烁。
sum++;
//移位。
if(sum==4)
sum=1;
if(K2==0)
while(K2==0)display();
if(sum)//有移位
{if(sum==1)
start++;
if(start==61)
start=99;
if(start==100)
if(sum==2)
stop++;
if(stop==61)
stop=5;
if(sum==3)
close++;
if(close==9)
close=99;
if(close==100)
close=1;
else//没移位。
cflag++;
//则进行显示状态移位。
if(cflag==4)
if(K3==0)
while(K3==0)display();
if(sum==1)
{start--;
if(start==29)
if(start==98)
start=60;
{stop--;
if(stop==4)
stop=60;
{close--;
if(close==0)
if(close==98)
close=8;
主函数
main()
init();
while
(1)
display();
//显示
scanner();
//检测按键。