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

#include "reg52.h"
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"
#define smgTime 2
#define keyTime 5
#define _A_ 0x88
#define _P_ 0x8c
#define _E_ 0x86
#define _C_ 0xc6
#define _H_ 0x89
#define _F_ 0x8e
#define _ 0xbf
sfr P4=0xc0;
sbit pulse_in=P3^4;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P42=P4^2;
sbit P44=P4^4;
sfr AUXR=0x8e;
unsigned char trigger_flag=1;
unsigned char L4blink=0;
unsigned char L4=0;
unsigned char pressing=0;
unsigned char last_trigger_time[2]={0x00,0x00};
unsigned char bigger_flag=0;
unsigned char threeSec=0;
unsigned char tmp;
unsigned char led_stat=0xff;
unsigned char s;
unsigned char write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char init_time[7]={0x24, 0x58, 0x23, 0x19, 0x04, 0x06, 0x20};//s m h date month day year
//unsigned char curr_time[7]={0x45,0x59,0x12,0x31,0x12,0x01,0x23};
unsigned char sec=0;
unsigned char min=0;
unsigned char hour=0;
unsigned char seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char ad_dat=0;
unsigned int temp_dat16=0;
double temp_dat=0;
double last_temp_dat=0;
double volt_dat=0;
double last_volt_dat=0;
unsigned int timer1counter=0;
unsigned int pulse_counter=0;
unsigned int pulse_dat=0;
unsigned char damp_per=0;
unsigned char last_damp_per=0;
unsigned char damp_Hcode=0;
unsigned char damp_Lcode=0;
unsigned char interface_mod=1;//1 2 3 ||4 || time echo para  ||temperature||
unsigned char echo_mod=1;// 1 2 3
unsigned char temp_para=30;
unsigned char trigger_times=0;
unsigned char max_temp=0;
unsigned char max_damp=0;
unsigned char press_counter=0;
double ave_temp=0;
double ave_damp=0;
double sum_temp=0;
unsigned int sum_damp=0;
void scan_keys();
void display_ctrl(void);
void test();
latch enable and write/
void write_latch(unsigned char n,unsigned char val){
	P0=val;
	switch(n){
		case 4:
			P2&=0x1f;
			P2|=0x80;
		break;
		case 5:
			P2&=0x1f;
			P2|=0xa0;
		break;
		case 6:
			P2&=0x1f;
			P2|=0xc0;
		break;
		case 7:
			P2&=0x1f;
			P2|=0xe0;
		break;
		case 0:
			P2&=0x1f;
	}
	P2&=0x1f;//close hc573 latch;
}
void enable_latch(unsigned char n){
	switch(n){
		case 4:
			P2&=0x1f;
			P2|=0x80;
		break;
		case 5:
			P2&=0x1f;
			P2|=0xa0;
		break;
		case 6:
			P2&=0x1f;
			P2|=0xc0;
		break;
		case 7:
			P2&=0x1f;
			P2|=0xe0;
		break;
		case 0:
			P2&=0x1f;
	}
}
///
//delay/
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
void delay_ms(unsigned int t){
	while(t--){
		Delay1ms();
	}
}
void delay_with_scan(unsigned int t){//16 ms 1 round
	while(t--){
		//Delay1ms();
		display_ctrl();
		//test();
	}
}
/set and get time///
void set_ds1302(){
	unsigned char i;
	Write_Ds1302_Byte(0x8e, 0x00);
	for(i=0;i<7;i++){
		Write_Ds1302_Byte(write_addr[i], init_time[i]);
	}
	Write_Ds1302_Byte(0x8e, 0x80);
}

void get_ds1302(){
	sec=Read_Ds1302_Byte(0x81);
	min=Read_Ds1302_Byte(0x83);
	hour=Read_Ds1302_Byte(0x85);
	
}
///

light data///
void iic_read_ain1(){
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x01);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	ad_dat=IIC_RecByte();
	IIC_Ack(1);
	IIC_Stop();
}
void conv2volt(void){
	volt_dat=((double)ad_dat*(5.0/255.0));
}
///

