第16届蓝桥杯单片机模拟试题Ⅲ

试题

代码

sys.h

cpp 复制代码
#ifndef __SYS_H__
#define __SYS_H__

#include <STC15F2K60S2.H>
//sys.c
extern unsigned char UI;					//界面标志(0湿度界面、1参数界面、2时间界面)
extern unsigned char time;				//时间间隔(1s~10S)
extern bit ssflag;								//启动/停止标志(0启动、1停止)
void init74hc138(unsigned char n);//译码器选通
void init();											//系统初始化
void relay(bit flag);							//继电器吸合控制
void led(unsigned char n);				//LED控制
void led_if();										//led指示灯
//iic.c
extern unsigned char shidu;						//湿度值
extern unsigned char shidu_canshu;		//湿度参数(30%~90%)
extern bit flag_relay;								//继电器状态
unsigned char adc(unsigned char addr);//模数转换选通
float get_Vrb2();											//获取RB2电压值
void get_shidu();											//RB2电压值转换为湿度数据
//seg_key.c
extern unsigned char Seg_Buff[8];//数码管缓存
void Key_Loop();								 //按键扫描
void Seg_Loop();								 //数码管刷新
void seg_ui();									 //界面选择
#endif

main.c

cpp 复制代码
#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_shidu=0;
bit flag_relay_con=0;
void Timer0_Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x50;				//设置定时初始值
	TH0 = 0xFB;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA = 1;
}
void main(){
	init();
	Timer0_Init();
	get_shidu();
	while(1){
		if(flag_seg){
			flag_seg=0;
			Seg_Loop();
		}
		if(flag_key){
			flag_key=0;
			Key_Loop();
			seg_ui();
		}
		if(flag_shidu){
			flag_shidu=0;
			get_shidu();
			seg_ui();
		}
		if(flag_relay_con){
			flag_relay_con=0;
			flag_relay=0;
			relay(0);
		}
		led_if();
	}
}
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0;
	static unsigned char count2=0;
	static unsigned int count3=0;
	static unsigned int count4=0;
	count1++;count2++;count3++;
	if(count1==2){
		count1=0;
		flag_seg=1;
	}
	if(count2==50){
		count2=0;
		flag_key=1;
	}
	if(count3==1000){
		count3=0;
		flag_shidu=1;
	}
	if(flag_relay){
		count4++;
		if(count4==((unsigned int)time*10000)){
			count4=0;
			flag_relay_con=1;
		}
	}
}

sys.c

cpp 复制代码
#include "sys.h"
unsigned char UI=0;
unsigned char time=3;
bit ssflag=1;
void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void relay(bit flag){
	if(flag) P0=0x10;
	else P0=0x00;
	init74hc138(5);
}
void led(unsigned char n){
	P0=~(0x01<<(n-1));
	init74hc138(4);
}
void led_if(){
	switch(UI){
		case 0:led(1);break;
		case 1:led(2);break;
		case 2:led(3);break;
	}
	if(!ssflag) led(8);
}

seg_key.c

