第六届蓝桥杯单片机省赛程序-------““温度记录器””

往期回顾

第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛


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

一、前期准备

1:本文使用的头文件是由stc生成
在这里插入图片描述
点击保存文件之后,保存至自己文件目录下方即可
在这里插入图片描述
2:本文使用的都是官方提供的底层驱动代码
在这里插入图片描述

二、代码详情

1.基础代码

蜂鸣器/继电器/led/定时器之类的代码

参考之前写的文章
第四届蓝桥杯代码讲解

2.按键详解

按键写法讲解

直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解

3.驱动的处理

驱动写法讲解

直接跳转以前的文章即可
蓝桥杯驱动处理

4.温度/数码管部分处理

直接跳转以前的文章即可
蓝桥杯温度部分处理

5.总代码

#include<ds1302.h>
#include<onewire.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char disdula[]={0,0,0,0,0,0,0,0};
char ds102_write[]={0x80,0x82,0x84};
char ds102_read[]={0x81,0x83,0x85};
char time[]={50,59,23};
char time_1[]={0,0,0};
char caiji[]={0,0,0,0,0,0,0,0,0,0,0,0};
int diswela,ms,sign,temp,key,wei=2,a,ms_1000;

int ji_ms=1,temp_ms=0;
int a_1s;

bit flag,stop,ON,ON_1;

void buzz()
{
	P2=((P2&0X1F)|0XA0);
	P0=0X00;
	P2&=0X1F;
	
	P2=((P2&0X1F)|0X80);
	P0=0XFF;
	P2&=0X1F;
}

void led(int i)
{
	P2=((P2&0X1F)|0X80);
	P0=i;
	P2&=0X1F;
}

void delay(int x)
{
	int i;
	while(x--)
		for(i=0;i<5*123;i++);
}

void din()
{
	TMOD=0X10;
	TH1=(65536-11059/12)/256;
	TL1=(65536-11059/12)%256;
	EA=1;
	ET1=1;
	TR1=1;
}

void display()
{
	P2=((P2&0X1F)|0Xe0);
	P0=0XFF;
	P2&=0X1F;

	P2=((P2&0X1F)|0Xc0);
	P0=1<<diswela;
	P2&=0X1F;

	P2=((P2&0X1F)|0Xe0);
	P0=dula[disdula[diswela]];
	P2&=0X1F;

	if(++diswela>=8)diswela=0;
}

char anjian()
{
	int keyscan=0;
	if(s4==0||s5==0||s6==0||s7==0)
	{
		delay(10);
		if(s4==0)keyscan=4;
		else if(s5==0)keyscan=5;
		else if(s6==0)keyscan=6;
		else if(s7==0)keyscan=7;
	}while(s4==0||s5==0||s6==0||s7==0);
	return keyscan;
}

void wendu()
{
	int LSB,MSB;
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(100);
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	Init_DS18B20();
	temp=MSB;
	temp=(temp<<8)|LSB;
	if((temp&0xf800)==0x0000)
	{
		temp>>=4;
		temp=temp+(LSB&0x0f)*0.0625;
	}
}

void bcddce(bit on)
{
	int i;
	for(i=0;i<3;i++)
	{
		if(on)
			time[i]=((time[i]/10)<<4)|(time[i]%10);
		else 
			time[i]=((time[i]/16)*10)+(time[i]%16);
	}
}

