/***************************************
項目名稱:模擬風扇控制系統
實現功能:通過按鍵控制風扇的轉動速度和定時時間,
數碼管實時顯示風扇的工作模式,動態倒計時顯示剩余的定時時間
實現功能:1.S4定義為工作模式切換按鍵,每次按下S4,設備循環切換三種工作模式
2.S5 定義為“定時按鍵”每次按下 S5,定時時間增加 1 分鐘,設備的剩余
工作時間重置為當前定時時間,重新開始倒計時
3.S6 定義為“停止”按鍵,按下 S6 按鍵,立即清零剩余工作時間,PWM
信號停止輸出,直到通過 S5 重新設置定時時間
4.S7 定義為“室溫”按鍵,按下 S7,通過數碼管顯示當前室溫
5.設備具有“睡眠風”、“自然風”和“常風”三種工作模式可以通過按鍵切換,通過
單片機 P34 引腳輸出脈寬調制信號控制電機運行狀態,信號頻率為 1KHz。
6.“睡眠風”模式下,L1 點亮,“自然風”模式下 L2 點亮,“常風”模式下 L3 點亮;
按下停止按鍵或倒計時結束時,LED 全部熄滅
****************************************/
單片機源程序如下:
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #include "ds18b20.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit pwm=P3^4; // pwm
- sbit S4=P3^3; // 模式
- sbit S5=P3^2; // 定時
- sbit S6=P3^1; // 停止
- sbit S7=P3^0; // 室溫
- #define led_addr XBYTE[0x9fff]
- #define ziwei_addr XBYTE[0xdfff]
- #define zixing_addr XBYTE[0xffff]
- #define dalindun_addr XBYTE[0xbfff]
- uchar wd=0,ms=1,dsw,ds,kk=20;
- uchar pwmh,pwml;
- uchar code zixing[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
- 0x7D,0x07,0x7F,0x6F,0x77,0x7C,
- 0x39,0x5E,0x79,0x71,0x76,0x00,0x40};
- uchar code ziwei[]={0x01,0x02,0x04,0x08,
- 0x10,0x20,0x40,0x80};
- void delay(uint i) //延時函數
- {
- unsigned int j,k;
- for(j=0;j<i;j++)
- for(k=0;k<1200;k++);
- }
- void tc0int(void)
- {
- TMOD=0x01;
- TH0=0x3C;
- TL0=0x0B0;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void tc0(void) interrupt 1 using 0
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- kk--;
- if(kk==0)
- {
- kk=20;
- if(ds==0)
- ds=0;
- else
- ds--;
- }
- }
- void tc1int(void)
- {
- TMOD=0x10;
- TH1=pwml/256;
- TL1=pwml%256;
- EA=1;
- ET1=1;
- TR1=1;
- }
- void tc1(void) interrupt 3 using 1
- {
- uchar flag;
- flag=~flag;
- if(flag)
- {
- TH1=pwmh/256;
- TL1=pwmh%256;
- }
- else
- {
- TH1=pwml/256;
- TL1=pwml%256;
- }
- pwm=!pwm;
- }
- void disp(void)
- {
- uchar disbuf[8];
- uchar m,temperature;
- temperature=rd_temperature();
- if(ds==0)
- TR1=0;
- else
- TR1=1;
- if(wd==0)
- {
- disbuf[0]=18;
- disbuf[1]=ms;
- disbuf[2]=18;
- disbuf[3]=17;
- disbuf[4]=0;
- disbuf[5]=ds/100;
- disbuf[6]=(ds/10)%10;
- disbuf[7]=ds%10;
- for(m=0;m<8;m++)
- {
-
- zixing_addr=~zixing[disbuf[m]];
- ziwei_addr=ziwei[m];
- delay(1);
- zixing_addr=0xff;
-
- }
-
-
- }
- if(wd==1)
- {
- disbuf[0]=18;
- disbuf[1]=4;
- disbuf[2]=18;
- disbuf[3]=17;
- disbuf[4]=17;
- disbuf[5]=temperature/10;
- disbuf[6]=temperature%10;
- disbuf[7]=12;
- for(m=0;m<8;m++)
- {
-
- zixing_addr=~zixing[disbuf[m]];
- ziwei_addr=ziwei[m];
- delay(1);
- zixing_addr=0xff;
-
- }
- }
- if(ms==1)
- led_addr=0xFE;
- if(ms==2)
- led_addr=0xFD;
- if(ms==3)
- led_addr=0xFB;
- if(ds==0)
- led_addr=0xFF;
- }
- void key_read(void)
- {
- if(S4==0)
- {
- delay(1);
- if(S4==0)
- {
- while(S4==0)
- disp();
- ms++;
- if(ms==4)
- ms=1;
- }
- }
- if(S5==0)
- {
- delay(1);
- if(S5==0)
- {
- while(S5==0)
- disp();
- dsw++;
- if(dsw==3)
- dsw=0;
- ds=dsw*60;
- }
- }
-
- if(S6==0)
- {
- delay(1);
- if(S6==0)
- {
- while(S6==0)
- disp();
- ds=0;
- }
- }
- if(S7==0)
- {
- delay(1);
- if(S7==0)
- {
- while(S7==0)
- disp();
- wd=!wd;
- }
- }
- }
- void pwmsc(void)
- {
- if(ms==1)
- pwmh=65536-200;
- pwml=65536-800;
- if(ms==2)
- pwmh=65536-300;
- pwml=65536-700;
- if(ms==3)
- pwmh=65536-700;
- pwml=65536-300;
- }
- void main(void)
- {
- tc0int();
- tc1int();
- while(1)
- {
-
- disp();
- key_read();
- pwmsc();
- }
- }
復制代碼
|