4T第十五届国(sheng)赛模拟题第二套

前言:4T官网的第二套模拟题,缺了很多必要的东西,连省赛都不如,不是题目难度的问题,感觉是官方态度的问题。

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

个人感受与分析

按键就两个,还是同列的,明明只要独立按键就能完成的,就硬塞个矩阵按键。甚至都没有所谓的参数,和与参数交互的判断。我只能说,这题几乎就只能来练习底层。

底层驱动代码

IIC
就这题目还考IIC

unsigned char guangmin(){
	unsigned char ret;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x41);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	ret = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return ret;
}

void DAC(unsigned char dat){
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

onewire

void cewen(){
	unsigned char MSB,LSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	if(ce){
		Delay(550);
		ce = 0;
	}
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	
	temp = ((MSB << 8) | LSB) * 0.625;
}

主程序核心代码

#include <STC15F2K60S2.H>
#include "inithc138.h"
#include "delay.h"
#include "onewire.h"
#include "iic.h"

#define de 5
code unsigned char Seg_Table[17] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e, //F
0xbf
};
unsigned char show = 0;//显示切换
bit mode = 0;//模式界面
unsigned int temp = 0;//温度
bit ce = 1;
unsigned char light = 0;
unsigned int dacshuju = 0;//DAC数据
unsigned int dacxianshi = 0;
//***************************************测温
void cewen(){
	unsigned char MSB,LSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	if(ce){
		Delay(550);
		ce = 0;
	}
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	
	temp = ((MSB << 8) | LSB) * 0.625;
}
//***************************************
//***************************************显示功能
void moshijiemian(){//显示界面
	if(mode == 0){
		showsmg(1,Seg_Table[1]);
		showsmg(8,Seg_Table[temp % 10]);
		showsmg(7,Seg_Table[temp  / 10 % 10] & 0x7f);
		showsmg(6,Seg_Table[temp  / 100 % 10]);
	}else{
		showsmg(1,Seg_Table[2]);
		showsmg(8,Seg_Table[light % 10]);
		if(light > 9){
			showsmg(7,Seg_Table[light / 10 % 10]);
		}
		if(light > 99){
			showsmg(6,Seg_Table[light / 100 % 10]);
		}
	}
}

void shuchujiemian(){//输出界面
	if(mode == 0){
		if(temp <= 100){
			dacshuju = 51;
		}else if(temp >= 400){
			dacshuju = 255;
		}else{
			dacshuju = 0.680 * temp - 17.00;
		}
	}else{
		if(light <= 10){
			dacshuju = 51;
		}else if(light >= 240){
			dacshuju = 255;
		}else{
			dacshuju = 0.887 * light + 42.13;
		}
	}
	dacxianshi = dacshuju * 100 / 51;
	showsmg(1,0xc1);
	showsmg(8,Seg_Table[dacxianshi / 10 % 10]);
	showsmg(7,Seg_Table[dacxianshi / 100 % 10] & 0x7f);
}
//***************************************
//***************************************
void showselect(){
	switch(show){
		case 0:moshijiemian();break;
		case 1:shuchujiemian();break;
	}
}
//***************************************
//***************************************LED
void led(){
	if(mode == 0){
		outputp0(4,~0x01);
	}else{
		outputp0(4,~0x02);
	}
}
//***************************************
//***************************************按键扫描
void scankey(){
	P33 = 0;P32 = 1;P44 = 1;
	if(show == 0){
		if(P44 == 0){
			Delay(de);
			while(P44 == 0){
				showselect();
			}
			mode = ~mode;
		}
	}
	P33 = 1;P32 = 0;P44 = 1;
	if(P44 == 0){
		Delay(de);
		while(P44 == 0){
			showselect();
		}
		show++;
		show %= 2;
	}
}
//***************************************
void main(){
	initsys();
	light = guangmin();
	while(1){
		cewen();
		DAC(dacshuju);
		showselect();
		scankey();
		light = guangmin();
		showselect();
		DAC(dacshuju);
		led();
	}
}

注:这次代码简单,就不提供演示视频了。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值