蓝桥杯单片机11届省赛程序题

历时半个多月,在家苦练这么久,终于把11届省赛程序题做出来了,不枉我这十几天寒假过的那么枯燥无味。

sys.c

#ifndef _SYS_H_
#define _SYS_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;

#define uchar unsigned char
#define uint unsigned int

extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;

//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();

//key.c
void KeyScan();


#endif

nixie.c

#include <sys.h>
#include <onewire.h>
#include <iic.h>

//uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90,
//											0X40, 0X79, 0X24, 0X30, 0X19, 0X12, 0X02, 0X78, 0X00, 0X10, 0XBF, 0XFF};
0-9 0.-9. - 熄灭
uchar code Nixie[] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0XC6, 0X8C};		

uchar T_Max = 30,T_Min = 20,T_Max_p = 30,T_Min_p = 20;
//uchar InterFace = 0;
uint temp;
											
void DisplayAlone(uchar pos,value)
{
	Select_74H138(7);
	P0 = 0XFF;
	Select_74H138(6);
	P0 = _crol_(0X01,pos);
	Select_74H138(7);
	P0 = Nixie[value];
	Delay(1);
	Select_74H138(0);
}

void Display_Temp()
{
//	temp = Temper_Get();
	DisplayAlone(0,10);
	DisplayAlone(6,temp / 10);
	DisplayAlone(7,temp % 10);
	Select_74H138(7);
	P0 = 0XFF;
}

void Display_P()
{
	DisplayAlone(0,11);
	DisplayAlone(3,T_Max / 10);
	DisplayAlone(4,T_Max % 10);
	DisplayAlone(6,T_Min / 10);
	DisplayAlone(7,T_Min % 10);
	Select_74H138(7);
	P0 = 0XFF;
}

void DisplaySMG()
{
	temp = Temper_Get();
	switch(InterFace)
	{
		case 0: Display_Temp(); break;
		case 1: Display_P(); break;
	}
}

void Work_DAC()
{		 
//	if(T_Max > T_Min)
//	{
		if(temp > T_Max)
		{
			stat_led = (stat_led | 0xf7) & 0xfe;
			Work_Led(stat_led);
			DAC_Out(204);
		}
	  if(temp < T_Max && temp > T_Min)
		{
			stat_led = (stat_led | 0xf7) & 0xfd;
			Work_Led(stat_led);
			DAC_Out(153);
		}
		if(temp < T_Min)
		{
			stat_led = (stat_led | 0xf7) & 0xfb;
			Work_Led(stat_led);
			DAC_Out(102);
		}
//	}
	
}

key.c

#include <sys.h>

uchar InterFace = 0;
bit stat_s5 = 0;

void KeyScan()
{
	if(s4 == 0)
	{
		Delay(5);
		InterFace = (InterFace + 1) % 2;
		if(InterFace)
		{
			T_Max_p = T_Max;
			T_Min_p = T_Min;
		}		
		else
		{
			stat_s5 = 0;
			if(T_Max <= T_Min)
			{
//				stat_led = 0xf7;
				T_Max = T_Max_p;
				T_Min = T_Min_p;
				stat_led = 0xff;
			}		
//			else
//			{
//				stat_led = 0xff;
//			}				
		}
		while(s4 == 0)
			DisplaySMG();
	}
	if(s5 == 0)
	{
		Delay(5);
		if(InterFace)
		{
			stat_s5 = ~stat_s5;
		}
		while(s5 == 0)
			DisplaySMG();
	}
	if(s6 == 0)
	{
		Delay(5);
		if(stat_s5)
		{
			if(T_Max < 100)
			T_Max++;
		}		
		else
		{
			if(T_Min < 100)
			T_Min++;
		}
		while(s6 == 0)
			DisplaySMG();
		if(T_Max <= T_Min)
		{
			stat_led = 0xf7;
		}
		else
		{
			stat_led = 0xff;
		}	
	}
	if(s7 == 0)
	{
		Delay(5);
		if(stat_s5)
		{
			if(T_Max >= 0)
				T_Max--;
		}
		else
		{
			if(T_Min >= 0)
				T_Min--;
		}
		while(s7 == 0)
			DisplaySMG();
		if(T_Max <= T_Min)
		{
			stat_led = 0xf7;
		}
		else
		{
			stat_led = 0xff;
		}	
	}
}

ds18b20.c

#include <onewire.h>

void Delay_us(uint us)//延时1us
{
	do{
		_nop_();
		_nop_();
		_nop_();
	}while(us--);
}

