【蓝桥杯单片机】第十二届省赛(含题目和解答代码)

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

若代码有误,欢迎在评论区批评指正! 

蓝桥杯单片机组第十二届省赛,单片机,蓝桥杯

蓝桥杯单片机组第十二届省赛,单片机,蓝桥杯

蓝桥杯单片机组第十二届省赛,单片机,蓝桥杯

蓝桥杯单片机组第十二届省赛,单片机,蓝桥杯

main.c 

#include <REGX52.H>

#include <onewire.H>
#include <iic.H>
#define uchar unsigned char
#define uint unsigned int
	
sbit K1 = P4^4;
sbit K2 = P4^2;
sbit K3 = P3^3;
sbit K4 = P3^2;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L4 = P0^3;

code uchar Seg_Table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c}; //10A 11b 12c 13d 14e  15f 
code uchar Seg_Table_dot[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e}; //10A 11b 12c 13d 14e  15f 

uchar flag_S4,key_up=1,cs=25,dat,model;
uint temp,dac;

//==================函数声明区=======================================
void hc573(uchar channel);
void Init_system();
void delay_s(uchar t);
void delay_l(uchar xms);
void Nixie(uchar loc,num);
void Nixie_dot(uchar loc,num);
void display();
void LED();
//===================================================================
void hc573(uchar channel)
{
	switch(channel)
	{
		case 4: P2 = (P2 & 0x1f) | 0x80; break; //LED
		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;
	}
}
void delay_s(uchar t)
{
	while(t--);
}
void delay_l(uchar xms)
{
	unsigned char i, j;
	i = 12;
	j = 169;
	for(;xms>0;xms--)
	{
		do
		{
			while (--j);
		} while (--i);
	}
}

uchar Key_Scan()
{
	K1=0;K2=K3=K4=1;
	if(K3==0||K4==0)
	{
		delay_s(100);
		if(K3==0)//S4按下
		{
			flag_S4=(flag_S4+1)%3; 
			while(K3 == 0) 
			{
				temp=Read_Temp();
				LED();
				display();
			}
			return;
		}
		if(K4==0)//S5按下
		{
			model = (model+1)%2;; 
			while(K4 == 0) 
			{
				temp=Read_Temp();
				LED();
				display();
			}
			return;
		}
	}
	K2=0;K1=K3=K4=1;
	if(K3==0||K4==0)
	{
		delay_s(100);
		if(K3==0&&flag_S4==1)//S8按下
		{
			cs--;
			while(K3 == 0) 
			{
				temp=Read_Temp();
				LED();
				display();
			}
			return;
		}
		if(K4==0&&flag_S4==1)//S9按下
		{
			cs++;
			while(K4 == 0) 
			{
				temp=Read_Temp();
				LED();
				display();
			}
			return;
		}
	}
}



void Nixie(uchar loc,num)
{
	hc573(0);
	P0 = 0x01<<(loc-1);
	hc573(6);
	hc573(0);
	P0 = Seg_Table[num];
	hc573(7);
	delay_s(500);
	P0 = 0xff;
	hc573(0);
}
void Nixie_dot(uchar loc,num)
{
	hc573(0);
	P0 = 0x01<<(loc-1);
	hc573(6);
	hc573(0);
	P0 = Seg_Table_dot[num];
	hc573(7);
	delay_s(500);
	P0 = 0xff;
	hc573(0);
}
void Init_system()
{
	hc573(0);
	P0 = 0x00;
	hc573(5);
	hc573(0);
	P0 = 0xff;
	hc573(4);
	hc573(0);
}

void display()
{
	if(flag_S4 == 0)
	{
		Nixie(1,12);
		Nixie(5,temp%10000/1000);
		Nixie_dot(6,(temp%1000)/100);
		Nixie(7,(temp%100/10));
		Nixie(8,temp%10);
	}
	if(flag_S4 == 1)
	{
		Nixie(1,16);
		Nixie(7,cs/10);
		Nixie(8,cs%10);
	}
	if(flag_S4 == 2)
	{
		if(model == 0)
		{
			if(temp%10000/1000*10+(temp%1000)/100> cs)
			{
				dat = 255;
				Nixie_dot(6,5);
				Nixie(7,0);
				Nixie(8,0);
			}
			else 
			{
				dat=0;
				Nixie_dot(6,0);
				Nixie(7,0);
				Nixie(8,0);
			}
			Write_PCF(dat);
			Nixie(1,10);
		}
		
		if(model == 1)
		{
			if(temp%10000/1000*10+(temp%1000)/100<20) dac = 100;
			if((temp%10000/1000*10+(temp%1000)/100>=20)&&(temp%10000/1000*10+(temp%1000)/100<=40)) 
				dac = 0.15*(temp%10000/1000*1000+(temp%1000)/100*100+temp%100/10*10+temp%10) - 200;
			if(temp%10000/1000*10+(temp%1000)/100>40) dac = 400;
			dat = dac * 51;
			Write_PCF(dat);
			Nixie(1,10);
			Nixie_dot(6,dac/100);
			Nixie(7,dac / 10 %10);
			Nixie(8,dac % 10);
		}
	}
}
void LED()
{
	if(flag_S4==0) 
	{
		hc573(0);
		L2 = 0;
		hc573(4);
		hc573(0);
	}
	else 
	{
		hc573(0);
		L2 = 1;
		hc573(4);
		hc573(0);
	}
	if(flag_S4 == 1)
	{
		hc573(0);
		L3 = 0;
		hc573(4);
		hc573(0);
	}
	else 
	{
		hc573(0);
		L3 = 1;
		hc573(4);
		hc573(0);
	}
	if(flag_S4 == 2)
	{
		hc573(0);
		L4 = 0;
		hc573(4);
		hc573(0);
	}
	else 
	{
		hc573(0);
		L4 = 1;
		hc573(4);
		hc573(0);
	}
	if(model == 0)
	{
		hc573(0);
		L1 = 0;
		hc573(4);
		hc573(0);
	}
	else
	{
		hc573(0);
		L1 = 1;
		hc573(4);
		hc573(0);
	}
}

