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

本文档展示了嵌入式系统中的一些关键函数,包括`close_perl`、`Delay2ms`、`seg_tran`等,用于I/O操作如LED显示、按键扫描和延时。同时,`iic.c`文件中的`dac_pcf`和`adc_pcf`函数实现了I2C通信协议,用于与外部设备的数据交换。在`main.c`中,这些功能被整合到一个实时系统中,根据用户输入和传感器数据更新显示和LED状态。

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

other.c

#include <other.h>

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

void Delay2ms(void)
{
	unsigned char i, j;
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}

unsigned char	seg_tran(unsigned int number)
{
	unsigned char date;
	switch(number)
	{
		case	0	:	date = 	0xc0	;	break;
		case	1	:	date = 	0xf9	;	break;
		case	2	:	date = 	0xa4	;	break;
		case	3	:	date = 	0xb0	;	break;
		case	4	:	date = 	0x99	;	break;
		case	5	:	date = 	0x92	;	break;
		case	6	:	date = 	0x82	;	break;
		case	7	:	date = 	0xf8	;	break;
		case	8	:	date = 	0x80	;	break;
		case	9	:	date = 	0x90	;	break;
		case	10	:	date = 	0xbf	;	break;//-
		case	11	:	date = 	0xc6	;	break;//c
		case	12	:	date = 	0x8c	;	break;//p
		case	13	:	date = 	0x86	;	break;//e
		case	14	:	date = 	0xc7	;	break;//L
		case 	15	:	date = 	0xc8	;	break;//a
		case 	16	:	date = 	0x8e	;	break;//F
		case 	17	:	date = 	0xc1	;	break;//U
		case 	18	:	date = 	0xff	;	break;//U
	}
	return date;
}

void seg_disp(unsigned int adr,unsigned int number)
{
	unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
	P0 = seg_adr[adr];
	
	P2 = P2&0x1f|0xc0;
	P2 = P2&0x1f;
	P0 = seg_tran(number);
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
}

void seg_disp_f(unsigned int adr,unsigned int number)
{
	unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
	P0 = seg_adr[adr];
	
	P2 = P2&0x1f|0xc0;
	P2 = P2&0x1f;
	P0 = seg_tran(number)&0x7f;
	
	P2 = P2&0x1f|0xe0;
	P2 = P2&0x1f;
}

int key_scan(void)
{
	int key_mark;
	if(P30 == 0)	key_mark = 7;
	else if(P31 == 0)	key_mark = 6;
	else if(P32 == 0)	key_mark = 5;
	else if(P33 == 0)	key_mark = 4;
	return key_mark;
}

void time_init(void)
{
	TMOD = 0x16;
	
	TL0 = 0xff;
	TH0 = 0xff;
	
	TH1 = (65535 - 50000 + 1)/256;
	TL1 = (65535 - 50000 + 1)%256;

	TF0 = 0;	
	TR0 = 1;	
	ET0 = 1;
	TF1 = 0;	
	TR1 = 1;	
	ET1 = 1;
	
	EA = 1; 
}

other.h

#ifndef __OTHER_H_
#define __OTHER_H_

# include <stc15f2k60s2.h>

void close_perl(void);
void Delay2ms(void);
unsigned char  seg_tran(unsigned int number);
void seg_disp(unsigned int adr,unsigned int number);
void seg_disp_f(unsigned int adr,unsigned int number);
int key_scan(void);
void time_init(void);

#endif

iic.c

void dac_pcf(unsigned char dac)
{
	IIC_Start();
	
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);
	IIC_WaitAck();
	IIC_SendByte(dac);
	IIC_WaitAck();
	
	IIC_Stop();
}

unsigned char adc_pcf(void)
{
	unsigned char adc;
	
	IIC_Start();
	
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);
	IIC_WaitAck();
	
	IIC_Start();
	
	IIC_SendByte(0x91);
	IIC_WaitAck();
	adc = IIC_RecByte();
	IIC_WaitAck();
	
	IIC_Stop();
	
	return adc;
}

iic.h

#ifndef __IIC_H_
#define __IIC_H_

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); 

void dac_pcf(unsigned char dac);
unsigned char adc_pcf(void);

#endif

main.c

#include <other.h>
#include <iic.h>

#define uchar unsigned char 
#define uint unsigned int
#define Led1	0x01
#define Led2	0x02
#define Led3	0x04
#define Led4	0x08
#define Led5	0x10

uchar key_old;
uchar show_mode;
uint frequence;
uint timer0_up;
uint timer1_up;

uchar dac;
uint dac_100;
float dac_f;
	
uchar adc;
uint adc_100;
float adc_f;

bit dac_mode;
bit led_mode;
bit seg_mode;

void seg_pro(void)
{
	uchar key_vol,key_down;
	
	key_vol = key_scan();
	key_down = key_vol&(key_vol^key_old);
	key_old = key_vol;
	
	switch(key_down)
	{
		case 4:
			show_mode++;
			if(show_mode == 2)	show_mode = 0;
		break;
		
		case 5:  
			dac_mode = ~dac_mode;
		break;
		
		case 6:
			led_mode = ~led_mode;
		break;
		
		case 7:
			seg_mode = ~seg_mode;
		break;
	}
}