bit DS18B20_Init()
{
	bit i;
	DQ = 0;//读写之前都要将该引脚拉低
	Delay_us(500);
	DQ = 1;//释放总线
	Delay_us(50);
	i = DQ;//读取DQ的值
	Delay_us(100);
	DQ = 1;
	return i;
}

void Write_DS18B20(uchar dat)
{
	uchar i; 
	for(i = 0; i < 8; i++)
	{
		DQ = 0;
		Delay_us(2);
		DQ = dat & 0x01;//从最低位开始传送
		Delay_us(100);
		DQ = 1;//释放总线,准备下一次数据的写入
		dat >>= 1;
	}
}

uchar Read_DS18B20()
{
	uchar i,j,dat;
	for(i = 0; i < 8; i++)
	{
		DQ = 0;
		Delay_us(1);
		DQ =1;
		j = DQ;
		Delay_us(100);
		DQ = 1;//释放总线,准备下一次数据的写入
		dat = (j <<7) | (dat >> 1);
	}
	return dat;
}

uint Temper_Get()
{
	uchar MSB,LSB;
	uint temp;
	DS18B20_Init();
	Write_DS18B20(0XCC);
	Write_DS18B20(0X44);
	Delay_us(500);
	DS18B20_Init();
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	DS18B20_Init();
	temp = MSB & 0X0F;
	temp <<= 8;
	temp |= LSB;
	temp = temp * 0.0625;
	return temp;
}

pcf8591.c

#include <iic.h>
#include <onewire.h>
#include <sys.h>

