/***************************************
项目名称:模拟风扇控制系统
实现功能:通过按键控制风扇的转动速度和定时时间,
数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间
实现功能: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();
- }
- }
复制代码
|