往期回顾
第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
文章目录
- 往期回顾
- 一、前期准备
- 二、代码详情
- 1.基础代码
- 蜂鸣器/继电器/led/定时器之类的代码
- 2.按键详解
- 按键写法讲解
- 3.驱动的处理
- 驱动写法讲解
- 4.温度/数码管部分处理
- 5.DS1302部分处理
- 6.总代码
一、前期准备
1:本文使用的头文件是由stc生成
点击保存文件之后,保存至自己文件目录下方即可
2:本文使用的都是官方提供的底层驱动代码
二、代码详情
1.基础代码
蜂鸣器/继电器/led/定时器之类的代码
参考之前写的文章
第四届蓝桥杯代码讲解
2.按键详解
按键写法讲解
直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解
3.驱动的处理
驱动写法讲解
直接跳转以前的文章即可
蓝桥杯驱动处理
4.温度/数码管部分处理
直接跳转以前的文章即可
蓝桥杯温度部分处理
5.DS1302部分处理
DS1302部分详解
6.总代码
#include<stc15f2k.h>
#include<ds1302.h>
#include<onewire.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char ds1302_write[]={0x80,0x82,0x84};
char ds1302_read[]={0x81,0x83,0x85};
char time[]={50,59,23};
char time_1[]={0,0,0};
char clock[]={0,0,0};
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela,key,ms,wei=9,sign,con;
int temp;
bit flag,light,light_1;
void renwu_2();
void buzz(bit on)
{
P2=((P2&0X1F)|0XA0);
if(on)
P0=0X40;
else
P0=0X00;
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;
TR1=1;
ET1=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_ds1302()
{
disdula[0]=time[2]/16;
disdula[1]=time[2]%16;
disdula[2]=10;
disdula[3]=time[1]/16;
disdula[4]=time[1]%16;
disdula[5]=10;
disdula[6]=time[0]/16;
disdula[7]=time[0]%16;
}
void bcddce(bit on)
{
int i;
for(i=0;i<3;i++)
{
if(on)
time_1[i]=((time[i]/10)<<4)|(time[i]%10);
else
time[i]=((time_1[i]/16)*10)+time_1[i]%16;
}
}
void ds_write()
{
int i;
bcddce(1);
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<3;i++)
{
Write_Ds1302_Byte(ds1302_write[i],time_1[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void ds_read()
{
int i;
for(i=0;i<3;i++)
{
time[i]=Read_Ds1302_Byte(ds1302_read[i]);
}
}
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(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*100;
temp=temp+(LSB&0x0f)*6.25;
}
}
void display_18b20()
{
disdula[0]=11;
disdula[1]=11;
disdula[2]=11;
disdula[3]=11;
disdula[4]=11;
disdula[5]=temp/1000%10;
disdula[6]=temp/100%10;
disdula[7]=12;
}
void display_clock()
{
disdula[0]=clock[2]/10;
disdula[1]=clock[2]%10;
disdula[2]=10;
disdula[3]=clock[1]/10;
disdula[4]=clock[1]%10;
disdula[5]=10;
disdula[6]=clock[0]/10;
disdula[7]=clock[0]%10;
}
void jia()
{
if(wei==0)
{
clock[2]++;
if(clock[2]>=24)clock[2]=0;
}
if(wei==3)
{
clock[1]++;
if(clock[1]>=60)clock[1]=0;
}
if(wei==6)
{
clock[0]++;
if(clock[0]>=60)clock[0]=0;
}
}
void jian()
{
if(wei==0)
{
clock[2]--;
if(clock[2]<=-1)clock[2]=23;
}
if(wei==3)
{
clock[1]--;
if(clock[1]<=-1)clock[1]=59;
}
if(wei==6)
{
clock[0]--;
if(clock[0]<=-1)clock[0]=59;
}
while(!s4);
}
void renwu_6()
{
char n=0;
while(1)
{
display_clock();
if(flag==1)
{
flag=0;
key=anjian();
switch(key)
{
case 4:jia();break;
case 5:jian();break;
case 6:
renwu_2();
n++;
break;
}
}
if(n>=4)break;
}
}
char bcdtodce(char on)
{
on=((on/16)*10)+on%16;
return on;
}
void ledrun()
{
if(light_1==1)
led(0xfe);
if(light_1==0)
led(0xff);
if(light==0)
led(0xff);
}
void renwu_1()
{
while(1)
{
wendu();
display_18b20();
if(s4==1)
break;
}
}
void renwu_2()
{
++sign;
if(sign<=1)wei=0;
if(sign==2)wei=3;
if(sign==3)wei=6;
if(sign==4)
{
wei=9;
sign=0;
}
}
void renwu_3()
{
bcddce(0);
if(wei==0)
{
time[2]++;
if(time[2]>=24)time[2]=0;
}
if(wei==3)
{
time[1]++;
if(time[1]>=60)time[1]=0;
}
if(wei==6)
{
time[0]++;
if(time[0]>=60)time[0]=0;
}
ds_write();
}
void renwu_4()
{
bcddce(0);
if(wei==0)
{
time[2]--;
if(time[2]<=-1)time[2]=23;
}
if(wei==3)
{
time[1]--;
if(time[1]<=-1)time[1]=59;
}
if(wei==6)
{
time[0]--;
if(time[0]<=-1)time[0]=59;
}
ds_write();
while(!s4);
}
void main()
{
int i;
din();
buzz(0);
led(0xff);
ds_write();
while(1)
{
for(i=0;i<3;i++)
{
time_1[i]=time[i];
}
if(light==1)ledrun();
display_ds1302();
ds_read();
if(flag==1)
{
flag=0;
key=anjian();
switch(key)
{
case 4:
if(wei==9)
renwu_1();
else
renwu_4();
break;
case 7:renwu_2();break;
case 5:renwu_3();break;
case 6:renwu_6();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();
if(bcdtodce(time[2])==clock[2]&&bcdtodce(time[1])==clock[1]&&bcdtodce(time[0])==clock[0])
light=1;
if(light==1)
con++;
if(con>=5000)
{
con=0;
light=0;
led(0xff);
}
if(!(con%200))
{
if(light_1==0)light_1=1;
else light_1=0;
}
}