get temperture data/
void get_temp(void){
	unsigned char TL;
	unsigned char TH;
	Init_DS18B20();
	Write_DS18B20(0xcc);//skip rom
	Write_DS18B20(0x44);//convert
	delay_with_scan(50);//waiting for converting
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	TL=Read_DS18B20();//low 8bits ****!!!!!!!!!!!attention!!!!!!!!!!!!***lowComsFirst
	TH=Read_DS18B20();//high 8bits !!!!!!!!!!!!
	temp_dat16=0x0000;
	temp_dat16|=TH;
	temp_dat16=temp_dat16<<8;
	temp_dat16|=TL;//combine to get a 16bits data
	temp_dat=temp_dat16*(0.0625);
}

///timer setting/
void Timer1Init(void)		//5ms@12.000MHz
{
	EA=1;
	ET1=1;
	AUXR |= 0x40;		
	TMOD &= 0x0F;		
	TL1 = 0xA0;		
	TH1 = 0x15;		
	TF1 = 0;		
	TR1 = 1;	
}

void timer1server() interrupt 3{
	TL1 = 0xA0;		
	TH1 = 0x15;	
	scan_keys();
	timer1counter++;
	//if(trigger_flag==0)threeSec++;
	
	if(pressing){
		press_counter++;
	}
	else{
		press_counter=0;
	}
	
	//if(threeSec==600 && trigger_flag==0){
	//	trigger_flag=1;
		//threeSec=0;
		//interface_mod=tmp;
	//}
	if((timer1counter%20==0)&& L4blink==1){
		if(L4){
			enable_latch(4);
			led_stat&=0xf7  ;//1111 0111
			P0=led_stat;
			enable_latch(0);
		}
		else{
			enable_latch(4);
			led_stat|=0x08  ;//1111 0111
			P0=led_stat;
			enable_latch(0);			
		}
		L4=1-L4;
	}
	if(timer1counter==200){//1s
		//yo++;
		//if(yo==100)yo=0;
		
		timer1counter=0;
		pulse_dat=pulse_counter;
		pulse_counter=0;
	}
}
void Timer0Init(void){
	AUXR |= 0x80;
	TMOD  &=0xf0;     //0000 0110
	TMOD |=0x06;//8bits auto load, counter
	TL0=0xff;//into server every pulse
	TH0=0xff;
	EA=1;
	ET0=1;
	TR0=1;
}
void timer0server() interrupt 1{
	pulse_counter++;
}

///dampness data///
void get_damp_percent(){
	if(pulse_dat>2000 || pulse_dat<200){
		damp_Hcode=_A_;
		damp_Lcode=_A_;
	}
	else{
		damp_per=(unsigned char)(pulse_dat*0.044+1.12);
		damp_Hcode=seg_code[(damp_per/10)];
		damp_Lcode=seg_code[damp_per%10];
	}
	
	
}

///
//display data///
void display_bit(unsigned char pos,unsigned char code_val,unsigned char isdot){
	write_latch(6,0x01<<(pos-1));//position 
	if(isdot){
		write_latch(7,code_val&0x7f);//
	}
	else{
		write_latch(7,code_val);
	}
}
void smg_off(unsigned char pos){
	write_latch(6,0x01<<(pos-1));
	write_latch(7,0xff);	
}
unsigned char bcd2dec(unsigned char n){
	unsigned char tmp=0x00;
	unsigned char h;
	unsigned char l;
	h=(n&0xf0)>>4;
	l=(n&0x0f);
	tmp=h*10+l;
	return tmp;
}
void display_time(){
	
	display_bit(1,seg_code[hour>>4],0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,seg_code[hour&0x0f],0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,_,0);
	delay_ms(smgTime);
	smg_off(3);
	//
	display_bit(4,seg_code[min>>4],0);
	delay_ms(smgTime);
	smg_off(4);
	
	display_bit(5,seg_code[min&0x0f],0);
	delay_ms(smgTime);
	smg_off(5);
	
	display_bit(6,_,0);
	delay_ms(smgTime);
	smg_off(6);
	
	display_bit(7,seg_code[sec>>4],0);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,seg_code[sec&0x0f],0);
	delay_ms(smgTime);
	smg_off(8);
}

