《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)

这篇具有很好参考价值的文章主要介绍了《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有关题目

《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)
《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)
《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)
《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)
《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)
《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)

实现代码

注意:

代码实现方面
①注意控制温度参数temp_para范围
②DAC输出时,注意写入的数字IIC_SendByte(temp)中temp范围在0~255;
源文件修改方面
①官方给的iic.h中使用的时C51的头文件"reg52.h",我们需要修改为对应的15系列头文件"STC15F2K60S2.h",这样才可以使用其中的一些特殊位寄存器
②注意修改驱动代码时要留意一下onewire.h中单总线延时函数,是STC89C52RC,还是15系列的,15系列的单片机速度比51快8~12倍,需要修改对应的延时函数。如下
//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{
char i;
while(t–)
for (i = 0; i < 12; i++);
}文章来源地址https://www.toymoban.com/news/detail-402262.html

①main.c

#include "STC15F2K60S2.h"
#include "onewire.h"  									
#include "iic.h"  									

#define uchar unsigned char
#define uint unsigned int

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;

uchar jm = 0;
code uchar tab[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xc6, 0x8c, 0x88};
//c p  A 11 12 13

bit flag_mod;
uchar temp_para = 25;//温度参数

float curr_temp, Vdac;//当前温度,DAC输出电压

void sys_init();
float rd_temp();
void dac_pcf8591(uchar da);
void key_handle();
void mod_handle();
void led();

void dsp_smg_bit(uchar pos, val, dot);//dot = 1,添加小数点
void display();//显示功能,分三个大块
void dsp_temp();
void dsp_para();
void dsp_dac();
void Delay1ms()	;	//1ms@12.000MHz,延时1ms用于给足数码管足够显示时间
void delay_k(uchar t);//延时t * 10us

void main()
{
	sys_init();
	while(1)
	{
		curr_temp = rd_temp();
		key_handle();
		mod_handle();
		display();
		dac_pcf8591((uchar)(Vdac * 51));
		led();
	}
}
void mod_handle()
{
	if (!flag_mod)
	{
		if (curr_temp < temp_para)
			Vdac = 0.0;
		else 
			Vdac = 5.0;
	}
	else 
	{
		if (curr_temp <= 20)
			Vdac = 1.0;
		else if (curr_temp >= 40)
			Vdac = 4.0;
		else 
			Vdac = 0.15 * curr_temp - 2;
	}
}
void led()
{
	if (!flag_mod)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L1 = 0;
	}
	
	if (0 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L2 = 0;
	}
	else if (1 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L3 = 0;
	}
	else if (2 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L4 = 0;
	}
	
}
void key_handle()
{
	P44 = P42 = P33 = 1;
	P32 = 0;
	if (!P44)//s5 模式切换
	{
		delay_k(15);
		if (!P44)
		{
			flag_mod = !flag_mod;
			while(!P44)
				display();
		}
	
	}
	if (!P42)//s9 +
	{
		delay_k(15);
		if (!P42)
		{
			if (1 == jm)
			{
				if (++temp_para > 99)
					temp_para = 99;
				
			}
			
			while(!P42)
				display();
		}
	
	}
	
	P44 = P42 = P32 = 1;
	P33 = 0;
	if (!P44)//s4 界面调整
	{
		delay_k(15);
		if (!P44)
		{
			if (++jm >= 3)
				jm = 0;
			
			while(!P44)
				display();
		}
	
	}
	if (!P42)//s8 -
	{
		delay_k(15);
		if (!P42)
		{
			if (1 == jm)
			{
				if (--temp_para < 10)
					temp_para = 10;
			}
			
			while(!P42)
				display();
		}
	}
}

void dsp_dac()
{	
	uint x = (uint)(Vdac * 100);
	dsp_smg_bit(1, 13, 0);
	
	dsp_smg_bit(6, x / 100 % 10, 1);
	dsp_smg_bit(7, x / 10 % 10, 0);
	dsp_smg_bit(8, x % 10, 0);
}


void dsp_para()
{
	dsp_smg_bit(1, 12, 0);
	dsp_smg_bit(7, temp_para / 10 % 10, 0);
	dsp_smg_bit(8, temp_para % 10, 0);
}

