第十三届蓝桥杯单片机省赛程序设计题及代码参考

第十三届蓝桥杯单片机省赛程序设计题及代码参考

题目

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

代码(不包含驱动)

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "iic.h"
#include "onewire.h"
#include "ds1302.h"

sbit R3 = P3^2;
sbit R4 = P3^3;
sbit L3 = P3^5;
sbit L4 = P3^4;

code unsigned char noSeg_Table[] ={
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
code unsigned char yesSeg_Table[] ={
	0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e
};

unsigned char write_add[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char read_add[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char time[]={0x00,0x00,0x12,0x01,0x01,0x01,0x24};

//ds18b20温度采集变量
unsigned char LSB,MSB;
float ch_temp=0.0;
unsigned int temp;

//数码管显示变量
unsigned int smg_mode1=0;
unsigned int smg_mode3=23;

//led和继电器状态保存
unsigned char led_state=0xff;
unsigned char jdq_state=0x00;

//定时器记录标志
unsigned char mode_5s=1;
unsigned char mode_100ms=1;
unsigned int count_5s=0;
unsigned int count_100ms=0;

//按键模式切换
unsigned char mode_S12=1;
unsigned char mode_S17=1;
unsigned char mode_S13=1;

//============锁存器选择===========
void HC138(unsigned char n,unsigned char dat)
{
	P0 = dat;
	switch(n)
	{
		case 4:
			P2 = (P2 & 0X1F) | 0X80;
		break;
		case 5:
			P2 = (P2 & 0X1F) | 0Xa0;
		break;
		case 6:
			P2 = (P2 & 0X1F) | 0Xc0;
		break;
		case 7:
			P2 = (P2 & 0X1F) | 0Xe0;
		break;
	}
	P2 = (P2 & 0X1F) | 0X00;
}

//============延时函数===========
void Delay(unsigned int t)
{
	while(t--);
}

//============DS18B20===========
void useds18b20()
{
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay(500);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	LSB = Read_DS18B20();
	MSB = Read_DS18B20();
	init_ds18b20();
	
	temp = (MSB << 8)| LSB;
	
	if((temp & 0xf800) == 0x0000 )
	{
		ch_temp = temp*0.0625;
	}
	smg_mode1 = ch_temp*10;
}

//============DS1302===========
void writed1302()
{
	unsigned char i;
	Write_Ds1302_Byte( 0x8e,0x00 );
	for(i=0;i<7;i++)
	{
		Write_Ds1302_Byte( write_add[i],time[i] );
	}
	Write_Ds1302_Byte( 0x8e,0x80 );
}
void readds1302()
{
	unsigned char i;
	for(i=0;i<7;i++)
	{
		time[i] = Read_Ds1302_Byte( read_add[i] );
	}
}
//============数码管选择===========
void Displaysmg(unsigned char n,unsigned char dat) //单个数码管
{
	HC138(6,0x01 << n);
	HC138(7,dat);
	Delay(300);
	HC138(6,0x01 << n);
	HC138(7,0xff);
}

void allDisplaysmg()
{
	HC138(6,0x00);
	HC138(7,0xff);
	Delay(200);
}

void showsmg()
{
	Displaysmg(0,0xc1);
	Displaysmg(1,noSeg_Table[mode_S12]);
	switch(mode_S12)
	{
		case 1:
			Displaysmg(5,noSeg_Table[((smg_mode1)/100)%10]);
			Displaysmg(6,yesSeg_Table[((smg_mode1)/10)%10]);
			Displaysmg(7,noSeg_Table[((smg_mode1)/1)%10]);
			allDisplaysmg();
		break;
		case 2:
			if(mode_S17 ==1 )
			{
				Displaysmg(3,noSeg_Table[time[2]/16]);
				Displaysmg(4,noSeg_Table[time[2]%16]);
				Displaysmg(5,0xbf);
				Displaysmg(6,noSeg_Table[time[1]/16]);
				Displaysmg(7,noSeg_Table[time[1]%16]);
				allDisplaysmg();
			}
			else
			{
				Displaysmg(3,noSeg_Table[time[1]/16]);
				Displaysmg(4,noSeg_Table[time[1]%16]);
				Displaysmg(5,0xbf);
				Displaysmg(6,noSeg_Table[time[0]/16]);
				Displaysmg(7,noSeg_Table[time[0]%16]);
				allDisplaysmg();
			}
		break;
		case 3:
			Displaysmg(6,noSeg_Table[((smg_mode3)/10)%10]);
			Displaysmg(7,noSeg_Table[((smg_mode3)/1)%10]);
			allDisplaysmg();
		break;
	}
}
//============KBD按键===========
void keys()
{
	//S13
	R3 = 0;
	R4 = L3 = L4 =1;
	if(L3 == 0)
	{
		Delay(100);
		while(L3 == 0)
		{
			showsmg();
		}
		mode_S13++;
		if(mode_S13 == 3) mode_S13 = 1;
	}
	
	//S17
	R3 = 0;
	R4 = L3 = L4 =1;
	if((L4 == 0) && (mode_S12 == 3))
	{
		Delay(100);
		while((L4 == 0) && (mode_S12 == 3))
		{
			showsmg();
		}
		smg_mode3--;
	}
	if((L4 == 0) && (mode_S12 == 2))
	{
		Delay(100);
		while((L4 == 0) && (mode_S12 == 2))
		{
			mode_S17++;
			showsmg();
		}
		mode_S17=1;
	}
	
	//S12
	R4 = 0;
	R3 = L3 = L4 =1;
	if(L3 == 0)
	{
		Delay(100);
		while(L3 == 0)
		{
			showsmg();
		}
		mode_S12++;
		if(mode_S12 == 4) mode_S12=1;
	}
	
	//S16
	R4 = 0;
	R3 = L3 = L4 =1;
	if((L4 == 0) && (mode_S12 == 3))
	{
		Delay(200);
		while((L4 == 0) && (mode_S12 == 3))
		{
			showsmg();
		}
		smg_mode3++;
	}
}

//============定时器===========
void InitTimer0()
{
	TMOD = 0X01;
	TH0 = (65536 - 50000) / 256;
	TL0 = (65536 - 50000) % 256;
	
	TR0 = 1;
	ET0 = 1;
	EA = 1;
}
void ServiceTimer0() interrupt 1
{
	TH0 = (65536 - 50000) / 256;
	TL0 = (65536 - 50000) % 256;
	
	readds1302(); //刷新时间读取

	//led和继电器选择显示
	if((time[1]==0) && (time[0] == 0))
	{
		led_state = led_state & 0xfe;
		mode_5s = 2;
		if(mode_S13 == 2)
		{
			jdq_state = 0x10;
		}
	}
	if(mode_5s == 2)
	{
		count_5s++;
		if(count_5s == 100)
		{
			count_5s = 0;
			mode_5s = 1;
			led_state = led_state | 0x01;
			if(mode_S13 == 2)
			{
				jdq_state = 0x00;
			}
		}
	}
	
	if(mode_S13 == 1)
	{
		led_state = led_state & 0xfd;
	}
	else
	{
		led_state = led_state | 0x02;
	}
	
	if(mode_S13 == 1)
	{
		if(smg_mode1 > smg_mode3*10)
		{
			jdq_state = 0x10;
		}
		else
		{
			jdq_state = 0x00;
		}
	}
	
	if(jdq_state == 0x10)
	{
		count_100ms++;
		led_state = led_state & 0xfb;
		if(count_100ms == 3)
		{
			count_100ms = 0;
			led_state = led_state | 0x04;
		}
	}
	else
	{
		led_state = led_state | 0x04;
	}
	HC138(4,led_state);
	HC138(5,jdq_state);
}

//============初始化函数===========
void Initsystem()
{
	HC138(4,0XFF);
	HC138(5,0X00);
	HC138(6,0X00);
	HC138(7,0XFF);
}

//============主函数===========
void main()
{
	Initsystem();
	InitTimer0();
	writed1302();
	while(1)
	{
		useds18b20();
		showsmg();
		keys();
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值