蓝桥杯单片第七届-模拟风扇

题目

在这里插入图片描述

main.c

#include<stc15f2k60s2.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

#define s0 0
#define s1 1
#define duty1 2
#define duty2 3
#define duty3 7

uchar TemperGet();

uchar semg[13] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
								 0xbf, 0xc6, 0xff};
uchar semg_temp[8] = {12, 12, 12, 12, 12, 12, 12, 12};
uchar semg_bit[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

int timeout = 60;
int duty = 2;
uchar state = s0;
uchar mode = 1;


void Timer0Init(void)		//100΢Ãë@11.0592MHz
{
	AUXR |= 0x80;		//¶¨Ê±Æ÷ʱÖÓ1Tģʽ
	TMOD &= 0xF0;		//ÉèÖö¨Ê±Æ÷ģʽ
	TL0 = 0xAE;		//ÉèÖö¨Ê±³õÖµ
	TH0 = 0xFB;		//ÉèÖö¨Ê±³õÖµ
	TF0 = 0;		//Çå³ýTF0±êÖ¾
	TR0 = 1;		//¶¨Ê±Æ÷0¿ªÊ¼¼Æʱ
	EA = 1;
	ET0 = 1;
}


void pwm()
{
	static int time_duty = 0, time_temp = 0;
	time_duty++;
	if(time_duty == 10)
		time_duty = 0;
	if(timeout)
		if(time_duty < duty)
			P34 = 1;
			//P07 = 0;
		else
			//P07 = 1;
			P34= 0;
	else
		P34 = 0;
	//P2 = 0x80;
	if(timeout)
		time_temp++;
	if(time_temp == 10000)
	{
		timeout--;
		time_temp = 0;
	}
	if(timeout == 0)
		duty = 0;
	else 
		timeout = timeout;
}


void display()
{
	uchar i;
	P2 = 0xe0;	P0 = semg[semg_temp[i]];
	P2 = 0xc0;	P0 = semg_bit[i];
	i++;
	if(i == 8)
		i = 0;
	P2 = 0x00;	P0 = 0Xff;
}


void led()
{
	if(timeout == 0)
		P0 = 0xff;
	else
	{
		if(mode == 1)
			P00 = 0;
		else if(mode == 2)
			P01 = 0;
		else if(mode == 3)
			P02 = 0;
		else	;
		P0 = P0 | 0x78;
	}
	P2 = 0X80;
	P2 = 0x00;	P0 = 0Xff;
}


void fun1() interrupt 1
{
	uchar i;
	i++;
	pwm();
	if(i == 20)
	{
		i = 0;
		led();
		display();
	}
}


void menu(char keyvalue, uchar tempr)
{
	if(mode == 1)
		duty = duty1;
	else if(mode == 2)
		duty = duty2;
	else if(mode == 3)
		duty = duty3;
		
	if(keyvalue == 4)
	{
		mode++;
		if(mode > 3)
			mode = 1;
	}
	else if(keyvalue == 5)
	{
		timeout = timeout + 60;
		if(timeout > 60 && timeout < 120)
			timeout = 120;
		if(timeout > 120)
			timeout = 0;
	}
	else if(keyvalue == 6)
	{
		timeout = 0;
		duty = 0;
	}
	
	switch(state)
	{
		case s0:
		{
			semg_temp[0] = 10;
			semg_temp[1] = mode;
			semg_temp[2] = 10;
			semg_temp[3] = 12;
			semg_temp[4] = 0;
			semg_temp[5] = timeout / 100;
			semg_temp[6] = (timeout - semg_temp[5] * 100) / 10;
			semg_temp[7] = timeout % 10;
			if(keyvalue == 7)
				state = s1;
		}	break;
		
		case s1:
		{
			semg_temp[0] = 10;
			semg_temp[1] = 4;
			semg_temp[2] = 10;
			semg_temp[3] = 12;
			semg_temp[4] = 12;
			semg_temp[5] = tempr / 10;
			semg_temp[6] = tempr % 10;
			semg_temp[7] = 11;
			if(keyvalue == 7)
				state = s0;
		}	break;
		
		default: state = s0;	break;
	}
}


char keyscan()
{
	uchar keybefore, keycode, trg;
	static char keyvalue = -1;
	keycode = (P3 ^ 0xff)  & 0x0f;
	trg = keycode & (keycode ^ keybefore);
	keybefore = keycode;
	if(trg == 0x01)			keyvalue = 7;
	else if(trg == 0x02)	keyvalue = 6;
	else if(trg == 0x04)	keyvalue = 5;
	else if(trg == 0x08)	keyvalue = 4;
	else  					keyvalue = -1;
	return keyvalue;
}


void Delay7ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 76;
	j = 74;
	do
	{
		while (--j);
	} while (--i);
}


void allinit()
{
	P2 = 0x80; P0 = 0xff;
	P2 = 0xa0; P0 = 0x00;
	P2 = 0xc0; P0 = 0xff;
	P2 = 0xe0; P0 = 0xff;
}


void main()
{
	char keyvalue, tempr;
	allinit();
	Timer0Init( );
	while(1)
	{
		keyvalue = keyscan();
		tempr = TemperGet();
		menu(keyvalue, tempr);
		Delay7ms();
	}
}

ds18b20.c

#include<stc15f2k60s2.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P1^4;

void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	unsigned char i;
	while(t--)
	{
		for(i=0;i<12;i++);
	}
}

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);
}

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;
}

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;
}

uchar TemperGet()
{
	uchar low,high;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(500);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	
	return (high<<4) | (low>>4);
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值