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