void display_para(){
	display_bit(1,_P_,0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,0xff,0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,0xff,0);
	delay_ms(smgTime);
	smg_off(3);
	
	display_bit(4,0xff,0);
	delay_ms(smgTime);
	smg_off(4);
	
	display_bit(5,0xff,0);
	delay_ms(smgTime);
	smg_off(5);
	
	display_bit(6,0xff,0);
	delay_ms(smgTime);
	smg_off(6);
	
	display_bit(7,seg_code[temp_para/10],0);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,seg_code[temp_para%10],0);
	delay_ms(smgTime);
	smg_off(8);	
}
void display_temp_echo(){
	display_bit(1,_C_,0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,0xff,0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,seg_code[(unsigned char)max_temp/10],0);
	delay_ms(smgTime);
	smg_off(3);
	
	display_bit(4,seg_code[(unsigned char)max_temp%10],0);
	delay_ms(smgTime);
	smg_off(4);
	
	display_bit(5,_,0);
	delay_ms(smgTime);
	smg_off(5);
	
	display_bit(6,seg_code[(unsigned char)ave_temp/10],0);
	delay_ms(smgTime);
	smg_off(6);
	
	display_bit(7,seg_code[(unsigned char)ave_temp%10],1);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,seg_code[((unsigned char)(ave_temp*10))%10],0);
	delay_ms(smgTime);
	smg_off(8);	
}
void display_damp_echo(){
	display_bit(1,_H_,0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,0xff,0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,seg_code[(unsigned char)max_damp/10],0);
	delay_ms(smgTime);
	smg_off(3);
	
	display_bit(4,seg_code[(unsigned char)max_damp%10],0);
	delay_ms(smgTime);
	smg_off(4);
	
	display_bit(5,_,0);
	delay_ms(smgTime);
	smg_off(5);
	
	display_bit(6,seg_code[(unsigned char)ave_damp/10],0);
	delay_ms(smgTime);
	smg_off(6);
	
	display_bit(7,seg_code[(unsigned char)ave_damp%10],1);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,seg_code[((unsigned char)(ave_damp*10))%10],0);
	delay_ms(smgTime);
	smg_off(8);	
}
void display_time_echo(){
	display_bit(1,_F_,0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,seg_code[trigger_times/10],0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,seg_code[trigger_times%10],0);
	delay_ms(smgTime);
	smg_off(3);
	
	display_bit(4,seg_code[bcd2dec(last_trigger_time[0])/10],0);
	delay_ms(smgTime);
	smg_off(4);
	

	
	display_bit(5,seg_code[bcd2dec(last_trigger_time[0])%10],0);
	delay_ms(smgTime);
	smg_off(6);
	display_bit(6,_,0);
	delay_ms(smgTime);
	smg_off(5);
	display_bit(7,seg_code[bcd2dec(last_trigger_time[1])/10],0);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,seg_code[bcd2dec(last_trigger_time[1])%10],0);
	delay_ms(smgTime);
	smg_off(8);	
}
void display_temp_damp(){
	display_bit(1,_E_,0);
	delay_ms(smgTime);
	smg_off(1);
	
	display_bit(2,0xff,0);
	delay_ms(smgTime);
	smg_off(2);
	
	display_bit(3,0xff,0);
	delay_ms(smgTime);
	smg_off(3);
	
	display_bit(4,seg_code[(unsigned char)temp_dat/10],0);
	delay_ms(smgTime);
	smg_off(4);
	
	display_bit(5,seg_code[(unsigned char)temp_dat%10],0);
	delay_ms(smgTime);
	smg_off(5);
	
	display_bit(6,_,0);
	delay_ms(smgTime);
	smg_off(6);
	
	display_bit(7,damp_Hcode,0);
	delay_ms(smgTime);
	smg_off(7);
	
	display_bit(8,damp_Lcode,0);
	delay_ms(smgTime);
	smg_off(8);		
}

