标题:
模拟风扇控制系统源码-蓝桥杯例程
[打印本页]
作者:
刘雪梅
时间:
2018-3-16 12:28
标题:
模拟风扇控制系统源码-蓝桥杯例程
/***************************************
项目名称:模拟风扇控制系统
实现功能:通过按键控制风扇的转动速度和定时时间,
数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间
实现功能: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();
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1