找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2642|回复: 1
收起左侧

蓝桥杯单片机开发第7届省赛模拟风扇控制系统及源代码

[复制链接]
ID:656536 发表于 2020-3-24 18:54 | 显示全部楼层 |阅读模式
#include <stc15f2k60s2.h>

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit dianji = P3^4;

unsigned char code LedChar[] = {
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
        0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0x7F
};
unsigned char LedBuff[8] = {
  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char pwn_value = 0;
unsigned char mode = 1;   //1 睡眠风 2 自然风 3 常风 4 温度
unsigned int time = 0;
unsigned char dat_Led = 0;
bit flag1s = 0;
bit mode_T = 0;  //温度显示位


void InitSystem();
void SMGWorking();
void Ledrunning();
void ScanKeys();
void Timer0Init(void);                //1毫秒@12.000MHz
void Timer1Init(void);                //10微秒@12.000MHz
extern bit Start18B20();
extern unsigned char Get18B20temp();

void main()
{
        Timer0Init();
        Timer1Init();
  InitSystem();
        while(1)
        {
          Ledrunning();
                SMGWorking();
                ScanKeys();
        }
}
/******HC573选择函数*******/
void Select74HC573(unsigned char channel)
{
  switch(channel)
        {
          case 4:P2 = (P2&0x1F)|0x80;break;
                case 5:P2 = (P2&0x1F)|0xA0;break;
                case 6:P2 = (P2&0x1F)|0xC0;break;
                case 7:P2 = (P2&0x1F)|0xE0;break;
                default:P2 = (P2&0x1F)|0x00;break;
        }
}
/*******关闭LED和蜂鸣器、继电器******/
void InitSystem()
{
  Select74HC573(5);
        P0 = 0x00;
        Select74HC573(4);
        P0 = 0xFF;
        Select74HC573(0);
}
/******LED显示函数*******/
void Ledrunning()
{
  Select74HC573(4);
        if(dat_Led<3)
        {
          P0 = ~(0x01<<dat_Led);
        }
        else  
        {
          P0 = 0xFF;  //风扇停止转动
        }
        Select74HC573(0);
        P0 = 0xFF;
}
/*******数码管显示函数*******/
void SMGWorking()
{
        unsigned char temp;
        if(flag1s)
        {
          flag1s = 0;
                Start18B20();
                temp = Get18B20temp();
        }
  if(mode_T==0)
        {
          LedBuff[0] = LedChar[16];
                LedBuff[1] = LedChar[mode];
                LedBuff[2] = LedChar[16];
                LedBuff[3] = 0xFF;
                LedBuff[4] = LedChar[time/1000];
                LedBuff[5] = LedChar[time/100%10];
                LedBuff[6] = LedChar[time/10%10];
                LedBuff[7] = LedChar[time%10];
        }
        else
        {
          LedBuff[0] = LedChar[16];
                LedBuff[1] = LedChar[4];
                LedBuff[2] = LedChar[16];
                LedBuff[3] = 0xFF;
                LedBuff[4] = 0xFF;
                LedBuff[5] = LedChar[temp/10];
                LedBuff[6] = LedChar[temp%10];
                LedBuff[7] = LedChar[12];
        }
}
void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}
/*******按键相关函数*******/
void ScanKeys()
{
/******室温按键******/
  if(S7==0)
        {
          Delay1ms();
                if(S7==0)
                {
                        mode_T = ~mode_T;
                  while(S7==0)
                        {
                          SMGWorking();
                        }
                }
        }
/*******停止按键,清零工作时间*******/
        if(S6==0)
        {
          Delay1ms();
                if(S6==0)
                {
                        time = 0;
                        dat_Led = 4;  //关闭Led
                  while(S6==0)
                        {
                          SMGWorking();
                        }
                }
        }
/*******定时按键******/
        if(S5==0)
        {
          Delay1ms();
                if(S5==0)
                {
                        time += 60;
                  while(S5==0)
                        {
                          SMGWorking();
                        }
                }
        }
/******工作模式切换*******/
        if(S4==0)
        {
          Delay1ms();
                if(S4==0)
                {
                        switch(mode)
                        {
                          case 1:mode=2;dat_Led=1;pwn_value=30;break;
                                case 2:mode=3;dat_Led=2;pwn_value=70;break;
                                case 3:mode=1;dat_Led=0;pwn_value=20;break;
                        }
                  while(S4==0)
                        {
                          SMGWorking();
                        }
                }
        }
}
/******数码管刷新*****/
void ScanSMG()
{
  static unsigned char i = 0;
        P0 = 0xFF;
        Select74HC573(6);
        P0 = 0x01<<i;
        Select74HC573(7);
        P0 = LedBuff[i++];
        if(i>=8)
                i = 0;
        Select74HC573(0);
}
void Timer0Init(void)                //1毫秒@12.000MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x20;                //设置定时初值
        TH0 = 0xD1;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0 = 1;
        EA = 1;
}
/*******定时器0相关函数*******/
void InterruprTimer0() interrupt 1
{
        static unsigned int cnt = 0;
  ScanSMG();
        cnt++;
        if(cnt>=1000)
        {
          flag1s = 1;
                cnt = 1;
                if(time>0)
                        time--;
                else
                        time = 0;
        }
}
/*******定时器1相关函数*******/
void Timer1Init(void)                //10微秒@12.000MHz
{
        AUXR &= 0xBF;                //定时器时钟12T模式
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xF6;                //设置定时初值
        TH1 = 0xFF;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时
        ET1 = 1;
        EA = 1;
}
void InterruptTimer1() interrupt 3
{
  static unsigned char pwn = 0;
        pwn++;
        if(pwn<=pwn_value)
        {
          dianji = 1;
        }
        else if(pwn>=100)
        {
                dianji = 1;
          pwn = 0;
        }
        else
        {
          dianji = 0;
        }
}


第7届模拟风扇系统_2.rar

43.01 KB, 下载次数: 53, 下载积分: 黑币 -5

省赛试题-第7届-模拟风扇控制系统.pdf

158.42 KB, 下载次数: 23, 下载积分: 黑币 -5

回复

使用道具 举报

ID:666076 发表于 2021-3-23 14:24 | 显示全部楼层
原理图有吗?铁铁
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表