/************************************************************************程序说明:为了提高单片机的工作效率,不让单片机的工作消耗在延时上,所以在考虑单片几需要延时的时间里,单片机并不是做的无用功,仅仅是在执行消耗时间的“空指令”,而根据实际考虑出发,从本程序设计的思路来看,电机除了数码管显示和PWM调速部分需要一定延时外,其他指令都是uS级的,可以忽略不计,所以可以将数码管显示和PWM调速部分做在一起,即数码管每一位显示需延时的几个毫秒的时间可以用来做处理PWM调速功能使用,通过设定,改变脉宽从而调速!经过实验,本方法能够十分有效的节约单片机的资源,并且各项功能能够很好的工作!程序功能说明:功能总共有三个按键控制“功能键/加”“定时”“摇头/减”其中“功能键”“摇头”为多功能键初始状态时风扇不转数码管显示POFF当第一次按“功能/加”时风扇处于“自然风”电机转速最快当第二次按“功能/加”时风扇处于“常风”电机转速为中速当第三次按“功能/加”时风扇处于“睡眠风”电机转速为低速当风扇处于停止状态时不可进入定时状态,只有当风扇运转时才能进入定时状态,当按下“定时”键进入定时状态后(定时指示灯亮),功能键/加键为定时时间加,当按下“摇头/减键时,为定时时间减,再次按下定时键时,定时功能启动,时间到停止,并显示”POFF“风扇运转时按下摇头,即电机开始摇头。*************************************************************************/#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitled=P1^0;sbitduan=P2^6;sbitwei=P2^7;sbitk1=P3^6;//功能键/加键(3)sbitk2=P3^4;//定时功能键(1)sbitk3=P3^5;//摇头键/减键sbitpwm=P2^1;sbitzz=P2^1;sbitfz=P2^2;uintt=50000,g=1;//g用来表是选的风功能,tt定时的时间ucharf,biao1=0,sudu;inttt=0;ucharkk=1;uintaa=5;/************才初始化函数**************************************/voidinit(){EA=1;ET0=1;//TR0=1;TMOD=0X01;//定时器0工作方式116位TH0=(65536-t)/256;TL0=(65536-t)%256;}/***************************************************/ucharcodesz[]={0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x71,/*F*///100x5C,/*o*///110x73//p12};voiddelay(uintxms){uinti,j;for(i=xms;i0;i--)for(j=50;j0;j--);}/********pwm调速兼作延时**************************/voidpwmdelay(ucharqq){pwm=1;delay(1);pwm=0;delay(qq);pwm=1;}/************当风扇停止时显示的函数*******************************/voiddisplay2(){P0=sz[12];duan=1;duan=0;P0=0xfe;wei=1;wei=0;delay(10);//pwmdelay(sudu);P0=sz[0];duan=1;duan=0;P0=0xfd;wei=1;wei=0;delay(10);//pwmdelay(sudu);P0=sz[10];duan=1;duan=0;P0=0xfb;wei=1;wei=0;delay(10);//pwmdelay(sudu);P0=sz[10];duan=1;duan=0;P0=0xf7;wei=1;wei=0;delay(10);//pwmdelay(sudu);P0=0xff;wei=1;wei=0;P0=0x00;//关闭数码管显示防止闪烁duan=1;duan=0;}/**************显示函数*****************************/voiddisplay(uintshu){ucharqian,bai,shi,ge;qian=biao1;bai=shu/100;shi=(shu%100)/10;ge=(shu%10);P0=sz[qian];duan=1;duan=0;P0=0xfe;wei=1;wei=0;//delay(1);pwmdelay(sudu);P0=sz[bai];duan=1;duan=0;P0=0xfd;wei=1;wei=0;//delay(1);pwmdelay(sudu);P0=sz[shi];duan=1;duan=0;P0=0xfb;wei=1;wei=0;//delay(1);pwmdelay(sudu);P0=sz[ge];duan=1;duan=0;P0=0xf7;wei=1;wei=0;//delay(1);pwmdelay(sudu);P0=0x00;//关闭数码管显示防止闪烁duan=1;duan=0;P0=0xff;wei=1;wei=0;}/**************************************************//***************键盘程序***********************************/voidkescan(){ucharbiao2;//一键多功能的标号/**************************************/if(k1==0)//功能键一键多功能键自然风常风睡眠风停止{delay(50);if(k1==0){pwm=0;//关闭电机while(!k1);//等待释放按键biao1++;//功能选择if(biao1==4)//只允许四种状态biao1=0;}}/***********************************************/if(biao1!=0)//功能0时不可以设置定时功能{if(k2==0)//定时功能键按一次设置第二次确认{delay(50);if(k2==0){tt=000;//如果进入定时功能则显示全部清零TR0=0;//确认按键俺下后关闭定时器while(!k2);//等待释放按键biao2=1;while(biao2)//如果不再次按下K2则将一直保持设置状态{led=0;if(k1==0){delay(50);if(k1==0){while(!k1);tt=tt+10;if(tt990)//tt=0;}}if(k3==0){delay(50);if(k3==0){while(!k3);tt=tt-10;if(tt0)//tt=990;}}display(tt);//刷新设置的时间if(k2==0)//k2是否再次按下{delay(50);if(k2==0){while(!k2);if(tt0)//如果进入定时设置后没有设置时间则不能退出定时功能biao2=0;}}}TR0=1;//设置好定时功能后开启定时器led=1;}TR0=1;//开启定时器}}}/************功能函数**********************/voidgongnen(){while(biao1==0){pwm=0;tt=0;kescan();display2();}if(biao1==1)//功能1自然风{sudu=0;}if(biao1==2)//功能2常风{sudu=4;}if(biao1==3)//功能3睡眠风{sudu=10;}}/*************************************/voidmain(){init();while(1){kescan();display(tt);gongnen();}}/*****************************************//*****************定时器0中断函数************************/voidt_0()interrupt1{TH0=(65536-t)/256;TL0=(65536-t)%256;f++;if(f==20){f=0;tt--;}if(tt==0)//如果定时到了显示为000,电机关闭{tt=000;biao1=0;//使电机不转TR0=0;}}P0P1P2P3P0P1P2P3d1d2d3d4d5d6d7d8d1d2d3d4weiweiduand2d3d4d5d6d7d8duanXTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C521B11C162B22C153B33C144B44C135B55C126B66C117B77C10COM9U4ULN2003AD03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE1LE11U274HC373D03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719OE1LE11U374HC373R110kR210kR310kR4500R5500R610kR710kR810k