往期回顾
第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
文章目录
- 往期回顾
- 一、前期准备
- 二、代码详情
- 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;elseP0=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);elsetime[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();elserenwu_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;}
}