行业知识
蓝桥杯单片机第14届省赛客观题目+程序题目+程序题参考答案
2026-11-07 23:18:43
来源:互联网转载
���录
客观题题目
程序题题目
程序题参考答案
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!!!
- NE555本来应该是在国赛考的,这届省赛直接上了。
- I2C、DS1302、DS18B20,这3个省赛常考的内容,按照往届省赛的习惯应该是三选二进行考查,但是这届省赛中直接将这3个都给考了,这种做法常见于国赛当中。
- 这届赛题的逻辑也更加复杂,出现了两个采集到的数据,进行对比最大值、计算平均值、前后两次采集到的数据比较。
- 程序题的题目能达到5页之多。
- 客观题也不好做。
- 个人感觉,疫情开放后,为了减少国赛的参加人数。
main.h
#ifndef __MAIN_H_#define __MAIN_H_#include #define uchar unsigned char#define uint unsigned int#include "Init.h"#include "SMG.h"#include "DSQ.h"#include "YanShi.h"#include "JZKey.h"#include "ds1302.h"#include "iic.h"#include "onewire.h"#include "LN555.h"void LED_Show();#endif
main.c
#include "main.h"uchar key_num=0;uchar key_num_old=0;uchar JieMian=0;//界面。0:时间;1:回显;2:参数,3:温湿度uchar JieMian_old;uchar HuiXian=0;//回显。0:温度;1:湿度;2:时间char WenDu_CanShu=30;//温度参数,0-99uint S9_time=0;uchar shi,fen,miao;uchar ADC_data;uchar ADC_data_old;uchar ChuFa_CiShu=0;//触发次数uchar WenDu=0;//温度uchar WenDu_old;uchar WenDu_temp;uchar WenDu_Max=0;uint WenDu_PingJun=0;uint Hz;uint Hz_time=0;uchar ChuFa_Shi,ChuFa_Fen;uchar ShiDu=0;uchar ShiDu_old=0;uchar ShiDu_old_temp;uchar ShiDu_Max=0;uint ShiDu_PingJun=0;uchar JieMian_flag=0;//0:正常运转;1:3秒显示温湿度uint JieMian_flag_time=0;uchar YouXiao_flag=1;uchar L4_time=0;uint ADC_time=0;void main(){Init_BZ();DSQ_2_Init();SMG_Init();JZKey_Init();LN555_DSQ_0_Init();Ds1302_XieData(13,3,5);DS18B20_GetWenDu();while(1){key_num_old=key_num;key_num=JZKey_GetKeynum();if(key_num_old!=key_num&&JieMian_flag==0){if(key_num==4){JieMian++;JieMian=JieMian%3;if(JieMian==1){HuiXian=0;}}else if(key_num==5&&JieMian!=0){HuiXian++;HuiXian=HuiXian%3;}else if(key_num==8&&JieMian==2){WenDu_CanShu++;if(WenDu_CanShu>=99){WenDu_CanShu=99;}}else if(key_num==9&&JieMian==2){WenDu_CanShu--;if(WenDu_CanShu=200){ADC_time=0;ADC_data_old=ADC_data;ADC_data=IIC_ADC_GetData(1);if(ADC_data_old>ADC_data&&JieMian_flag==0&&ADC_data_old>90&&ADC_data9&&ShiDu=10){SMG_Show(24,16,16,16,16,16,WenDu_CanShu/10,WenDu_CanShu%10);}else if(WenDu_CanShu>=0){SMG_Show(24,16,16,16,16,16,16,WenDu_CanShu);}}else if(JieMian==3){if(YouXiao_flag==1){SMG_Show(14,16,16,WenDu/10,WenDu%10,17,ShiDu/10,ShiDu%10);}else{SMG_Show(14,16,16,WenDu_temp/10,WenDu_temp%10,17,10,10); }}LED_Show();}void LED_Show(){uchar L1_2_3=0xff;uchar L4=0xff;uchar L5=0xff;uchar L6=0xff;if(JieMian==0){L1_2_3=0xfe;}else if(JieMian==1){L1_2_3=0xfd;}else if(JieMian==2){L1_2_3=0xfb;}if(L4_time>=100){L4=0xf7;}if(YouXiao_flag==0){L5=0xef;}if(ChuFa_CiShu>=2&&WenDu_old=1; if(SDA) temp|=0x80; SCK=1;} RST=0;_nop_(); SCK=0;_nop_();SCK=1;_nop_();SDA=0;_nop_();SDA=1;_nop_();return (temp);}void Ds1302_XieData(unsigned char shi,fen,miao){shi=(shi/10)*16+(shi%10);fen=(fen/10)*16+(fen%10);miao=(miao/10)*16+(miao%10);Write_Ds1302_Byte(0x8e,0x00);Write_Ds1302_Byte(0x84,shi);Write_Ds1302_Byte(0x82,fen);Write_Ds1302_Byte(0x80,miao);Write_Ds1302_Byte(0x8e,0x80);}unsigned char Ds1302_GetShi(){unsigned char date;date=Read_Ds1302_Byte(0x85);date=(date/16)*10+(date%16);return date;}unsigned char Ds1302_GetFen(){unsigned char date;date=Read_Ds1302_Byte(0x83);date=(date/16)*10+(date%16);return date;}unsigned char Ds1302_GetMiao(){unsigned char date;date=Read_Ds1302_Byte(0x81);date=(date/16)*10+(date%16);return date;} iic.h
#ifndef _IIC_H#define _IIC_H#include #include "intrins.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); unsigned char IIC_ADC_GetData(unsigned char di_zhi);void IIC_DAC_XieData(unsigned char date);unsigned char IIC_EEPROM_GetData(unsigned char di_zhi);void IIC_EEPROM_XieData(unsigned char dizhi,date);#endif
iic.c
/* 程序说明: IIC总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz 日 期: 2011-8-9*/#include "iic.h"#define DELAY_TIME 5#define SlaveAddrW 0xA0#define SlaveAddrR 0xA1//总线引脚定义sbit SDA = P2^1; /* 数据线 */sbit SCL = P2^0; /* 时钟线 */void IIC_Delay(unsigned char i){ do{_nop_();} while(i--); }//总线启动条件void IIC_Start(void){ SDA = 1; SCL = 1; IIC_Delay(DELAY_TIME); SDA = 0; IIC_Delay(DELAY_TIME); SCL = 0;}//总线停止条件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; // 0:应答,1:非应答 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
上一篇:怎么用服务器上网记录?
下一篇:系统的服务器地址怎么找?