第十一届蓝桥杯单片机组省赛(第二场)源码

第十一届蓝桥杯单片机组省赛(第二场)源码

这个源码是本人在省赛当天复盘时写的,并有幸获得了江苏省一等奖,不过代码比较简单,适合新人作为参考。如果有不足的地方,希望各位在评论区戳我,一起改正,一起学习!
蓝桥杯官方提供试题

#include<stc15f2k60s2.h>
#include<onewire.h>
#include<iic.h>
#define uchar unsigned char
#define uint unsigned int

void Delay(uint t);
void InitSystem();
void SelectHC573(uchar n);
void DisplaySMG(uchar pos, uchar value);
void SMG_off();
void Display_C();
void Display_P();
void Select_Display();
void Read_Temp();
void PCF8591_DAC(uchar dat);
void KeyScan();
void Setting();

sbit S7 = P3^0;         //定义S7
sbit S6 = P3^1;         //定义S6
sbit S5 = P3^2;         //定义S5
sbit S4 = P3^3;         //定义S4

uint Temp = 0x0000;              //当前温度值
uchar Range[2] = {20,30};       //温度上下限
uchar Oldrange[2] = {0,0};     //保存历史设置参数
uchar code SMG_Duamma[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};														      
bit Stat_C = 0;                  //界面切换标志位
bit Stat_P = 0;                  //参数切换标志位
														 
														 
void main()
{
	InitSystem();
	while(1)
	{
		Read_Temp();
		Select_Display();
		KeyScan();
		Setting();
	}
}

//****简单的延时函数****//
void Delay(uint t)
{
	while(t--);
}

//****系统初始化函数****//
void InitSystem()
{
	SelectHC573(4);
	P0 = 0xff;               //关闭所有LED
	SelectHC573(5);
	P0 = 0x00;               //关闭蜂鸣器和继电器
}

//****HC573选通函数****//
void SelectHC573(uchar n)
{
	switch(n)
	{
		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;	
	}
}

//****数码管显示模块****//
void DisplaySMG(uchar pos, uchar value)       //点亮单个数码管
{
	SelectHC573(7);
	P0 = 0x00;                 //消隐
	SelectHC573(6);
	P0 = 0x01 << pos;
	SelectHC573(7);
	P0 = value;
}

void SMG_off()                //关闭所有数码管
{
	SelectHC573(6);
	P0 = 0xff;
	SelectHC573(7);
	P0 = 0xff;
}

void Display_C()             //数据显示界面              
{
	DisplaySMG(0, 0xc6);
	Delay(200);
	
	DisplaySMG(6, SMG_Duamma[Temp / 10]);
	Delay(200);
	DisplaySMG(7, SMG_Duamma[Temp % 10]);
	Delay(200);
	
	SMG_off();
}

void Display_P()             //参数显示界面
{
	DisplaySMG(0, 0x8c);
	Delay(200);
	
	DisplaySMG(3, SMG_Duamma[Range[1] / 10]);
	Delay(200);
	DisplaySMG(4, SMG_Duamma[Range[1] % 10]);
	Delay(200);
	
	DisplaySMG(6, SMG_Duamma[Range[0] / 10]);
	Delay(200);
	DisplaySMG(7, SMG_Duamma[Range[0] % 10]);
	Delay(200);
	
	SMG_off();
}

void Select_Display()
{
	if(Stat_C == 0)
		Display_C();
	else if(Stat_C == 1)
		Display_P();
}

//****温度采集模块****//
void Read_Temp()
{
	uchar LSB,MSB;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	Delay(1000);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	
	Temp = (MSB << 8) | LSB;
	Temp >>= 4;
}

//****DAC模拟电压输出模块****//
void PCF8591_DAC(uchar dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

//****按键模块****//
void KeyScan()
{
	if(S4 == 0)
	{
		Delay(500);
		if(S4 == 0)
		{
			if(Stat_C == 0)
			{
				Oldrange[0] = Range[0];
				Oldrange[1] = Range[1];
				Stat_P = 0;
			}
			else
			{
				if(Range[0] > Range[1])
				{
					Range[0] = Oldrange[0];
					Range[1] = Oldrange[1];
				}
			}
			Stat_C = ~Stat_C;
			while(S4 == 0);
		}
	}
	
	if(S5 == 0)
	{
		Delay(500);
		if(S5 == 0)
		{
			Stat_P = ~Stat_P;
		}
		while(S5 == 0);
	}
	
	if(S6 == 0)
	{
		Delay(500);
		if(S6 == 0)
		{
			if(Stat_C == 1)
			{
				if(Range[Stat_P] < 99)
					Range[Stat_P]++;
			}
		}
		while(S6 == 0);
	}
	
	if(S7 == 0)
	{
		Delay(500);
		if(S7 == 0)
		{
			if(Stat_C == 1)
			{
				if(Range[Stat_P] > 0)
					Range[Stat_P]--;
			}
		}
		while(S7 == 0);
	}
}

//****输出功能和指示灯模块****//
void Setting()
{
	if(Temp > Range[1])
	{
		PCF8591_DAC(204);                //输出电压4.0V
		SelectHC573(4);
		P0 = (P0 & 0xf8) | 0x06;         //点亮L1                
	}
	
	else if(Temp >= Range[0])
	{
		PCF8591_DAC(153);                //输出电压3.0V
		SelectHC573(4);
		P0 = (P0 & 0xf8) | 0x05;         //点亮L2
	}
	
	else
	{
		PCF8591_DAC(102);                //输出电压2.0V
		SelectHC573(4);
		P0 = (P0 & 0xf8) | 0x03;         //点亮L3
	}
	
	if(Range[0] > Range[1])
	{
		SelectHC573(4);
		P0 &= 0xf7;                      //点亮L4
	}
	else
	{
		SelectHC573(4);
		P0 |= 0x08;                      //熄灭L4
	}
}
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值