cpp 复制代码
#include "sys.h"
sbit COL1=P4^4;
sbit COL2=P4^2;
sbit ROW3=P3^2;
sbit ROW4=P3^3;
code unsigned char Seg_Table[]={
	0xc0,//0
	0xf9,//1
	0xa4,//2
	0xb0,//3
	0x99,//4
	0x92,//5
	0x82,//6
	0xf8,//7
	0x80,//8
	0x90,//9
	0xc6,//C 10
	0x86,//E 11 
	0x89,//H 12
	0xff	//熄灭 13
};
unsigned char Seg_Buff[8]={13,13,13,13,13,13,13,13};
unsigned char keyval,keyold,keyup,keydown;
unsigned char key_scan(){
	COL1=0;COL2=1;
	if(ROW4==0) return 4;
	if(ROW3==0) return 5;
	COL1=1;COL2=0;
	if(ROW4==0) return 8;
	if(ROW3==0) return 9;
	return 0;
}
void Key_Loop(){
	keyval=key_scan();
	keydown=keyval&(keyold^keyval);
	keyup=~keyval&(keyold^keyval);
	//s4为界面切换按键
	if(keyval==4&&keyold!=4){
		UI++;
		if(UI==3) UI=0;
	}
	//s5为启动停止按键
	if(keyval==5&&keyold!=5){
		ssflag=!ssflag;
	}
	//s8为减按键
	if(keyval==8&&keyold!=8){
		if(UI==1){
			if(shidu_canshu>30)
				shidu_canshu-=5;
			else
				shidu_canshu=90;
		}else if(UI==2){
			if(time>1)
				time--;
			else
				time=10;
		}
	}
	//s9为加按键
	if(keyval==9&&keyold!=9){
		if(UI==1){
			if(shidu_canshu<90)
				shidu_canshu+=5;
			else
				shidu_canshu=30;
		}else if(UI==2){
			if(time<10)
				time++;
			else
				time=1;
		}
	}
	keyold=keyval;
	keyval=0;
}
void seg(unsigned char addr,num){
	P0=0xff;
	init74hc138(7);
	P0=0x01<<addr;
	init74hc138(6);
	P0=Seg_Table[num];
	init74hc138(7);
}
void Seg_Loop(){
	static unsigned char i=0;
	seg(i,Seg_Buff[i]);
	i++;
	if(i==8) i=0;
}
//湿度界面
void ui0(){
	Seg_Buff[7]=shidu%10;
	Seg_Buff[6]=shidu/10;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=10;//C
}
//参数界面
void ui1(){
	Seg_Buff[7]=shidu_canshu%10;
	Seg_Buff[6]=shidu_canshu/10;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=11;//E
}
//参数界面
void ui2(){
	Seg_Buff[7]=time%10;
	if(time<10)
		Seg_Buff[6]=13;
	else
		Seg_Buff[6]=1;
	Seg_Buff[5]=13;
	Seg_Buff[4]=13;
	Seg_Buff[3]=13;
	Seg_Buff[2]=13;
	Seg_Buff[1]=13;
	Seg_Buff[0]=12;//H
}
void seg_ui(){
	switch(UI){
		case 0:ui0();break;
		case 1:ui1();break;
		case 2:ui2();break;
	}
}

ii.c

cpp 复制代码
#include "sys.h"
#include "intrins.h"
#define DELAY_TIME	10
sbit scl=P2^0;
sbit sda=P2^1;
unsigned char shidu;
unsigned char shidu_canshu=50;
bit flag_relay=0;
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);
}
unsigned char adc(unsigned char addr){
	unsigned char temp;
	I2CStart();
	EA = 0;
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	EA = 1;
	return temp;
}
float get_Vrb2(){
	return (float)adc(3)/255.0*5.0;
}
void get_shidu(){ 
	float temp;
	temp=get_Vrb2();
	if(temp<1.0){
		shidu=10;
	}else if(temp<=4){
		shidu=(unsigned char)(80.0/3.0*(temp-1)+10+0.5);
	}else{
		shidu=90;
	}
	if(ssflag){
		flag_relay=0;
		relay(0);
	}else{
		if(shidu<shidu_canshu&&!flag_relay){
			flag_relay=1;
			relay(1);
		}
	}
}

测评结果

尚待解决的问题

最后一项测评一直不正确,在板子上显示正常。感谢各位大佬们批评指导

相关推荐
cqbzcsq31 分钟前
2025蓝桥杯省赛C/C++研究生组游记
c语言·c++·蓝桥杯
一只鱼^_34 分钟前
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组
c语言·c++·算法·贪心算法·蓝桥杯·深度优先·图搜索算法
竹下为生43 分钟前
LeetCode --- 444 周赛
算法·leetcode·职场和发展
牛奶咖啡.85412 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
SuperW12 小时前
蓝桥杯嵌入式十五届模拟二(串口DMA,占空比的另一种测量方式)
单片机·职场和发展·蓝桥杯
旧时光林14 小时前
蓝桥杯 分解质因数(唯一分解定理)
数据结构·c++·算法·蓝桥杯·模拟·枚举
黑客老李14 小时前
面试经验分享 | 成都渗透测试工程师二面面经分享
经验分享·面试·职场和发展
头发尚存的猿小二14 小时前
2024年第十五届蓝桥杯C&C++大学A组--成绩统计
c语言·开发语言·c++·蓝桥杯
测试杂货铺15 小时前
软件测试之功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
rigidwill66616 小时前
LeetCode hot 100—子集
数据结构·c++·算法·leetcode·职场和发展