void key_pro(void)
{ 
	dac_pcf(dac);
	adc = adc_pcf();
	adc_f = (float)adc/255*5.00;
	adc_100 = adc_f*100;
	
	if(seg_mode == 0)
	{
		switch(show_mode)
		{
			case 1:
				seg_disp(0,16); Delay2ms();
				if(frequence > 10000)	seg_disp(3,frequence/10000);	Delay2ms();
				if(frequence > 1000)	seg_disp(4,frequence%10000/1000);	Delay2ms();
				if(frequence > 100)	seg_disp(5,frequence%1000/100);	Delay2ms();
				if(frequence > 10)	seg_disp(6,frequence%100/10);	Delay2ms();
				seg_disp(7,frequence%10);	Delay2ms();
			break;
			
			case 0:
				seg_disp(0,17);	Delay2ms();
				seg_disp_f(5,adc_100/100);	Delay2ms();
				seg_disp(6,adc_100%100/10);	Delay2ms();
				seg_disp(7,adc_100%10);	Delay2ms();
			break;
		}
		
		if(dac_mode == 1)	dac = adc;
		else	dac = 102;
	}
	else	
	{
		seg_disp(0,18);	Delay2ms();
		seg_disp(1,18);	Delay2ms();
		seg_disp(2,18);	Delay2ms();
		seg_disp(3,18);	Delay2ms();
		seg_disp(4,18);	Delay2ms();
		seg_disp(5,18);	Delay2ms();
		seg_disp(6,18);	Delay2ms();
		seg_disp(7,18);	Delay2ms();
	}
	
}

void led_pro(void)
{
	if(led_mode == 0)
	{
		P0 = 0xff;
		
		switch(show_mode)
		{
			case 0:
				P0 = P0&(~Led1);
				P0 = P0|(Led2);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
			break;
			
			case 1:
				P0 = P0&(~Led2);
				P0 = P0|(Led1);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
			break;
		}
		
		if((adc_f < 1.5)||(	(adc_f >= 2.5)&&(adc_f < 3.5))	)
		{
				P0 = P0|(Led3);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}
		else
		{
				P0 = P0&(~Led3);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}	
		
		if((frequence < 1000)||(	(frequence >= 5000)&&(frequence < 10000))	)
		{
				P0 = P0|(Led4);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}
		else
		{
				P0 = P0&(~Led4);
				P2 = P2&0x1f|0x80;
				P2 = P2&0x1f;
		}	
		
		if(dac_mode == 1)
		{
			P0 = P0&(~Led5);
			P2 = P2&0x1f|0x80;
			P2 = P2&0x1f;
		}
		else
		{
			P0 = P0|(Led5);
			P2 = P2&0x1f|0x80;
			P2 = P2&0x1f;
		}
		
	}
	else	
	{
		close_perl();
	}
}

void main(void)
{
	close_perl();
	time_init();
	while(1)
	{
		seg_pro();
		key_pro();
		led_pro();
	}
}

void timer0(void) interrupt 1
{
	timer0_up ++;
}

void timer1(void) interrupt 3
{
	timer1_up ++;
	if(timer1_up == 20)
	{
		frequence = timer0_up;
		timer0_up = 0;
		timer1_up = 0;
	}
}
<think>好的,我现在需要帮助用户找到第十届蓝桥杯单片机的试及解答。首先,用户提到了几个引用,其中引用[2]直接提到第十届的试解答,这可能是一个关键点。我需要检查用户提供的引用内容,看看是否有相关的链接或具体信息。 引用[2]提到用户有国一经验,并在准备过程中记录了解答,但给出的链接可能不完整,因为后面被截断了。不过,用户提供的引用里可能包含内部链接或参考资料。我需要确认是否有直接可用的资源。 另外,引用[1]和[4]分别涉及第十届和其他届的目,可能对用户帮助不大,但可以作为补充。引用[3]是关于评分标准,可能不包含具体目。 用户的需求明确是第十届的资料,所以重点应放在引用[2]上。但用户提供的引用[2]链接不完整,可能需要提示用户检查链接是否完整,或者建议其他途径,比如在优快云搜索作者和标,或者访问蓝桥杯官网。 同时,用户可能需要相关的代码示例,比如iic.h的内容,如引用[4]中的代码片段,这可能帮助用户理解往届试的结构。因此,在回答中可以提到这些参考资料,并建议用户如何查找。 最后,需要确保回答符合格式要求,使用正确的中文和LaTeX格式,以及生成相关问。可能的问可能涉及其他届的试、备建议或评分标准等。</think>关于第十届蓝桥杯单片机的试及解答,根据现有引用资料整理如下: ### 一、试特点 第十届延续了蓝桥杯单片机的典型命模式,主要考察: 1. 外设驱动开发(如数码管、矩阵键盘) 2. 数据采集与处理(ADC模块应用) 3. 通信协议实现(I2C、SPI等) 4. 系统功能整合能力 引用资料中显示,该届涉及$PCF8591$芯片的I2C通信控制[^4],需要选手实现多路AD/DA转换功能,并配合矩阵键盘完成参数设置。 ### 二、关键代码实现 根据引用[4]的代码片段,I2C通信模块的典型实现如下: ```c // iic.h 头文件定义 #ifndef __IIC_H__ #define __IIC_H__ void Write_PCF(unsigned char dat); #endif // iic.c 驱动实现 void IIC_Start() { SDA = 1; SCL = 1; Delay5us(); SDA = 0; Delay5us(); SCL = 0; Delay5us(); } ``` ### 三、备建议 参考国获奖者经验[^2]: 1. 掌握$LED$动态扫描算法 2. 熟练使用定时器中断服务函数 3. 建立模块化代码框架 4. 训练多任务协调能力 ### 四、参考资料获取 1. 官方渠道:蓝桥杯官网提供部分往届 2. 技术社区:优快云等平台有参者分享解思路[^1][^2] 3. 硬件手册:重点掌握$STC15F2K60S2$芯片特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值