恳求侠友改改!(电风扇温度,转速,定时控制程序)<br /> keil可以通过,但仿真显示的结果不对,<br /> 按键功能:K1功能;K2移位;K3递增;K4递减;<br /> <br /> 设计的想法是开机显示当前的温度,可以设置时间,<br />上限温度,定时开始时间和定时结束时间。当处在设置<br />的时间段里边时,如果当前温度超过了上限值,则风扇<br />转,其转速受当前温度和上限温度的差值控制,差值越<br />小转速越慢,反之则越快,<br /><br /> 恳求高手们可以给我改改不胜感激!我的联系方式:<br /> QQ:270662589 Email:pmmimosa@126.com<br /><br />#include<reg51.h><br />#include<intrins.h><br />#include<stdio.h><br />#define uchar unsigned char<br />#define uint unsigned int<br />uchar display[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0~9<br /> 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};//带点0~9;关数码管<br />uchar disbit[4];<br />uchar hour,min,sec,hour1,min1,hour2,min2;<br />uint count_down;<br />uint temp5,temp,temp1,temp2;<br />uchar htemp,ltemp;<br />uchar or_b;<br />uchar show_p;<br />uchar attr;<br />char tep;<br />bit led_on;<br />bit flash;<br />sbit K1=P1^0;<br />sbit K2=P1^1;<br />sbit K3=P1^2;<br />sbit K4=P1^3;<br />sbit ST=P3^0;<br />sbit OE=P3^1;<br />sbit EOC=P3^2;<br />sbit CLK=P3^3;<br />sbit S1=P3^4;<br />sbit S2=P3^5;<br />sbit S3=P3^6;<br />sbit S4=P3^7;<br />sbit CORT=P1^4;<br />void time_to();<br />void pwm_temp();<br /><br /><br />void delay(uchar t)//112ms?<br />{ uchar i;<br /> while(t--)<br /> for(i=0;i<10;i++);<br />}<br /><br />void main()<br />{ <br /> hour=0;min=0;sec=0;count_down=8000;<br /> hour1=0;min1=0;hour2=23;min2=59;<br /> htemp=24;ltemp=0;<br /> flash=0;<br /> show_p=0;<br /> attr=0xff;<br /> led_on=1;<br /><br /> TMOD=0x22;<br /> TH0=0xFF;TL0=0x8C;//0.125ms,ff8cH;1/8000s用于走时;提供A/D时钟,640kHZ以下<br /> TH1=0xB8;TL1=0x00;//20ms,B800H;用于按键扫描<br /> TR0=1;TR1=1;<br /> ET0=1;ET1=1;EA=1;<br /> while(1)<br /> ;<br /><br /> <br /><br />}<br /><br /><br /><br />void pwm_temp()<br />{ if(EOC==1)<br /> { OE=1;<br /> temp5=P2;<br /> OE=0;<br /> }<br /> temp=temp5*1000/256;<br /> temp1=htemp*10+ltemp;<br /> if(temp>temp1)<br /> { temp2=temp-temp1;<br /> if(temp2<40)<br /> { CORT=1;<br /> delay(temp2);<br /> CORT=0;<br /> delay(40-temp2);<br /> }<br /> else<br /> CORT=1;<br /> }<br /> ST=1;ST=0;<br />}<br /><br />void time_to()//定时时间的处理<br />{ if(hour2>=hour1)<br /> {if(hour1==hour2)<br /> { if(min2>min1)<br /> or_b=1;<br /> else<br /> or_b=2;<br /> }<br /> else<br /> or_b=3;<br /> }<br /> else<br /> or_b=2;<br /> switch(or_b)<br /> { case 1: if(hour==hour1&&min<min2&&min>min1)<br /> pwm_temp();<br /> case 2: if(hour>=hour1)<br /> { if(hour==hour1)<br /> { if(min>min1)<br /> pwm_temp();<br /> }<br /> else<br /> pwm_temp();<br /> }<br /> if(hour<=hour2)<br /> { if(hour==hour2)<br /> { if(min<min2)<br /> pwm_temp();<br /> }<br /> else<br /> pwm_temp();<br /> }<br /> case 3: if(hour==hour1&&min>min1)<br /> pwm_temp();<br /> if(hour>hour1&&hour<hour2)<br /> pwm_temp();<br /> if(hour>hour1&&hour==hour2)<br /> { if(min<min2)<br /> pwm_temp();<br /> }<br /> }<br /> return;<br />}<br /><br /><br /><br /><br /><br />void time0(void) interrupt 1<br />{ CLK=~CLK;<br /> count_down--;<br /> if(count_down==1||count_down==4001)<br /> flash=~flash;<br /> if(count_down==0)<br /> { count_down=8000;<br /> sec++;<br /> if(sec==60)<br /> { sec=0;<br /> min++;<br /> if(min==60)<br /> { min=0;<br /> hour++;<br /> if(hour==24) <br /> hour=0;<br /> }<br /> }<br /> }<br /> TH0=0xFF;TL0=0x8C;//0.125ms,ff8cH<br />}<br /><br /><br /><br /><br /><br />void time1(void) interrupt 3<br />{ uchar i;<br /> TH1=0xB8;TL1=0x00;<br /> <br /> /************键值处理*************/<br /> if(K1==0&&led_on==1)<br /> { if(show_p==1)<br /> show_p=0;<br /> if(show_p==0)<br /> show_p=3;<br /> if(show_p==3)<br /> show_p=4;<br /> if(show_p==4)<br /> show_p=5;<br /> if(show_p==5)<br /> show_p=1;<br /> }<br /> if(K2==0&&led_on==1)<br /> { switch(attr)<br /> {case 0xff:attr=0x3f;break;<br /> case 0x3f:attr=0xcf;break;<br /> case 0xcf:attr=0xff;<br /> }<br /> }<br /> if(K3==0)<br /> { switch(attr)<br /> {case 0xff:if(show_p==0)<br /> led_on=~led_on;<br /> break;<br /> case 0x3f:if(show_p==0)<br /> hour=(hour+1)%24;<br /> if(show_p==3)<br /> htemp=(htemp+1)%100;<br /> if(show_p==4)<br /> hour1=(hour1+1)%24;<br /> if(show_p==5)<br /> hour2=(hour2+1)%24;<br /> break;<br /> case 0xcf:if(show_p==0)<br /> min=(min+1)%60;<br /> if(show_p==3)<br /> ltemp=(ltemp+1)%10;<br /> if(show_p==4)<br /> min1=(min1+1)%60;<br /> if(show_p==5)<br /> min2=(min2+1)%60;<br /> }<br /> }<br /> if(K4&&led_on==1)<br /> { switch(attr)<br /> {case 0xff:if(show_p==0||show_p==3||show_p==4||show_p==5)<br /> show_p=1;<br /> break;<br /> case 0x3f:if(show_p==0)<br /> { tep=hour-1;<br /> if(tep<0)<br /> hour=23;<br /> else hour=tep;<br /> }<br /> if(show_p==3)<br /> { tep=htemp-1;<br /> if(tep<0)<br /> htemp=99;<br /> else htemp=tep;<br /> }<br /> if(show_p==4)<br /> { tep=hour1-1;<br /> if(tep<0)<br /> hour1=23;<br /> else hour1=tep;<br /> }<br /> if(show_p==5)<br /> { tep=hour2-1;<br /> if(tep<0)<br /> hour2=23;<br /> else hour2=tep;<br /> }<br /> break;<br /> case 0xcf:if(show_p==0)<br /> { tep=min-1;<br /> if(tep<0)<br /> min=59;<br /> else min=tep;<br /> }<br /> if(show_p==3)<br /> { tep=ltemp-1;<br /> if(tep<0)<br /> ltemp=9;<br /> else ltemp=tep;<br /> }<br /> if(show_p==4)<br /> { tep=min1-1;<br /> if(tep<0)<br /> min1=59;<br /> else min1=tep;<br /> }<br /> if(show_p==5)<br /> { tep=min2-1;<br /> if(tep<0)<br /> min2=59;<br /> else min2=tep;<br /> }<br /> }<br /> }<br /> /*********当前显示的内容*********/<br /> if(show_p==0)<br /> { disbit[0]=hour/10;<br /> disbit[1]=hour%10+10;<br /> disbit[2]=sec/10;<br /> disbit[3]=sec%10;<br /> }<br /> if(show_p==1)<br /> { disbit[0]=20;<br /> disbit[1]=temp/100;<br /> disbit[2]=(temp%100)/10+10;<br /> disbit[3]=temp%100;<br /> }<br /> if(show_p==3)<br /> { disbit[0]=20;<br /> disbit[1]=temp1/100;<br /> disbit[2]=(temp%100)/10+10;<br /> disbit[3]=temp%10;<br /> }<br /> if(show_p==4)<br /> { disbit[0]=hour1/10;<br /> disbit[1]=hour1%10+10;<br /> disbit[2]=min1/10;<br /> disbit[3]=min1%10;<br /> }<br /> if(show_p==5)<br /> { disbit[0]=hour2/10;<br /> disbit[1]=hour2%10+10;<br /> disbit[2]=min2/10;<br /> disbit[3]=min2%10;<br /> }<br /><br /> if(led_on)<br /> { for(i=0;i<4;i++)<br /> { <br /> if(flash||attr&(0x80>>i))<br /> { P0=display[disbit];<br /> switch(i)<br /> { case 0:S1=1;delay(10);S1=0;<br /> case 1:S2=1;delay(10);S2=0;<br /> case 2:S3=1;delay(10);S3=0;<br /> case 3:S4=1;delay(10);S4=0;<br /> }<br /> }<br /> }<br /> }<br /> else S1=S2=S3=S4=0;<br />}<br /><br /><br /><br /><br /><br /><br /><br /> |
|