4T第十五届蓝桥杯单片机模拟考试Ⅱ

本文介绍了使用DS18B20温度传感器、PCF8591AD/DA芯片、LED指示灯以及I2C通信技术开发的一款系统,它能实时测量温度、光照,并根据模式转换显示温度、光照数据或DAC输出,通过按键进行界面切换和模式选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "reg52.h"
#include "onewire.h"
#include "iic.h"
sfr P4   = 0xC0;
sbit C1  = P4^4;
sbit R3  = P3^2;
sbit R4  = P3^3;

float temp=0;//记录温度数据
unsigned int temp_smg=0;//数码管显示温度值
unsigned int Lux=0;//记录光照数据
unsigned int Dac_Smg=0;//记录DAC数据
float Dac=0; //记录DAC数据
unsigned char stat=1; //记录状态模式1模式2
unsigned char stat2=1; //记录界面1界面2
unsigned char led=0;//显示灯
code unsigned char Seg_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};
code unsigned char Seg_Table_1[] = 
{
0x40, //0
0x79, //1
0x24, //2
0x30, //3
0x19, //4
0x12, //5
0x02, //6
0x78, //7
0x00, //8
0x10, //9
0x08, //A
0x03, //b
0x46, //C
0x21, //d
0x06, //E
0x0e //F
};


void Delay_Smg(unsigned int t)
{
	while(t--);
}

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void Delay(unsigned char t)
{
	unsigned char i;
	for(i=0;i<t;i++)
	{
		Delay1ms();
	}
}

void Select_Hc573(unsigned char channel,unsigned char value)
{
	 P0=value;
	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;
		case 0:
			P2 = ( P2 & 0x1f) | 0x00;
		break;
	}
	P2 = ( P2 & 0x1f) | 0x00;
}

void ShowSMG_Bit(unsigned char pos,unsigned char value)
{
	Select_Hc573(6,0x01<<pos);
	Select_Hc573(7,value);
	Delay_Smg(500);
	Select_Hc573(6,0x01<<pos);
	Select_Hc573(7,0xff);
}

void ShowSMG_All(unsigned char value)
{
	Select_Hc573(6,0xff);
	Select_Hc573(7,value);
}



//1)通过获取DS18B20温度传感器的温度数据,完成温度测量功能;
void Begain_DS18B20()
{
	unsigned char i;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	for(i=0;i<8;i++)
	{
		Delay_Smg(60000);
	}
}
void Read_DS18B20_temp()
{
	unsigned int dat=0;
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_Smg(1000);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB= Read_DS18B20();
	MSB= Read_DS18B20();
	dat=MSB;
	dat=(dat<<8)|LSB;
	if((dat&0xf800)==0x0000)
	{
		temp=dat*0.0625;
	}
	temp_smg=temp*10;
}




//2)通过PCF8591 AD/DA芯片完成环境光测量和DAC输出功能;
//读取光照数据
void Read_Lux()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x01);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	Lux=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
}
//输出DAC
void Print_Dac()
{
	unsigned char dat;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x40);
	I2CWaitAck();
	dat=Dac*51;
	I2CSendByte(dat);
	I2CSendAck(1);
	I2CStop();
}
//3)通过LED指示灯完成试题要求的状态指示功能;
//模式
void Stat_tran()
{
	if(stat==1)//模式1
	{
		led=~0x01;
		Select_Hc573(4,led);
		if(temp<10)
		{
			Dac=1;
		}
		else if(temp>40)
		{
			Dac=5;
		}
		else
		{
			Dac=2.0*temp/15-5.0/15;
		}
	}
	else if(stat==2)//模式2
	{
		led=~0x02;
		Select_Hc573(4,led);
		if(Lux<10)
		{
			Dac=1;
		}
		else if(Lux>240)
		{
			Dac=5;
		}
		else
		{
			Dac=4.0*Lux/230+190.0/230;
		}
	}
	Dac_Smg=Dac*10;
}