void dsp_temp()
{
	uint x = (uint)(curr_temp * 100);
	if (x != 8500)
	{
		dsp_smg_bit(1, 11, 0);	
		dsp_smg_bit(5, x / 1000 % 10, 0);
		dsp_smg_bit(6, x / 100 % 10, 1);
		dsp_smg_bit(7, x / 10 % 10, 0);
		dsp_smg_bit(8, x % 10, 0);
	}
}

void display()
{
	if (0 == jm)
		dsp_temp();
	else if (1 == jm)
		dsp_para();
	else if (2 == jm)
		dsp_dac();			
}
void dsp_smg_bit (uchar pos, val, dot)
{
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1 << (pos - 1);
	
	P2 = (P2 & 0x1f) | 0xe0;
	if (!dot)
		P0 = tab[val];
	else 
		P0 = tab[val] & 0x7f;
	
	Delay1ms();
	P0 = 0xff;
	P2 &= 0x1f;
}
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
void delay_k(uchar t)
{
	while(t--)
		display();
}
void dac_pcf8591(uchar da)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	
	IIC_SendByte(0x40);
	IIC_WaitAck();
	
	IIC_SendByte(da);
	IIC_WaitAck();
	IIC_Stop();
}
float rd_temp()
{
	uchar l, h;
	uint temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();//
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	l = Read_DS18B20();
	h = Read_DS18B20();
	
	temp = (h & 0x0f);
	temp <<= 8;
	temp |= l;
	
	return (float)(temp * 0.0625);
}	

void sys_init()
{
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0xaf;
	
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 &= 0x1f;
}

②main.c

#include "STC15F2K60S2.h"
#include "iic.h"
#include "onewire.h"

#define uchar unsigned char
#define uint unsigned int

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;

uchar jm = 0;//界面初始化温度界面
code uchar tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff, 0xc6, 0x8c, 0x88}; 
//C P A 11 12 13

bit mod_flag;//0为模式1,1为模式2;

char temp_para = 25;//温度参数
float curr_temp, Vdac;//当前温度,DAC输出电压

void sys_init();
float rd_temperature();
void key_handle();
void dac_pcf8591(uchar da);
void led();

void dsp_smg_bit(uchar pos, val, sta);//sta = 1,添加小数点
void display();//显示功能,分三个大块
void dsp_temp();
void dsp_para();
void dsp_dac();
void delay_k(uchar t);//延时t * 10us
void Delay1ms();		//1ms@12.000MHz,延时1ms用于给足数码管足够显示时间

void main()
{
	sys_init();
	while(1)
	{
		curr_temp = rd_temperature();
		key_handle();
		display();
		led();
	}
}
void led()
{
	if (!mod_flag)
	{	
		P2 = (P2 & 0x1f) | 0x80;
		L1 = 0;
	}
	
	if (0 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L2 = 0;
	}
	else if (1 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L3 = 0;
	}
	else if (2 == jm)
	{
		P2 = (P2 & 0x1f) | 0x80;
		L4 = 0;
	}	
}

void key_handle()
{
	P44 = P42 = P33 = 1;
	P32 = 0;
	if (!P44)//s5--模式切换
	{
		delay_k(15);
		if (!P44)
		{
			while(!P44)
				display();
			mod_flag = !mod_flag;
			if (!mod_flag)
			{
				if (curr_temp * 10 < temp_para * 10)
				{
					Vdac = 0.0;
				}
				else 
					Vdac = 5.0;
			}
			else 
			{
				if (curr_temp * 10 < 200)
					Vdac = 1.0;
				else if (curr_temp * 10 > 400)
					Vdac = 4.0;
				else 
				{
					Vdac = 0.15 * curr_temp - 2;
				}
			}
			dac_pcf8591((uchar)(Vdac * 51));//注意写入pcf8591时范围
		}
	}
	
	if (!P42)//s9 +
	{
		delay_k(15);
		if (!P42)
		{
			while(!P42)
				display();
			if (1 == jm)
			{
				if (++temp_para > 99)
					temp_para = 99;
			}
		}
	}
	
	P44 = P42 = P32 = 1;
	P33 = 0;
	if (!P44)//s4 jm
	{
		delay_k(15);
		if (!P44)
		{
			while(!P44)
				display();
			if (++jm >= 3)
				jm = 0;
		}
	}
	
	if (!P42)//s8 -
	{
		delay_k(15);
		if (!P42)
		{
			while(!P42)
				display();
				
			if (1 == jm)
			{
				if (--temp_para < 0)
					temp_para = 0; 
			}
		}
	}
}
void display()
{
	if (0 == jm)
		dsp_temp();
	else if (1 == jm)
		dsp_para();	
	else if (2 == jm)
		dsp_dac();
}

