蓝桥杯单片机省赛——第七届“模拟风扇控制系统”程序部分

本文详细回顾了蓝桥杯单片机省赛中的代码实现,包括基础代码(如蜂鸣器、继电器、LED和定时器),按键处理,驱动编写,以及温度和数码管显示。文章还介绍了中断函数在计时和环境监测中的应用。
摘要由CSDN通过智能技术生成

往期回顾

第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


一、前期准备

1:本文使用的头文件是由stc生成
在这里插入图片描述
点击保存文件之后,保存至自己文件目录下方即可
在这里插入图片描述
2:本文使用的都是官方提供的底层驱动代码
在这里插入图片描述

二、代码详情

1.基础代码

蜂鸣器/继电器/led/定时器之类的代码

参考之前写的文章
第四届蓝桥杯代码讲解

2.按键详解

按键写法讲解

直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解

3.驱动的处理

驱动写法讲解

直接跳转以前的文章即可
蓝桥杯驱动处理

4.温度/数码管部分处理

直接跳转以前的文章即可
蓝桥杯温度部分处理

5.总代码

/*这个头文件使用STC那边生成的*/
#include<stc15f2k.h>
#include<onewire.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
char disdula[]={0,0,0,0,0,0,0,0};

int diswela,ms,sign,date,temp,key,mode=1,a,aa,shezhi;
bit flag;

void buzz()
{
	P2=((P2&0X1F)|0XA0);
	P0=0X00;
	P2&=0X1F;
	
	P2=((P2&0X1F)|0X80);
	P0=0XFF;
	P2&=0X1F;
}

void led(int on)
{
	P2=((P2&0X1F)|0X80);
	P0=on;
	P2&=0X1F;
}

void delay(int x)
{
	int i;
	while(x--)
	for(i=0;i<5*123;i++);
}

void din()
{
	AUXR &= 0xBF;
	TMOD&=0XFF;
	TH1=0XFC;
	TL1=0X66;
	TH0=0XFF;
	TL0=0XA4;
	EA=1;
	TR1=1;
	ET1=1;
	TR0=1;
	ET0=1;
	
}

void display()
{
	P2=((P2&0X1F)|0Xe0);
	P0=0XFF;
	P2&=0X1F;
	
	P2=((P2&0X1F)|0Xc0);
	P0=1<<diswela;
	P2&=0X1F;
	
	P2=((P2&0X1F)|0Xe0);
	P0=dula[disdula[diswela]];
	P2&=0X1F;
	
	if(++diswela>=8)diswela=0;
}

void display_1()
{
	disdula[0]=10;
	disdula[1]=mode;
	disdula[2]=10;
	disdula[3]=11;
	disdula[4]=10;
	disdula[5]=date/100%10;
	disdula[6]=date/10%10;
	disdula[7]=date/1%10;
}

char anjian()
{
	static int key_up=1;
	int keyscan=0;
	if(key_up&(s7==0||s6==0||s5==0||s4==0))
	{
		delay(10);
		key_up=0;
		if(s4==0)keyscan=4;
		else if(s5==0)keyscan=5;
		else if(s6==0)keyscan=6;
		else if(s7==0)keyscan=7;
	}else if(s4==1&&s5==1&&s6==1&&s7==1)key_up=1;
	return keyscan;
}

void wendu()
{
	int LSB,MSB;
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(100);
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	Init_DS18B20();
	temp=0x00;
	temp=MSB;
	temp=(temp<<8)|LSB;
	if((temp&0xf800)==0x0000)
	{
		temp>>=4;
		temp=temp+((LSB&0X0F)*0.0625);
	}
}

void display_temp()
{
	disdula[0]=10;
	disdula[1]=4;
	disdula[2]=10;
	disdula[3]=11;
	disdula[4]=11;
	disdula[5]=temp/10%10;
	disdula[6]=temp/1%10;
	disdula[7]=12;
}



void main()
{
	buzz();
	din();
	wendu();
	while(1)
	{
		if(shezhi==0)
		display_1();
		else if(shezhi==1)
		{
			wendu();
			display_temp();
		}
		
	 
		
		
		
		
		if(flag==1)
		{
			if(mode==1&&date!=0)led(0xfe);
			else if(mode==2&&date!=0)led(0xfd);
			else if(mode==3&&date!=0)led(0xfb);
			else if(date==0)led(0xff);
			
			flag=0;
			key=anjian();
			switch(key)
			{
				case 4:	
					mode++;
					if(mode>3)mode=1;
					break;
				case 5:				
					date=date+60;
					if(date>120)date=0;
				
					break;
				case 6:
					date=0;
					break;
				case 7:
					if(shezhi==0)shezhi=1;
					else shezhi=0;
					break;
			}
		}
		
	}
}


void aq() interrupt 1
{	
	aa++;
	if(mode==1&&date>0)
	{
		if(aa==2)P34=0;
		if(aa==10){P34=1;aa=0;}
	}
	else if(mode==2&&date>0)
	{
		if(aa==3)P34=0;
		if(aa==10){P34=1;aa=0;}
	}
	else if(mode==3&&date>0)
	{
		if(aa==7)P34=0;
		if(aa==10){P34=1;aa=0;}
	}
}
		





void qa() interrupt 3
{	
	ms++;a++;
	if(!(ms%100))flag=1;
	if(ms>=1500)ms=0;
	
	if(a==1100)
	{
		a=0;
	if(date>0)date--;
	}
	display();
}
	

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值