//4)通过数码管、按键完成试题要求的数据显示和界面切换功能
//温度显示界面
void ShowSMG_Temp()
{
	ShowSMG_Bit(0,Seg_Table[1]);
	ShowSMG_Bit(1,0xff);
	ShowSMG_Bit(2,0xff);
	ShowSMG_Bit(3,0xff);
	ShowSMG_Bit(4,0xff);
	ShowSMG_Bit(5,Seg_Table[temp_smg/100]);
	ShowSMG_Bit(6,Seg_Table_1[temp_smg/10%10]);
	ShowSMG_Bit(7,Seg_Table[temp_smg%10]);
}
//光照界面
void ShowSMG_Lux()
{
	ShowSMG_Bit(0,Seg_Table[2]);
	ShowSMG_Bit(1,0xff);
	ShowSMG_Bit(2,0xff);
	ShowSMG_Bit(3,0xff);
	ShowSMG_Bit(4,0xff);
	if(Lux>99)
	{
		ShowSMG_Bit(5,Seg_Table[Lux/100]);
	}
	else
	{
	ShowSMG_Bit(5,0xff);
	}
	ShowSMG_Bit(6,Seg_Table[Lux/10%10]);
	ShowSMG_Bit(7,Seg_Table[Lux%10]);
}
//输出界面
void ShowSMG_Dac()
{
	Dac_Smg=Dac*10;
	ShowSMG_Bit(0,0xc1);
	ShowSMG_Bit(1,0xff);
	ShowSMG_Bit(2,0xff);
	ShowSMG_Bit(3,0xff);
	ShowSMG_Bit(4,0xff);
	ShowSMG_Bit(5,0xff);
	ShowSMG_Bit(6,Seg_Table_1[Dac_Smg/10]);
	ShowSMG_Bit(7,Seg_Table[Dac_Smg%10]);
}
//显示
void ShowSMG()
{
	if(stat==1&&stat2==1)
	{
		ShowSMG_Temp();
	}
	else if(stat==2&&stat2==1)
	{
		ShowSMG_Lux();
	}
	else
	{
		ShowSMG_Dac();
	}
	
}
//按键
void Scan_Key()
{
	R3=0;
	R4=1;
	C1=1;
	if(C1==0);
	{
		Delay(2);
		if(C1==0)    //S5界面1与界面2的转换
		{
			stat2++;
			if(stat2==3)
			{
				stat2=1;
			}
		}
		while(C1==0)
		{
			ShowSMG();
		}
	}
	R3=1;
	R4=0;
	C1=1;
	if(C1==0);
	{
		Delay(2);
		if(C1==0)    //S4模式1与模式2的转换
		{
			stat++;
			if(stat==3)
			{
				stat=1;
			}
		}
		while(C1==0)
		{
			ShowSMG();
		}
	}
}

void Init_sys()
{
	Select_Hc573(0,0x00);
	Select_Hc573(5,0x00);
	Select_Hc573(4,0xff);
	ShowSMG_All(0xff);
	Begain_DS18B20();
}


void main()
{
	Init_sys();
	while(1)
	{
		Read_DS18B20_temp();//不断读取温度
		Read_Lux();//不断读取光照数据
		Stat_tran();//根据模式获取电压值
		Print_Dac();//输出电压
		Scan_Key();//按键
		ShowSMG();//显示界面
	}
}
### 关于蓝桥杯单片机大赛第十五届的相关模拟题与资料 #### 一、官方资源整合 参赛者可以通过官方渠道获取整合后的资源包,其中包含了详细的指导手册以及考点大纲[^1]。这些材料对于理解比赛的核心要求和准备方向至关重要。 #### 二、优质教程推荐 为了更深入地学习单片机技术并针对性备考,可以参考以下两个高质量的教程: - **蚂蚁工厂科技蓝桥杯单片机教程**:该教程覆盖了从基础知识到实际应用的广泛内容。 - **小蜜蜂蓝桥杯单片机基础技能与进阶强化教程**:此教程特别适合希望进一步提升自己能力水平的学生。 #### 三、具体模拟考试实战题目解析 以下是基于第十五届蓝桥杯单片机模拟考试的部分实战题目描述及其功能需求: 1. **超声波传感器测距** 需要实现的距离测量功能主要依赖于超声波传感器来完成数据采集,并将其转换成可读取的数据形式输出给用户[^2]。 2. **PCF8591 模拟信号处理** 使用 PCF8591 进行模数转换操作,满足试题所提出的特定模拟功能设计目标。 3. **LED状态指示灯控制** 利用 LED 来直观展示当前设备运行状况或者某些预设条件下的变化情况,便于调试及监控整个系统的运作流程。 4. **数码管显示与按键交互逻辑构建** 数码管用于呈现数值型信息;而按键则负责提供人机互动方式,比如界面上的不同选项切换或是参数设定等功能均需在此基础上开发完善。 ```c // 示例代码片段:简单的超声波测距函数 void measureDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) * 0.034; } ``` 上述代码展示了如何利用 Arduino 平台上的 `pulseIn` 函数配合硬件电路计算物体之间的直线距离。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值