void dsp_dac()
{
	uint x = (uint) (Vdac * 100);
	dsp_smg_bit(1, 13, 0);
	
	dsp_smg_bit(6, x / 100 % 10, 1);
	dsp_smg_bit(7, x / 10 % 10, 0);
	dsp_smg_bit(8, x % 10, 0);

}
void dsp_para()
{
	dsp_smg_bit(1, 12, 0);
	
	dsp_smg_bit(7, temp_para / 10 % 10, 0);
	dsp_smg_bit(8, temp_para % 10, 0);
}
void dsp_temp()
{
	uint x = (uint) (curr_temp * 100);//当前温度扩大100倍
	dsp_smg_bit(1, 11, 0);
	
	dsp_smg_bit(5, x / 1000 % 10, 0);
	dsp_smg_bit(6, x / 100 % 10, 1);
	dsp_smg_bit(7, x / 10 % 10, 0);
	dsp_smg_bit(8, x % 10, 0);
}

void dsp_smg_bit(uchar pos, val, sta)
{
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1 << (pos - 1);
	
	P2 = (P2 & 0x1f) | 0xe0;
	if (sta)
		P0 = tab[val] & 0x7f;
	else 
		P0 = tab[val];
	
	Delay1ms();
	
	P0 = 0xff;
	P2 &= 0x1f;
}
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
void delay_k(uchar t)
{
	while(t--)
		display();
}
void dac_pcf8591(uchar da)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();

	IIC_SendByte(0x40);  //DAC输出模式,允许 DAC, ADC 通道 0
	IIC_WaitAck();

	IIC_SendByte(da);
	IIC_WaitAck();
	IIC_Stop();
}
float rd_temperature()
{
	uchar l, h;
	uint t;
	float temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	l = Read_DS18B20();
	h = Read_DS18B20();
	
	t = (h & 0x0f);
	t <<= 8;
	t |= l;
	temp = t * 0.0625;
	
	return temp;
}

void sys_init()
{
	//关蜂鸣器,继电器
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0xaf;
	
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 &= 0x1f;
}

iic.h

#ifndef _IIC_H
#define _IIC_H

#include "STC15F2K60S2.h"
#include "intrins.h"

sbit SDA = P2^1;
sbit SCL = P2^0;

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
//void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
//unsigned char IIC_RecByte(void); 


#endif

iic.c

#include "iic.h"

#define DELAY_TIME 5

//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//I2C总线启动信号
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//I2C总线停止信号
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//void IIC_SendAck(bit ackbit)
//{
//    SCL = 0;
//    SDA = ackbit;  					
//    IIC_Delay(DELAY_TIME);
//    SCL = 1;
//    IIC_Delay(DELAY_TIME);
//    SCL = 0; 
//    SDA = 1;
//    IIC_Delay(DELAY_TIME);
//}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//I2C总线接收一个字节数据
//unsigned char IIC_RecByte(void)
//{
//    unsigned char i, da;
//    for(i=0; i<8; i++)
//    {   
//    	SCL = 1;
//	IIC_Delay(DELAY_TIME);
//	da <<= 1;
//	if(SDA) da |= 1;
//	SCL = 0;
//	IIC_Delay(DELAY_TIME);
//    }
//    return da;    
//}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include "STC15F2K60S2.h"

sbit DQ = P1^4;  

//unsigned char rd_temperature(void);  
void Delay_OneWire(unsigned int t);
bit init_ds18b20(void);
unsigned char Read_DS18B20(void);
void Write_DS18B20(unsigned char dat);

#endif

onewire.c

#include "onewire.h"

//单总线内部延时函数
void Delay_OneWire(unsigned int t)  
{	
	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;
}

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