void DAC_Out(uchar dat)
{
	IIC_Start();
	IIC_SendByte(0X90);//写数据
	IIC_WaitAck();
	IIC_SendByte(0X40);//允许D/A输出
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

iic.c

#include <iic.h>

void somenop()
{
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();
}	

void IIC_Start()
{
	SDA = 1;
	SCL = 1;
	somenop();
	SDA = 0;
	somenop();
	SCL = 0;
}

void IIC_Stop()
{
	SDA = 0;
	SCL = 1;
	somenop();
	SDA = 1;
}

void IIC_Ack(bit i)//应答位控制(主机发送应答)
{
	if(i)
		SDA = 0;
	else
		SDA = 1;
	somenop();
	SCL = 1;
	somenop();
	SCL = 0;
	SDA = 1;
	somenop();
}

bit IIC_WaitAck()//等待应答(读从机应答)
{
	SDA = 1;
	somenop();
	SCL = 1;
	somenop();
	if(SDA)
	{
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else
	{
		SCL = 0;
		return 1;
	}
}

void IIC_SendByte(uchar dat)//通过IIC总线发送数据
{
	uchar i;
	for(i = 0; i < 8; i++)
	{
		if(dat & 0x80)
			SDA = 1;
		else
			SDA = 0;
		somenop();
		SCL = 1;
		dat <<= 1;
		somenop();
		SCL = 0;
	}
}

uchar IIC_RecByte()//从IIC总线上接收数据
{
	uchar i,dat;
	for(i = 0; i < 8; i++)
	{
		SCL = 1;
		somenop();
		dat <<= 1;
		if(SDA)
			dat |= 0x01;
		SCL = 0;
		somenop();
	}
	return dat;
}

main.c

#include <sys.h>
#include <onewire.h>
#include <iic.h>

//void Timer0Init();
uchar stat_led = 0xff;

void main()
{
	Init_System();
//	Timer0Init();
	while(1)
	{
		KeyScan();
		DisplaySMG();
		Work_DAC();
		DisplaySMG();
	}
}

sys.h

#ifndef _SYS_H_
#define _SYS_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;

#define uchar unsigned char
#define uint unsigned int

extern unsigned char T_Max,T_Min,T_Max_p,T_Min_p;
extern unsigned char InterFace;
extern unsigned char stat_led;

//sys.c
void Delay(unsigned int ms);
void Select_74H138(unsigned char channel);
void Init_System();
//void Timer0Init();
void Work_Led(unsigned char dat);
//nixie.c
void DisplayAlone(unsigned char pos,value);
void Display_Temp();
void Display_P();
void DisplaySMG();
void Work_DAC();

//key.c
void KeyScan();


#endif

iic.h

#ifndef _IIC_H_
#define _IIC_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

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

#define uchar unsigned char
	
//iic.c
void somenop();
void IIC_Start();
void IIC_Stop();
void IIC_Ack(bit i);
bit IIC_WaitAck();
void IIC_SendByte(unsigned char dat);
unsigned char IIC_RecByte();

at24c02.c
//void Write_AT24C02(unsigned char addr,dat);
//unsigned char Read_AT24C02(unsigned char addr);
//pcf8591.c
void DAC_Out(unsigned char dat);
//void Work_DAC();

#endif

onewire.h

#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_

#include <STC15F2K60S2.H>
#include <intrins.h>

sbit DQ = P1^4;

#define uchar unsigned char
#define uint unsigned int
//#define ulong unsigned long
	
//ds18b20.c
void Delay_us(unsigned int us);
bit DS18B20_Init();
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20();
unsigned int Temper_Get();


#endif

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 蓝桥杯单片机第九省赛的hex文件是一种十六进制文件格式,用于将程序代码转换成可供单片机读取的机器码。这个hex文件是由编译器生成的,其中包含了程序的指令、数据和地址信息。 hex文件可以在单片机上烧写,将程序加载到单片机内存中运行。通过烧写hex文件,可以将代码部署到硬件设备上,完成各种功能和任务。 对于蓝桥杯单片机比赛的参赛选手来说,拿到hex文件后需要将其烧写到指定的单片机上。具体的步骤是:将单片机与计算机通过编程器连接,打开编程软件,选择hex文件并将其下载到单片机中。下载完成后,可以进行功能测试和调试。如果hex文件没有问单片机将按照程序设计的逻辑正常运行。 蓝桥杯单片机比赛的hex文件通常包含了多个功能和子程序,选手需要根据竞赛规定的目要求进行相应的改动和优化。参赛选手可以对hex文件进行反汇编,分析其中的机器码,理解程序的运行原理和逻辑。通过对hex文件的修改和调试,选手可以实现各种功能和算法,完成比赛的要求。 总结来说,蓝桥杯单片机第九省赛的hex文件是参赛选手完成竞赛过程中重要的载体,通过烧写hex文件到单片机上,选手可以完成编程任务,展示自己的技能和创造力。 ### 回答2: 蓝桥杯单片机第九省赛的hex文件是一种用于嵌入式系统的程序文件格式。它包含了由汇编或C语言编写的单片机代码,经过编译和链接之后生成的可执行文件。 hex文件以文本的形式呈现,每一行都包含了十六进制的地址和对应的机器码。这些机器码是单片机执行的指令,用于实现特定的功能。 在单片机比赛中,参赛选手需要下载并烧录hex文件到单片机上,以便将程序加载到内存中,使得单片机能够按照代码的要求进行运算和控制。 通过阅读hex文件,我们可以了解程序的整体结构、函数的调用关系以及数据的存储方式。这有助于我们分析代码的逻辑和调试可能出现的错误。 蓝桥杯单片机第九省赛的hex文件是经过编译的参赛选手提交的作品。为了保证公平性和保密性,比赛组委会在竞赛开始前会提供一个统一的下载接口,选手需要将自己的hex文件上传至该接口,由组委会进行验证和烧录。 总而言之,hex文件是蓝桥杯单片机竞赛中非常重要的一部分,它承载着选手的智慧和努力。通过对hex文件的研究和分析,我们能够更好地理解和掌握单片机编程的技术,提高自己的竞赛水平。 ### 回答3: 蓝桥杯是一个面向高中生和大学生的计算机竞赛,单片机是其中的一个竞赛类别。而第九省赛中提到的hex文件是单片机程序在编译后生成的二进制文件,该文件存储了程序的机器指令。 hex文件通常以文本格式保存,每一行包含16个字符,其中包括8个十六进制数字、一个标识符和16进制校验和。这些数字表示了相应地址的机器指令或数据。 在蓝桥杯单片机竞赛中,参赛选手需要根据目要求编写相应的单片机程序,并将其编译生成hex文件。这个文件需要在比赛中使用,以将程序烧录到实际的单片机芯片中,从而使其运行。 hex文件的生成通常由编译器自动完成,选手只需将生成的文件保存并在比赛中使用。烧录hex文件到单片机芯片可以使用专门的烧录工具或者调试器进行。 比赛官方会提供相应的参赛规则和操作说明,选手需要按照要求正确操作,将hex文件烧录到单片机中,并保证程序的正常运行。 因此,蓝桥杯单片机第九省赛中提到的hex文件是指参赛选手需要编写的单片机程序经过编译后生成的二进制文件。选手需要正确生成和使用这个文件,使得程序能够在实际的单片机上正确运行,以完成竞赛任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu小燕呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值