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

本文详细介绍了使用51单片机控制DS1302实时时钟,处理按键输入,以及温度监控和LED控制的功能。代码涉及中断处理、I/O操作和时间显示等功能模块。
摘要由CSDN通过智能技术生成
#include "reg52.h"
#include "ds1302.h"
#include "onewire.h"
sfr AUXR=0x8e;

sfr P4=0xc0;
sbit port1=P3^2;
sbit port2=P3^3;
sbit res1=P3^4;
sbit res2=P3^5;
sbit otherbit1=P3^0;
sbit otherbit2=P3^1;
code unsigned char seg_code[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0xff,0xbf};
code unsigned char read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char ledcounter=0;
unsigned char isRelay=0;
unsigned char tcounter=0;
unsigned char led_stat=0xfd;//1111 1101
unsigned char time[7]={0x50,0x59,0x13,0x12,0x04,0x06,0x24};
unsigned char timer0counter=0;
unsigned char ui_stat=1;//temp time setting
unsigned char mod_stat=1;//temp time
unsigned char time_mod=1;
unsigned char timer1counter=0;
double temp=0;
double buffer=0;
unsigned char key_val=0;
unsigned char set_temp=23;
unsigned char clock_flag=1;
void write_latch(unsigned char n,unsigned char val);
void enable_latch(unsigned char n);
void read_temp();
void init_sys(){
	write_latch(4,0xfd);
	write_latch(5,0x00);
	write_latch(6,0xff);
	write_latch(7,0xff);

}
unsigned char bcd2dec(unsigned char bcd){
	unsigned char dec=0;
	dec=bcd>>4;
	dec*=10;
	dec+=(bcd&0x0f);
	return dec;
}
void set1302(){
	unsigned char i=0;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<8;i++){
		Write_Ds1302_Byte(write_addr[i],time[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
void read_time(){
	unsigned char i=0;
	unsigned char tmp=0x00;
	//read_temp();
	for(i=0;i<8;i++){
		time[i]=Read_Ds1302_Byte(read_addr[i]);
	}
	if((time[0]==0x00)&&(time[1]==0x00)&&clock_flag){
		/relay
		clock_flag=0;
		timer1counter=0;
		TR1=1;
		enable_latch(4);
		led_stat&=0xfe;
		tmp=P0;
		P0=led_stat;
		enable_latch(0);
		P0=tmp;
		if(mod_stat==2){
			write_latch(5,0x10);
			isRelay=1;
		}
		
	}
}

void display_dat();
void enable_latch(unsigned char n){
		switch(n){
		case 0:
			P2&=0x1f;
			P2|=0x00;
		break;
		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;
	}
}
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;
	}
	P2&=0x1f;
}
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void delay_ms_smg(unsigned char t){
	while(t--){
		Delay1ms();
	}
}
void delay_ms(unsigned char t){
	while(t--){
		Delay1ms();
	}
}
void delay(unsigned char t){
	while(t--){
		display_dat();
	}
}
void scan_keys(){
	unsigned char tmp;
	port1=0;
	port2=1;otherbit1=1;otherbit2=1;
	if(res1==0){
		delay_ms(10);
		if(res1==0){
			//key_val=17;
			//write_latch(4,0x00);
			if(ui_stat==3){
				set_temp--;
				if(set_temp<10){
					set_temp=99;
				}
			}
			else if(ui_stat==2){
				
				while(res1==0){
					time_mod=2;
					//read_time();
					display_dat();
				}
				time_mod=1;
			
			}
			
		}
	}
	if(res2==0){
		delay_ms(10);
		if(res2==0){
			//key_val=13;abcd
			if(mod_stat==1){
				mod_stat=2;
				enable_latch(4);
				led_stat|=0x02;  //0000 0010
				tmp=P0;
				P0=led_stat;
				enable_latch(0);
				P0=tmp;
				
			}
			else if(mod_stat==2){
				mod_stat=1;
				enable_latch(4);
				led_stat&=0xfd;//1111 1101
				tmp=P0;
				P0=led_stat;
				enable_latch(0);
				P0=tmp;
			}
		}
	}
	
	port2=0;
	port1=1;otherbit1=1;otherbit2=1;
	if(res1==0){
		delay_ms(10);
		if(res1==0){
			//key_val=16;
			if(ui_stat==3){
				set_temp++;
				if(set_temp>99){
					set_temp=10;
				}
			}
			
		}
	}
	if(res2==0){
		delay_ms(10);
		if(res2==0){
			//key_val=12;
			if(ui_stat==1){
				ui_stat=2;
			}
			else if(ui_stat==2){
				ui_stat=3;
			}
			else if(ui_stat==3){
				ui_stat=1;
			}
		}
		
	}

}
void display_bit(unsigned char pos,unsigned char val,unsigned char dot){
	write_latch(6,0x01<<(pos-1));
	if(dot){
		write_latch(7,seg_code[val]&0x7f);
	}
	else{
		write_latch(7,seg_code[val]);
	}
}
void read_temp(){
	unsigned char LOW;
	unsigned char HIGH;
	unsigned int dat16;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(100);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LOW=Read_DS18B20();
	HIGH=Read_DS18B20();
	init_ds18b20();
	dat16=HIGH;
	dat16=dat16<<8;
	dat16|=LOW;
	temp=(double)dat16*0.0625;
}
void display_UX(unsigned char n){
	display_bit(1,10,0);
	delay_ms(2);
	display_bit(1,11,0);
	
	display_bit(2,n,0);
	delay_ms(2);
	display_bit(2,11,0);
	
}
void off_bit(unsigned pos){
	display_bit(pos,11,0);
}
void display_dat(){
	//read_time();
	if(ui_stat==1){
		display_UX(1);
		off_bit(3);
		off_bit(4);
		off_bit(5);
		display_bit(6,temp/10,0);
		delay_ms(2);
		display_bit(6,11,0);
		
		display_bit(7,(unsigned int)temp%10,1);
		delay_ms(2);
		display_bit(7,11,0);
		
		display_bit(8,(unsigned int)(temp*10)%10,0);
		delay_ms(2);
		display_bit(8,11,0);
	}
	if(ui_stat==2){
		display_UX(2);
		read_time();
		if(time_mod==1){
			off_bit(3);
			display_bit(4,bcd2dec(time[2])/10,0);
			delay_ms(2);
			display_bit(4,11,0);
			
			display_bit(5,bcd2dec(time[2])%10,0);
			delay_ms(2);
			display_bit(5,11,0);
			
			display_bit(6,12,0);
			delay_ms(2);
			display_bit(6,11,0);
			
			display_bit(7,bcd2dec(time[1])/10,0);
			delay_ms(2);
			display_bit(7,11,0);
			
			display_bit(8,bcd2dec(time[1])%10,0);
			delay_ms(2);
			display_bit(8,11,0);			
		}
		else if(time_mod==2){
			off_bit(3);
			display_bit(4,bcd2dec(time[1])/10,0);
			delay_ms(2);
			display_bit(4,11,0);
			
			display_bit(5,bcd2dec(time[1])%10,0);
			delay_ms(2);
			display_bit(5,11,0);
			
			display_bit(6,12,0);
			delay_ms(2);
			display_bit(6,11,0);
			
			display_bit(7,bcd2dec(time[0])/10,0);
			delay_ms(2);
			display_bit(7,11,0);
			
			display_bit(8,bcd2dec(time[0])%10,0);
			delay_ms(2);
			display_bit(8,11,0);				
		}
	}
	
	if(ui_stat==3){
		display_UX(3);
		off_bit(3);
		off_bit(4);
		off_bit(5);
		off_bit(6);
		display_bit(7,set_temp/10,0);
		delay_ms(2);
		off_bit(7);
		display_bit(8,set_temp%10,0);
		delay_ms(2);
		off_bit(8);
		
	}
}

void Timer0Init(void)		//2ms@12.000MHz
{

	EA=1;
	ET0=1;

	AUXR &= 0x7F;		
	TMOD &= 0xF0;		
	TMOD |= 0x01;		
	TL0 = 0xB0;		
	TH0 = 0x3C;		
	TF0 = 0;		
	TR0 = 1;		
	
	
}
void timer0server() interrupt 1{

	unsigned char tmp2;
	TL0 = 0xB0;		//
	TH0 = 0x3C;		//
	timer0counter++;
	tcounter++;
	ledcounter++;
	if(timer0counter==4){
		scan_keys();
		timer0counter=0;
		tcounter++;
	}
	if(tcounter==10){
			buffer=temp;
			read_time();
			temp=buffer;
			tcounter=0;
	}
		
	if(ledcounter==5){
		ledcounter=0;
		if(isRelay==1){
		enable_latch(4);
		if((led_stat&0x04)==0x04){//1111 1011   0000 0100
			
			led_stat&=0xfb;
		}
		else{
			led_stat|=0x04;
		}
		
		tmp2=P0;
		P0=led_stat;
		enable_latch(0);
		P0=tmp2;
			
		}
	}
	//display_dat();
	
}
void Timer1Init(void)		//50ms@12.000MHz
{
	AUXR &= 0xBF;		
	TMOD &= 0x0F;		
	TMOD |= 0x10;		
	TL1 = 0xB0;		
	TH1 = 0x3C;		
	EA=1;
	ET1=1;
	TF1 = 0;		
	TR1 = 0;		
}
void timer1server() interrupt 3{
	unsigned char tmp;
	
	TL1 = 0xB0;		//??????
	TH1 = 0x3C;		//??????
	timer1counter++;
	if(timer1counter==100){//5s
		clock_flag=1;
		TR1=0;
		enable_latch(4);
		led_stat|=0x01;
		tmp=P0;
		P0=led_stat;
		enable_latch(0);
		P0=tmp;
		if(mod_stat==2){
			write_latch(5,0x00);
			isRelay=0;
		}
	}
}


void relay_temp_ctrl(){
	if(temp>set_temp){
		write_latch(5,0x10);//001 0000
		isRelay=1;
	}
	else{
		isRelay=0;
		write_latch(5,0x00);
	}
}
void main(){
	init_sys();
	set1302();
	Timer0Init();
	Timer1Init();
	while(1){
		read_temp();
		
		if(mod_stat==1){
			relay_temp_ctrl();
		}
		else{
			
		}
		display_dat();
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CAI2256

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

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

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

打赏作者

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

抵扣说明:

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

余额充值