void ds_write()
{
	int i;
	bcddce(1);
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<3;i++)
	{
		Write_Ds1302_Byte(ds102_write[i],time[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void ds_read()
{
	int i;	
	for(i=0;i<3;i++)
	{
		time[i]=Read_Ds1302_Byte(ds102_read[i]);
	}	
}

void display_ds1302()
{
	disdula[0]=time[2]/16;
	disdula[1]=time[2]%16;
	if(wei==2)disdula[2]=10;
	if(wei==4)disdula[2]=11;
	disdula[3]=time[1]/16;
	disdula[4]=time[1]%16;
	if(wei==2)disdula[5]=10;
	if(wei==4)disdula[5]=11;
	disdula[6]=time[0]/16;
	disdula[7]=time[0]%16;
}





void renwu_1()
{
	if(stop==0)
	{
	++sign;
	if(sign==0)ji_ms=1;
	if(sign==1)ji_ms=5;
	if(sign==2)ji_ms=30;
	if(sign==3)ji_ms=60;
	if(sign>=4){sign=0;ji_ms=1;}
	}
}

void display_ji()
{
	disdula[0]=11;
	disdula[1]=11;
	disdula[2]=11;
	disdula[3]=11;
	disdula[4]=11;
	disdula[5]=10;
	disdula[6]=ji_ms/10;
	disdula[7]=ji_ms%10;
}



void pick_temp()
{
	int pick=0;
	static int i=0;
	pick=sign;
	if(pick==0|pick>=4)
	{
		if(a>=1100)
		{
			a=0;
			a_1s++;
			wendu();
		caiji[i]=temp;
		   i++;
		if(i>=10)i=0;
		}
		if(a_1s>=10){stop=0;a_1s=0;}
	}
	if(pick==1)
	{
		if(a>=1000*5)
		{
			a=0;
			a_1s++;
			wendu();
		caiji[i]=temp;
		   i++;
		if(i>=10)i=0;
		}
		if(a_1s>=10){stop=0;a_1s=0;}
	}
	if(pick==2)
	{
		if(a>=1000*30)
		{
			a=0;
			a_1s++;
			wendu();
		caiji[i]=temp;
		   i++;
		if(i>=10)i=0;
		}
		if(a_1s>=10){stop=0;a_1s=0;}
	}
	if(pick==3)
	{
		if(a>=1000*60)
		{
			a=0;
			a_1s++;
			wendu();
		caiji[i]=temp;
		   i++;
		if(i>=10)i=0;
		}
		if(a_1s>=10){stop=0;a_1s=0;}
	}
	
}
		
void display_pick_temp()
{
	disdula[0]=10;
	disdula[1]=temp_ms/10;
	disdula[2]=temp_ms%10;
	disdula[3]=11;
	disdula[4]=11;
	disdula[5]=10;
	disdula[6]=caiji[temp_ms]/10;
	disdula[7]=caiji[temp_ms]%10;
}

void chongqi()
{
	bcddce(0);
	time[2]=23;
	time[1]=59;
	time[0]=50;
	ds_write();
	temp_ms=0;
}

void main()
{
	din();
	buzz();
	wendu();	
	while(1)
	{
		if(stop==0&ON==0)
		display_ji();
		
		if(stop==1)
		{
			if(ON==0)
			{ds_write();chongqi();
			ON=1;}
			pick_temp();
			ds_read();
			display_ds1302();
			
		}
		
		if(stop==0&ON==1&ON_1==0)
		{
			led(0xfe);
			display_pick_temp();		
		}
		
		if(stop==0&ON==1&ON_1==1)
		{
			led(0xff);
			display_pick_temp();
			if(a>=1000)
			{
				a=0;
				temp_ms++;
				if(temp_ms>=9)temp_ms=9;
			}
		}
		
		
		
		if(flag==1)
		{
			flag=0;
			key=anjian();
			switch(key)
			{
				case 4:
					renwu_1();
				
				break;
				
				
				
				
				case 5:
					if(stop==0)
				stop=1;
				
				
				break;
				
				
				case 6:
				if(ON_1==0)
				ON_1=1;	
				break;
				case 7:
					if(stop==0&ON==1&ON_1==1)
					{
					ON_1=0;
					stop=0;
					ON=0;
						}
				break;
			}
		}
	}
}

void qa() interrupt 3
{
	TH1=(65536-11059/12)/256;
	TL1=(65536-11059/12)%256;
	ms++;a++;ms_1000++;
	if(!(ms%100))flag=1;
	if(ms==1500)ms=0;
	if(ms_1000==1000)
		{
			ms_1000=0;
	if(wei==2)wei=4;
	else wei=2;
		}
	display();
}

	









  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值