碎碎念:这一届可真难啊...,模块用的多逻辑还复杂
一.题目要求
二.代码实现
这一届换了新的驱动代码,为节省篇幅,驱动代码就不在这篇文章里给了,详情可参考这篇文章。
蓝桥杯学习笔记 单片机CT107D 新驱动代码的使用._蓝桥杯单片机给的底层驱动怎么使用-CSDN博客 main.c
#include <STC15F2K60S2.H>
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
sbit C1=P4^4;
sbit C2=P4^2;
sbit R1=P3^2;
sbit R2=P3^3;
code unsigned char SMG_Nodot[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
code unsigned char SMG_Dot[] =
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char hour,min,sec;
unsigned char SMG_Mode=1;
unsigned char SMG_Mode_temp;
unsigned char huixian_Mode=1;
unsigned char T_smg;
float T;
unsigned char T_max;
unsigned int T_sum;
unsigned int T_aver;
unsigned char T_smg;
unsigned char T_pre;
bit shidu_Flag=1;
unsigned char shidu;
unsigned char shidu_pre;
unsigned char shidu_max;
unsigned int shidu_aver;
unsigned int shidu_sum;
unsigned char Chufa_times;
unsigned char T_param=30;
unsigned char DAC_Value;
unsigned char DAC_Value_temp;
bit Chufa_Flag;
unsigned int count_times;
unsigned int count_f;
unsigned int dat_f;
unsigned int fre_times;
bit Key_Flag=0;
unsigned char Key_times;
unsigned char LED_Mode=0xff;
bit alarm_Flag;
bit Flash_Flag;
unsigned char Flash_times;
void Delay_SMG(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
P0=dat;
switch(channel)
{
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;
case 0:
P2=(P2&0x1f)|0x00;
break;
}
P2=(P2&0x1f)|0x00;
}
void SMG_Display(unsigned char pos,unsigned char dat)
{
SelectHC573(6,0x01<<(pos-1));
SelectHC573(7,dat);
Delay_SMG(500);
SelectHC573(6,0x01<<(pos-1));
SelectHC573(7,0xff);
}
void Display_Dynamic()
{
if(SMG_Mode==1)
{
SMG_Display(1,SMG_Nodot[hour/16]);
SMG_Display(2,SMG_Nodot[hour%16]);
SMG_Display(3,0xbf);
SMG_Display(4,SMG_Nodot[min/16]);
SMG_Display(5,SMG_Nodot[min%16]);
SMG_Display(6,0xbf);
SMG_Display(7,SMG_Nodot[sec/16]);
SMG_Display(8,SMG_Nodot[sec%16]);
}
if(SMG_Mode==2&&huixian_Mode==1)
{
SMG_Display(1,SMG_Nodot[12]);
SMG_Display(3,SMG_Nodot[T_max/10]);
SMG_Display(4,SMG_Nodot[T_max%10]);
SMG_Display(5,0xbf);
SMG_Display(6,SMG_Nodot[T_aver/100]);
SMG_Display(7,SMG_Dot[T_aver%100/10]);
SMG_Display(8,SMG_Nodot[T_aver%10]);
}
if(SMG_Mode==2&&huixian_Mode==2)
{
SMG_Display(1,0x89);
SMG_Display(3,SMG_Nodot[shidu_max/10]);
SMG_Display(4,SMG_Nodot[shidu_max%10]);
SMG_Display(5,0xbf);
SMG_Display(6,SMG_Nodot[shidu_aver/100]);
SMG_Display(7,SMG_Dot[shidu_aver%100/10]);
SMG_Display(8,SMG_Nodot[shidu_aver%10]);
}
if(SMG_Mode==2&&huixian_Mode==3)
{
SMG_Display(1,SMG_Nodot[15]);
SMG_Display(2,SMG_Nodot[Chufa_times/10]);
SMG_Display(3,SMG_Nodot[Chufa_times%10]);
SMG_Display(4,SMG_Nodot[hour/16]);
SMG_Display(5,SMG_Nodot[hour%16]);
SMG_Display(6,0xbf);
SMG_Display(7,SMG_Nodot[min/16]);
SMG_Display(8,SMG_Nodot[min%16]);
}
if(SMG_Mode==3)
{
SMG_Display(1,0x8c);
SMG_Display(7,SMG_Nodot[T_param/10]);
SMG_Display(8,SMG_Nodot[T_param%10]);
}
if(SMG_Mode==4)
{
SMG_Display(1,SMG_Nodot[14]);
SMG_Display(4,SMG_Nodot[T_smg/10]);
SMG_Display(5,SMG_Nodot[T_smg%10]);
SMG_Display(6,0xbf);
if(shidu_Flag==1)
{
SMG_Display(7,SMG_Nodot[shidu/10]);
SMG_Display(8,SMG_Nodot[shidu%10]);
}
if(shidu_Flag==0)
{
SMG_Display(7,SMG_Nodot[10]);
SMG_Display(8,SMG_Nodot[10]);
}
}
}
void Timer1Init(void) //10??@12.000MHz
{
AUXR &= 0xBF; //?????12T??
TMOD = 0x06; //???????
TL1 = 0xF0; //??????
TH1 = 0xD8; //??????
TF1 = 0; //??TF1??
TR1 = 1; //???1????
EA=1;
ET1=1;
}
void Timer0Init()
{
TH0=0xff;
TL0=0xff;
TR0=1;
ET0=1;
}
void Timer1_Service() interrupt 3
{
fre_times++;
if(fre_times==100)
{
dat_f=count_f;
count_f=0;
fre_times=0;
}
if(Chufa_Flag==1)
{
count_times++;
if(count_times==300)
{
Chufa_Flag=0;
SMG_Mode=SMG_Mode_temp;
count_times=0;
}
}
if(Key_Flag==1)
{
Key_times++;
}
if(alarm_Flag==1)
{
Flash_times++;
if(Flash_times==10)
{
Flash_times=0;
Flash_Flag=~Flash_Flag;
if(Flash_Flag==1)
{
LED_Mode&=0xf7;
SelectHC573(4,LED_Mode);
}
if(Flash_Flag==0)
{
LED_Mode|=0x08;
SelectHC573(4,LED_Mode);
}
}
}
}
void Timer0_service() interrupt 1
{
count_f++;
}
void DS1302_Config()
{
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x84,0x13);
Write_Ds1302_Byte(0x82,0x02);
Write_Ds1302_Byte(0x80,0x05);
Write_Ds1302_Byte(0x8e,0x80);
}
void DS1302_Read()
{
hour=Read_Ds1302_Byte(0x85);
min=Read_Ds1302_Byte(0x83);
sec=Read_Ds1302_Byte(0x81);
}
void ADC_Read()
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x01);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
DAC_Value=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
}
void DS18B20_Read_temp()
{
unsigned char MSB,LSB;
unsigned int temp;
init_ds18b20();
Display_Dynamic();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Display_Dynamic();
init_ds18b20();
Display_Dynamic();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
Display_Dynamic();
temp=MSB<<8|LSB;
T=temp*0.0625;
T_smg=T;
}
void shidu_Caculate()
{
float k;
k=80.0/1800.0;
if(dat_f<200||dat_f>2000)
{
shidu_Flag=0;
}
if(dat_f>=200&&dat_f<=2000)
{
shidu=k*(dat_f-200)+10;
shidu_Flag=1;
}
}
void Chufa_control()
{
SMG_Mode_temp=SMG_Mode;
ADC_Read();
if(DAC_Value<80&&DAC_Value_temp>80)
{
Chufa_Flag=1;
SMG_Mode=4;
if(shidu_Flag==1)
{
Chufa_times++;
T_sum+=T_smg*10;
shidu_sum+=shidu*10;
T_aver=T_sum/Chufa_times;
shidu_aver=shidu_sum/Chufa_times;
if(T_smg>T_max)
{
T_max=T_smg;
}
if(shidu>shidu_max)
{
shidu_max=shidu;
}
if(T_smg>T_param)
{
alarm_Flag=1;
}
if(T_smg<T_param)
{
alarm_Flag=0;
LED_Mode|=0x08;
SelectHC573(4,LED_Mode);
}
if(shidu>shidu_pre&&T_smg>T_pre&&Chufa_times>=2)
{
LED_Mode&=0xdf;
SelectHC573(4,LED_Mode);
}
if(shidu<shidu_pre||T_smg<T_pre)
{
LED_Mode|=0x20;
SelectHC573(4,LED_Mode);
}
shidu_pre=shidu;
T_pre=T_smg;
}
if(shidu_Flag==0)
{
LED_Mode&=0xef;
SelectHC573(4,LED_Mode);
}
if(shidu_Flag==1)
{
LED_Mode|=0x10;
SelectHC573(4,LED_Mode);
}
while(Chufa_Flag==1)
{
Display_Dynamic();
}
}
DAC_Value_temp=DAC_Value;
}
void Scan_Key()
{
C1=0;C2=1;
R1=R2=1;
if(R1==0)
{
Delay_SMG(500);
if(R1==0)
{
if(SMG_Mode==2)
{
switch(huixian_Mode)
{
case 1:
huixian_Mode=2;
break;
case 2:
huixian_Mode=3;
break;
case 3:
huixian_Mode=1;
break;
}
}
}
while(R1==0)
{
Display_Dynamic();
}
}
if(R2==0)
{
Delay_SMG(500);
if(R2==0)
{
switch(SMG_Mode)
{
case 1:
SMG_Mode=2;
huixian_Mode=1;
break;
case 2:
SMG_Mode=3;
break;
case 3:
SMG_Mode=1;
break;
}
}
while(R2==0)
{
Display_Dynamic();
}
}
C1=1;C2=0;
R1=R2=1;
if(R1==0)
{
Delay_SMG(500);
if(R1==0)
{
if(SMG_Mode==3)
{
if(T_param>0)
{
T_param--;
}
}
if(SMG_Mode==1)
{
Key_Flag=1;
while(R1==0)
{
Display_Dynamic();
DS1302_Read();
}
Key_Flag=0;
if(Key_times>200)
{
Chufa_times=0;
T_sum=0;
shidu_sum=0;
T_aver=0;
shidu_aver=0;
Key_times=0;
T_max=0;
shidu_max=0;
}
if(Key_times<=200)
{
Key_times=0;
}
}
}
while(R1==0)
{
Display_Dynamic();
DS1302_Read();
}
}
if(R2==0)
{
Delay_SMG(500);
if(R2==0)
{
if(SMG_Mode==3)
{
if(T_param<99)
{
T_param++;
}
}
}
while(R2==0)
{
Display_Dynamic();
DS1302_Read();
}
}
}
void LED_Control()
{
if(SMG_Mode==1)
{
LED_Mode=(LED_Mode|0x07)&0xfe;
SelectHC573(4,LED_Mode);
}
if(SMG_Mode==2)
{
LED_Mode=(LED_Mode|0x07)&0xfd;
SelectHC573(4,LED_Mode);
}
if(SMG_Mode==3)
{
LED_Mode=(LED_Mode|0x07)&0xfb;
SelectHC573(4,LED_Mode);
}
}
void Sys_Init()
{
SelectHC573(4,0xff);
SelectHC573(5,0x00);
Timer0Init();
Timer1Init();
DS1302_Config();
}
void main()
{
Sys_Init();
while(1)
{
Display_Dynamic();
Chufa_control();
DS1302_Read();
DS18B20_Read_temp();
shidu_Caculate();
LED_Control();
Scan_Key();
}
}