void main()
{
	Init_system();
	temp=Read_Temp();
	delay_l(85);
	while(1)
	{
		temp=Read_Temp();
		display();
		Key_Scan();
		LED();
	}
}

iic.c

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#include <REGX52.H>
#include <intrins.H>

#define DELAY_TIME	5

sbit scl = P2^0;
sbit sda = P2^1;
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

void Write_PCF(unsigned char dat)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x40);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

iic.h

#ifndef __iic_h__
#define __iic_h__

void Write_PCF(unsigned char dat);
#endif 

onewire.c

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

// 

#include <REGX52.H>

sbit DQ = P1^4;
void Delay_OneWire(unsigned int t)  
{
	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;
}

unsigned int Read_Temp()
{
	unsigned int temp;
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	temp=MSB;
	temp = (temp<<8)|LSB;
	temp = temp*0.0625*100;
	return temp;
}

onewire.h

#ifndef __onewire_h__
#define __onewire_h__

unsigned int Read_Temp();

#endif 

 文章来源地址https://www.toymoban.com/news/detail-763193.html

 

 

到了这里,关于【蓝桥杯单片机】第十二届省赛(含题目和解答代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 蓝桥杯单片机 第十二届 国赛

    蓝桥杯第十二届,模块都比较常规,感觉都和省赛差不多,主要是麻烦在数据处理上,而我们处理的数据又要在界面中显示出来。 对比之前的第十届,其实题目差不多,并且少了串口收发这一比较难的模块。但是多了max,min,avg三个超声波数据的处理。所以按道理时间方面应该

    2023年04月08日
    浏览(28)
  • 【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

    🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省赛程序真题 🪔本系列专栏 -  

    2023年04月15日
    浏览(37)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十二届省赛题,考点:模拟电压,串口通信,计时器

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式

    2023年04月09日
    浏览(42)
  • 《蓝桥杯真题》:2021单片机省赛第一场(第十二 / 12届第一场)(另一种代码风格)

    注意: 代码实现方面 : ①注意控制温度参数temp_para范围 ②DAC输出时,注意写入的数字IIC_SendByte(temp)中temp范围在 0~255 ; 源文件修改方面 : ①官方给的iic.h中使用的时C51的头文件\\\"reg52.h\\\",我们需要 修改为 对应的15系列 头文件\\\"STC15F2K60S2.h\\\" ,这样才可以使用其中的一些特殊位寄

    2023年04月08日
    浏览(27)
  • 蓝桥杯单片机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日
    浏览(29)
  • 蓝桥杯单片机第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日
    浏览(35)
  • 4 -【第十二届】蓝桥杯物联网试题 (省赛题)

    1.将时钟树频率设置成32MHz 2.将GPIO引脚做如下配置: 引脚功能 使能ADC功能 使能RTC功能 3.生成工程代码 4.移植OLED、LoRa库文件 5.编写逻辑代码 自定义Task_Main.h Task_Main.c工程文件 Task_Main.h Task_Main.c main.c 引入头文件 板级初始化 主控代码 1.将时钟树频率设置成32MHz 2.将GPIO引脚做如

    2023年04月10日
    浏览(33)
  • 蓝桥杯试题 历届真题 砝码称重【第十二届】【java省赛】

              使用java中的 Set 子接口 ,其特点是元素无序,并且不可重复。         在遍历set集合的同时修改元素会抛出java.util.ConcurrentModificationException并发修改异常  

    2024年02月07日
    浏览(33)
  • 第十四届蓝桥杯单片机省赛真题(巨简代码+超级详解)

    相关说明: 开发板:CT107D——IAP15F2K61S2 开发环境: Keil5 涉及题目:第十四届蓝桥杯单片机省赛真题 数码管忘记不足2位左侧补0;采集的湿度无效时,温湿度、采集次数、采集时间不统计,更不参与计算平均值;温度参数有边界条件;在时间回显子界面长按松开后才能清零,

    2024年02月04日
    浏览(24)
  • 《蓝桥杯真题》:2022单片机省赛第二场_客观题(第十三 / 13届第二场)

    声明:我仅是贴出我认为正确的答案,不是标准答案! 解析:打开ISP看到下面两个文件类型,我就选了 BC 解析:比赛给的《STC15系列单片机用户手册》P301,可以看到是可以位寻址的都能够被8整除,不能够被8整除的无法进行位操作,SCON的地址为98H,P4的地址为C0H,可以位寻址

    2023年04月08日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包