void display_ctrl(){
	if(interface_mod==1){
		display_time();
	}
	else if(interface_mod==2){
		if(echo_mod==1){
			display_temp_echo();
		}
		if(echo_mod==2){
			display_damp_echo();
		}
		if(echo_mod==3){
			display_time_echo();
		}
	}
	else if(interface_mod==3){
		display_para();
	}
	else if(interface_mod==4){
		display_temp_damp();
	}
}
/read keyboard//
void scan_keys(){
	P32=0;P33=1;
	if(P42==0){
		delay_with_scan(keyTime);
		if(P42==0){
			//s9
			if(interface_mod==3){
				temp_para--;
			}
			if(interface_mod==2 && echo_mod==3){
				while(P42==0){
					pressing=1;
					
				}
				pressing=0;
				if(press_counter>=400){//>= 2s clear all data
					trigger_times=0;
					sum_temp=0;
					sum_damp=0;
					max_temp=0;
					max_damp=0;
				}
			}
		}
	}
	if(P44==0){
		delay_with_scan(keyTime);
		if(P44==0){
			//s5
			if(interface_mod==2){
				if(echo_mod==1){
					echo_mod=2;
				}
				else if(echo_mod==2){
					echo_mod=3;
				}
				else if(echo_mod==3){
					echo_mod=1;
				}
			}
		}
	}
	
	///
	
	P32=1;P33=0;
	if(P42==0){
		delay_with_scan(keyTime);
		if(P42==0){
			//s8
			if(interface_mod==3){
				temp_para++;
			}
		}
	}
	if(P44==0){
		delay_with_scan(keyTime);
		if(P44==0){
			//s4
			if(interface_mod==1){
				interface_mod=2;
			}
			else if(interface_mod==2){
				interface_mod=3;
			}
			else if(interface_mod==3){
				interface_mod=1;
			}
		}
	}	
}
//if collect
void if_collect_data(){
	unsigned char t=188;
	
	iic_read_ain1();
	conv2volt();
	if(last_volt_dat>3.0 && volt_dat<3.0 && trigger_flag){
		trigger_times++;
		last_trigger_time[0]=hour;
		last_trigger_time[1]=min;
		get_damp_percent();
		get_temp();
		sum_damp+=damp_per;
		ave_damp=sum_damp/(double)trigger_times;
		sum_temp+=temp_dat;
		ave_temp=sum_temp/(double)trigger_times;
		if((damp_per>last_damp_per)&&(temp_dat>last_temp_dat)){
			bigger_flag=1;
		}
		else{
			bigger_flag=0;
		}
		if(damp_per>max_damp)max_damp=damp_per;
		if(temp_dat>max_temp)max_temp=temp_dat;
		tmp=interface_mod;
		interface_mod=4;
		while(t--){
			display_ctrl();
		}
		
		interface_mod=tmp;
		
		
	last_damp_per=damp_per;
	last_temp_dat=temp_dat;
	}
	last_volt_dat=volt_dat;

}

//
void init_sys(){
	write_latch(4,0xff);
}
void led_ctrl(){
	if(interface_mod==1){
		enable_latch(4);
		led_stat&=0xfe;
		P0=led_stat;
		enable_latch(0);
	}
	else{
		enable_latch(4);
		
		led_stat|=0x01;
		P0=led_stat;
		enable_latch(0);	
	}
	
	if(interface_mod==2){
		enable_latch(4);
		led_stat&=0xfd;//1111 1101
		P0=led_stat;
		enable_latch(0);
	}
	else{
		enable_latch(4);
		
		led_stat|=0x02;
		P0=led_stat;
		enable_latch(0);	
	}
	
	if(interface_mod==3){
		enable_latch(4);
		led_stat&=0xfb;//1111 1011
		P0=led_stat;
		enable_latch(0);
	}
	else{
		enable_latch(4);
		led_stat|=0x04;//0000 0100
		P0=led_stat;
		enable_latch(0);	
	}
	if(temp_dat>temp_para){
		L4blink=1;
	}
	else{
		L4blink=0;
	}
	if(damp_Hcode==_A_){
		enable_latch(4);
		led_stat&=0xef;//1110 1111
		P0=led_stat;
		enable_latch(0);	
	}
	else{
		enable_latch(4);
		led_stat|=0x10;//0001 0000
		P0=led_stat;
		enable_latch(0);	
	}
	if((trigger_times>=2)&&(bigger_flag)){
		enable_latch(4);
		led_stat&=0xdf;//1101 1111
		P0=led_stat;
		enable_latch(0);
	}
	else{
		enable_latch(4);
		led_stat|=0x20;//0010 0000
		P0=led_stat;
		enable_latch(0);	
	}
}
void main(){
	Timer1Init();
	Timer0Init();
	init_sys();
	set_ds1302();
	iic_read_ain1();
	conv2volt();
	last_volt_dat=volt_dat;
	while(1){
		get_ds1302();
		if_collect_data();
		led_ctrl();
		display_ctrl();
		//get_temp();
		//test();
	}
}

吐槽一下,全篇七百多行,给我写个半死,这题目对于省赛来说工作量是不是有点太大了?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CAI2256

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

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

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

打赏作者

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

抵扣说明:

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

余额充值