蓝桥杯单片机第七届初赛试题模拟风扇控制系统

在这里插入图片描述
所涉及模块如图 pwm ds18b20参考以前文章

#include <STC15F2K60S2.h>
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
uchar yi,er,san,si,wu,liu,qi,ba;
uchar tem;//温度
uchar wind_n=1;//风速控制
uchar time=0;//倒计时时间
uchar time_n=0;//定时时间控制
uint tt=0;//定时器计数
uint count=0;
uchar flag7=0;//按键s7标志位

void Delay1ms(uint ms);
void allinit();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void keyscan();
void ledscan();
void Timer0Init(void);	


void main()
{
	allinit();
	Timer0Init();
	yi=10,er=1,san=10,si=11,wu=0,liu=0,qi=0,ba=0;
	while(1)
	{
		if(flag7==0)
		{
		yi=10,er=wind_n,san=10,si=11;
		wu=time/1000,liu=time%1000/100,qi=time%100/10,ba=time%10;
		}

		if(flag7==1)
		{
		yi=10,er=4,san=10,si=11,wu=11,liu=tem/10,qi=tem%10,ba=12;
		}
	
		
		tem=temget();
		keyscan();
		ledscan();
		display1(yi,er);
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba);
	}

}



void keyscan()
{
	if(P30==0)//S7
	{
	  Delay1ms(5);
		if(P30==0)
		{	
			 if(flag7==0)
				 flag7=1;
			 else if (flag7==1)
				 flag7=0;
		}
	  while(!P30);//避免重复判断
	}

	if(P31==0)//S6
	{
	  Delay1ms(5);
		if(P31==0)
		{
	   time=0;
		}
	  while(!P31);//避免重复判断
	}
	
	
if(P32==0)//S5
	{
	  Delay1ms(5);
		if(P32==0)
		{
			if(time==0)
				time=60;
			else if(time<=60)
			  time=120;
			else if(time<=120)
				time=0;
//		 		    switch(time_n)//切换定时时间  可实现与if同样功能
//							{
//								case 0:
//					        time=60;
//									time_n=1;
//								break;
//								
//								case 1:
//									time=120;
//									time_n=2;
//								break;
//								
//								case 2:
//								  time=0;
//									time_n=0;
//								break;
//							}			
			
		}
	  while(!P32);//避免重复判断
	}
	
  if(P33==0)//S4
	{
	  Delay1ms(5);
		if(P33==0)
		{		      

			if(wind_n==1)
					wind_n=2;
			else if(wind_n==2)
					wind_n=3;
			else if(wind_n==3)
					wind_n=1;

//							switch(wind_n)//切换工作风速  可实现与if同样功能
//							{
//								case 1:
//									wind_n=2;
//								break;
//								
//								case 2:
//									wind_n=3;
//								break;
//								
//								case 3:
//									wind_n=1;
//								break;
//							}					
		}
	  while(!P33);//避免重复判断
	}

}

void ledscan()
{
	if(time>0)
	{
					if(wind_n==1)
				{
					P2=0X80;
					P0=0XFE;
				}
				else if(wind_n==2)
				{
					P2=0X80;
					P0=0XFD;
				}
				else if(wind_n==3)
				{
					P2=0X80;
					P0=0XFB;
				}
	}
	else
	{
			P2=0X80;
			P0=0XFF;
	}


}


void Timer0Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x50;		//设置定时初值
	TH0 = 0xFB;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	ET0=1;
	EA=1;
}

void Timer0() interrupt 1
{
	tt++;
	count++;
	if(count==10000)
	{
		count=0;
		if(time>0)
		{
		  time--;
		}
	}
	
	if(tt==11)//pwm波频率控制
	{
	  tt=1;
	}
	if(time>0)
	{
		if(wind_n==1)//pwm波控制
				{
					if(tt<3)
						P34=1;
					else P34=0;
				}
				else if(wind_n==2)
				{
					if(tt<4)
						P34=1;
					else P34=0;
				}
				else if(wind_n==3)
				{
					if(tt<8)
						P34=1;
					else P34=0;
				}
	}
	
				

  
	
}


void allinit()
{
		P2=0X80;
		P0=0XFF;
	
		P2=0XC0;
		P0=0XFF;
		P2=0XE0;
		P0=0XFF;
	
		P2=0XA0;
		P0=0X00;

}

void Delay1ms(uint ms)		//@12.000MHz
{
	unsigned char i, j;
  uint k;
	for(k=ms;k>0;k--)
	{
			i = 12;
			j = 169;
			do
			{
				while (--j);
			} while (--i);
		
	}
	
}

void display1(uchar yi,uchar er)
{
	  P2=0XC0;
		P0=0X01;//段选
		P2=0XE0;
		P0=tab[yi];//位选
	  Delay1ms(1);
	
	  P2=0XC0;
		P0=0X02;//段选
		P2=0XE0;
		P0=tab[er];//位选
	  Delay1ms(1);

}

void display2(uchar san,uchar si)
{
	  P2=0XC0;
		P0=0X04;//段选
		P2=0XE0;
		P0=tab[san];//位选
	  Delay1ms(1);
	
	  P2=0XC0;
		P0=0X08;//段选
		P2=0XE0;
		P0=tab[si];//位选
	  Delay1ms(1);
}


void display3(uchar wu,uchar liu)
{
	  P2=0XC0;
		P0=0X10;//段选
		P2=0XE0;
		P0=tab[wu];//位选
	  Delay1ms(1);
	
	  P2=0XC0;
		P0=0X20;//段选
		P2=0XE0;
		P0=tab[liu];//位选
	  Delay1ms(1);

}

void display4(uchar qi,uchar ba)
{
	  P2=0XC0;
		P0=0X40;//段选
		P2=0XE0;
		P0=tab[qi];//位选
	  Delay1ms(1);
	
	  P2=0XC0;
		P0=0X80;//段选
		P2=0XE0;
		P0=tab[ba];//位选
	  Delay1ms(1);
	
	  P2=0XC0;
		P0=0XFF;//段选
		P2=0XE0;
		P0=0XFF;//位选

}


DS18B20驱动

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台
  日    期: 2011-8-9
*/

#include "onewire.h"

//单总线延时函数
void Delay_OneWire(unsigned int t)
{
	t=12*t;//时间扩大12倍
  while(t--);
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 1;
	Delay_OneWire(12);
	DQ = 0;
	Delay_OneWire(80); 
	DQ = 1;
	Delay_OneWire(10); 
	initflag = DQ;    
	Delay_OneWire(5);
  
	return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

unsigned char temget(void)
{
	unsigned char temp;
	unsigned char low,high;
	Init_DS18B20();//初始化
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
  high=Read_DS18B20();
	temp=(low>>4)|(high<<4);
	
	return temp;



}

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#include <STC15F2K60S2.h>
#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P1^4;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);

//添加函数
unsigned char temget(void);

#endif

猜你喜欢

转载自blog.csdn.net/weixin_42244181/article/details/88415328