到了这里,关于《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯十四届单片机省赛

    【失败的博主】蓝桥杯最后一文 感想 : 练完省赛题就去练国赛题!!! 1.B站小蜜蜂老师(基础模块 )(容易听懂) 2.做一套省赛题、你会发 现无法把模块结合起来。 3.学整体代码的思想(关键!!!) 来源:电子设计工坊、四梯科技、官方源代码、其他人做的题; 4.形成自

    2023年04月10日
    浏览(39)
  • 蓝桥杯单片机学习14——第十三届省赛题

    上期我们学习了NE555方波发生器频率测量,讲到我会更新之后省赛的题目,那么,他来了。 首先声明:我还没有参加蓝桥杯单片机比赛,也没有拿过奖,所以我写的代码注定不会那么完美,存在BUG是必然的,我写这个系列的目的纯粹是为了记录我的学习………… 关于功能描述

    2024年02月06日
    浏览(33)
  • 蓝桥杯单片机学习15——第十二届省赛题

    书接上文,上期我们基本完成了十三届省赛题,但还是存在一些问题,本期我将对上期存在的一些问题,提出一些解决方案,并加以实践验证可行性,废话少说,让我们往下看。 上期我们提到,数码管和LED在使用的时候会存在外设之间相互干扰的问题,在我们不断的探索之下

    2024年01月25日
    浏览(36)
  • 【蓝桥杯单片机】第十二届省赛(含题目和解答代码)

    main.c  iic.c iic.h onewire.c onewire.h      

    2024年02月04日
    浏览(40)
  • 蓝桥杯单片机14届记录 + 6-13届省赛代码+试题

    客观题 01. 一个 8 位的 DAC 转换器,供电电压为 3.3V,参考电压 2.4V,其 1LSB 产生的输出电 压增量是( )V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094  02. IAP15F2K61S2 单片机支持通过哪些接口进行在线调试( )。 A. SPI B. UART C. I2C D. JTAG  03. 下列电路中属于时序逻辑电路的是( )。 A. 计数

    2024年02月06日
    浏览(30)
  • 蓝桥杯单片机第十四届省赛题目和程序答案

    目录  1、前言  2、题目 3、程序架构     3.1 display.c    3.2 ds1302.c    3.3 iic.c    3.4 onewire.c    3.5 main.c 主函数文件    3.6 环境配置 4. 历年蓝桥杯单片机试题和答案        抽空复习了一下,拿下单片机省赛一等奖,在此分享一下最新的14届省赛程序设计答案          模

    2024年02月06日
    浏览(50)
  • 蓝桥杯单片机第14届省赛客观题目+程序题目+程序题参考答案

    目录 客观题题目 程序题题目 程序题参考答案 main.h main.c Init.h Init.c SMG.h SMG.c DSQ.h DSQ.c YanShi.h YanShi.c JZKey.h JZKey.c ds1302.h ds1302.c iic.h iic.c onewire.h onewire.c LN555.h LN555.c             首先吐槽一下,花300元体验国赛的难度,是真的崩溃。          3个小时写完,2个小时改bug!

    2024年02月11日
    浏览(37)
  • 2023年第十四届蓝桥杯单片机开放与设计省赛微析与经验分享

    前言:        2023年4月8日, 就在昨天,本人刚参与了第十四届蓝桥杯单片机开放与设计省赛。         整体做下来,且不谈客观题,今年的程序题,个人感觉有点像大杂烩,题量大,细节多,而且有些要求定义不够清晰,所以本人这次做的不够完美,并且因为时间问题有

    2024年02月08日
    浏览(35)
  • 第十三届蓝桥杯嵌入式省赛第二场真题(基于HAL库的巨简代码+超级详解)

    相关说明: 开发板:CT117E-M4(STM32G431RBT6) 开发环境: CubeMX+Keil5 涉及题目:第十三届蓝桥杯嵌入式省赛第二场真题 CubeMX配置、主要函数代码及说明: 1.使能外部高速时钟: 2.配置时钟树: 3.GPIO: 4.TIM2(通道2 PA1输出脉冲信号): 5.UART: 6.NVIC优先级配置    博主参加的是第一场

    2023年04月09日
    浏览(38)
  • 蓝桥杯单片机客观题之数电学习(深夜学习——单片机)

    1、数字:\\\'0\\\'——0x30 2、字母:\\\'a\\\'——0x61;\\\'A\\\'——0x41 1、首位不变 2、从左到右,加上每一对相邻的二进制编码位,从而得到下一个格雷码位,舍去进位  1、首位不变 2、新生成的二进制码加上下一位格雷码得到下一位二进制码 1、小数部分的转换方法应该是先得到的是高位,后

    2023年04月09日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包