往期回顾
第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
第八届蓝桥杯单片机省赛
第九届蓝桥杯单片机省赛
第十届蓝桥杯单片机省赛
一、前期准备
1:本文使用的头文件是由stc生成
点击保存文件之后,保存至自己文件目录下方即可
2:本文使用的都是官方提供的底层驱动代码
二、代码详情
1.基础代码
蜂鸣器/继电器/led/定时器之类的代码
参考之前写的文章
第四届蓝桥杯代码讲解
2.按键详解
按键写法讲解
直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解
3.驱动的处理
驱动写法讲解
直接跳转以前的文章即可
蓝桥杯驱动处理
4.温度/数码管部分处理
直接跳转以前的文章即可
蓝桥杯温度部分处理
5.总代码
#include<stc15f2k.h>
#include<iic.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,0xc6,0x8c};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,wei=9,key,ms,sign,temp;
int max=30,min=20,t_max=30,t_min=20;
int lock=1,lock_h,lock_l,lock_1;
bit flag,shezhi,yichang;
void buzz()
{
P2=((P2&0x1f)|0xa0);
P0=0x00;
P2&=0x1f;
P2=((P2&0x1f)|0x80);
P0=0xff;
P2&=0x1f;
}
void led(int on)
{
P2=((P2&0x1f)|0x80);
P0=on;
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()
{
if(diswela==wei&&ms>=1000)
{
diswela=diswela+2;
}
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;
}
void display_temp()
{
disdula[0]=12;
disdula[1]=11;
disdula[2]=11;
disdula[3]=11;
disdula[4]=11;
disdula[5]=11;
disdula[6]=temp/10;
disdula[7]=temp%10;
}
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=0x00;
temp=MSB;
temp=(temp<<8)|LSB;
if((temp&0xf800)==0x0000)
{
temp>>=4;
temp=temp+(LSB&0X0F)*0.0625;
}
}
char anjian()
{
static int key_up=1;
int keyscan=0;
if(key_up&(s7==0||s6==0||s5==0||s4==0))
{
delay(20);
key_up=0;
if(s4==0)keyscan=4;
else if(s5==0)keyscan=5;
else if(s6==0)keyscan=6;
else if(s7==0)keyscan=7;
}else if(s4==1&&s5==1&&s6==1&&s7==1)key_up=1;
return keyscan;
}
void display_shezhi()
{
disdula[0]=13;
disdula[1]=11;
disdula[2]=11;
disdula[3]=max/10%10;
disdula[4]=max/1%10;
disdula[5]=11;
disdula[6]=min/10%10;
disdula[7]=min/1%10;
}
void da(int date)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
void shuchu()
{
if(temp>max)da((255/5)*4);
else if(temp>=min&&temp<=max)da((255/5)*3);
else if(temp<min)da((255/5)*2);
}
void main()
{
buzz();
wendu();
din();
while(1)
{
shuchu();
if(shezhi==0)
{
wendu();
display_temp();
}
else if(shezhi==1)
{
display_shezhi();
}
if(flag==1)
{
if(yichang==0)
{
if(temp>max)led(0xfe);
else if(temp>=min||temp<=max)led(0xfd);
else if(temp<min)led(0xfb);
}
else led(0xf7);
flag=0;
key=anjian();
switch(key)
{
case 4:
if(shezhi==0){shezhi=1;wei=6;}
else {shezhi=0;wei=9;}
if(max>=min){yichang=0;t_max=max;t_min=min;}
else if(max<min){yichang=1;max=t_max;min=t_min;}
break;
case 5:
if(wei!=9)
{
if(wei==6)wei=3;
else wei=6;
}
break;
case 6:
if(wei==3)
{
if(max==99)max=99;
else max++;
}
else if(wei==6)
{
if(min==99)min=99;
else min++;
}
break;
case 7:
if(wei==3)
{
if(max==0)max=0;
else max--;
}
else if(wei==6)
{
if(min==0)min=0;
else min--;
}
break;
}
}
}
}
void qa() interrupt 3
{
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
ms++;
if(!(ms%100))flag=1;
if(ms>=1500)ms=0;
display();
}