51_LanQiaoBei/题目/真题/13 第十三届国赛_左岚/第十三届国赛/User/main.c

384 lines
7.3 KiB
C
Raw Permalink Normal View History

2025-04-13 01:02:19 +08:00
#include "main.h"
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uchar Key_Slow_Down; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Seg_Pos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
uint Seg_Slow_Down; // <20><><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // Led<65><64>ʾ<EFBFBD><CABE><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Seg_show_mode; // <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><30><C6B5><31><CAAA> 2<><32><EFBFBD><EFBFBD> 3<><33><EFBFBD><EFBFBD>
uchar celi_mode; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><30><C6B5><31><CAAA> 2<><32><EFBFBD><EFBFBD>
/*ʱ<><CAB1>*/
uint time_1s;
uint time_up_1s;
uchar time_100ms;
uchar pwn_count;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
uint freq;
uchar humidity;
uchar distance;
uint freq_demo = 9000;
uint humidity_demo = 40;
uint dis_demo = 60;
bit dis_flag; // 0Ϊcm<63><6D>1Ϊm
bit freq_flag; // 0ΪHz<48><7A>1ΪkHz
bit reset_relay_flag;
uchar relay_count;
bit light_flag;
void init_Seg_LED() // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD>LED
{
uchar i;
for (i = 0; i < 8; i++)
{
ucLed[i] = 0;
Seg_Buf[i] = 10;
Seg_Point[i] = 0;
}
}
/* <20><><EFBFBD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Key_Proc()
{
static uchar Key_Val, Key_Down, Key_Old, Key_Up; // <20><><EFBFBD><EFBFBD>ר<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
if (Key_Slow_Down)
return;
Key_Slow_Down = 1; // <20><><EFBFBD>̼<EFBFBD><CCBC>ٳ<EFBFBD><D9B3><EFBFBD>
Key_Val = Key_Read(); // ʵʱ<CAB5><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֵ
Key_Down = Key_Val & (Key_Old ^ Key_Val); // <20><>׽<EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
Key_Up = ~Key_Val & (Key_Old ^ Key_Val); // <20><>׽<EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD>
Key_Old = Key_Val; // <20><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (Key_Down == 4)
{
Seg_show_mode = (++Seg_show_mode) % 4;
celi_mode = 0;
init_Seg_LED();
}
if (Seg_show_mode == 3 && Key_Down == 5)
{
celi_mode = (++celi_mode) % 3;
init_Seg_LED();
}
if (Key_Down == 6)
{
switch (Seg_show_mode)
{
case 2:
dis_flag ^= 1;
Seg_Point[5] = 0;
break;
case 3:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
switch (celi_mode)
{
case 0:
/* Ƶ<>ʲ<EFBFBD><CAB2><EFBFBD> */
freq_demo = (freq_demo + 500 > 12000) ? 1000 : freq_demo + 500;
break;
case 1:
/*ʪ<>Ȳ<EFBFBD><C8B2><EFBFBD>*/
humidity_demo = (humidity_demo + 10 > 60) ? 10 : humidity_demo + 10;
break;
case 2:
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
dis_demo = (dis_demo + 10 > 120) ? 10 : dis_demo + 10;
break;
}
break;
}
}
if (Key_Down == 7)
{
switch (Seg_show_mode)
{
case 0:
/* Ƶ<><C6B5><EFBFBD><EFBFBD>ʾ */
freq_flag ^= 1;
Seg_Point[6] = 0;
break;
case 3:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
switch (celi_mode)
{
case 0:
/* Ƶ<>ʲ<EFBFBD><CAB2><EFBFBD> */
freq_demo = (freq_demo - 500 < 1000) ? 12000 : freq_demo - 500;
break;
case 1:
/*ʪ<>Ȳ<EFBFBD><C8B2><EFBFBD>*/
humidity_demo = (humidity_demo - 10 < 10) ? 60 : humidity_demo - 10;
break;
case 2:
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
dis_demo = (dis_demo - 10 < 10) ? 120 : dis_demo - 10;
break;
}
break;
}
}
if (Key_Down == 7 && Seg_show_mode == 1)
reset_relay_flag = 1; // <20><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC>ʱ
else
reset_relay_flag = 0;
// ̧<><CCA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (Key_Up == 7 && time_up_1s >= 1000)
reset_relay_flag = 0;
}
/* <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Seg_Proc()
{
uchar temp_freq, i, temp_dis;
if (Seg_Slow_Down)
return;
Seg_Slow_Down = 1; // <20><><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC>ٳ<EFBFBD><D9B3><EFBFBD>
humidity = Ad_Read(0x03) / 51.0 * 20;
/*ʪ<>ȴ<EFBFBD><C8B4><EFBFBD>*/
if (humidity > 80)
Da_Write(255);
else if (humidity < humidity_demo)
Da_Write(51);
else
Da_Write(255 - 204 * (80 - humidity) / (80 - humidity_demo));
/*<2A><><EFBFBD><EFBFBD><E0B4A6>*/
distance = Ut_Wave_Data();
if (distance > dis_demo)
{
Relay(1);
relay_count++;
EEPROM_Write(&relay_count, 0, 1);
}
else
{
Relay(0);
}
switch (Seg_show_mode)
{
case 0:
/* Ƶ<><C6B5><EFBFBD><EFBFBD>ʾ */
Seg_Buf[0] = 11; // F
// KHz
if (freq_flag)
{
temp_freq = freq / 100;
Seg_Buf[3] = temp_freq / 10000 % 10;
Seg_Buf[4] = temp_freq / 1000 % 10;
Seg_Buf[5] = temp_freq / 100 % 10;
Seg_Buf[6] = temp_freq / 10 % 10;
Seg_Buf[7] = temp_freq % 10;
Seg_Point[6] = 1;
for (i = 3; i < 6; i++)
{
if (Seg_Buf[i] == 0)
Seg_Buf[i] = 10;
else
break;
}
}
// Hz
else
{
Seg_Buf[3] = freq / 10000 % 10;
Seg_Buf[4] = freq / 1000 % 10;
Seg_Buf[5] = freq / 100 % 10;
Seg_Buf[6] = freq / 10 % 10;
Seg_Buf[7] = freq % 10;
for (i = 3; i < 7; i++)
{
if (Seg_Buf[i] == 0)
Seg_Buf[i] = 10;
else
break;
}
}
break;
case 1:
/*ʪ<><CAAA><EFBFBD><EFBFBD>ʾ*/
Seg_Buf[0] = 12; // H
Seg_Buf[6] = humidity / 10 % 10;
Seg_Buf[7] = humidity % 10;
break;
case 2:
/*<2A><><EFBFBD><EFBFBD>*/
Seg_Buf[0] = 13; // A
if (dis_flag)
{
Seg_Buf[5] = distance / 100;
Seg_Buf[6] = distance / 10 % 10;
Seg_Buf[7] = distance % 10;
Seg_Point[5] = 1;
}
else
{
Seg_Buf[5] = (distance / 100 == 0) ? 10 : distance / 100;
Seg_Buf[6] = distance / 10 % 10;
Seg_Buf[7] = distance % 10;
}
break;
case 3:
/*<2A><><EFBFBD><EFBFBD>*/
Seg_Buf[0] = 14; // P
Seg_Buf[1] = celi_mode + 1;
switch (celi_mode)
{
case 0:
/* Ƶ<><C6B5> */
temp_freq = freq_demo / 100;
Seg_Buf[5] = (temp_freq / 100 == 0) ? 10 : temp_freq / 100;
Seg_Buf[6] = temp_freq / 10 % 10;
Seg_Buf[7] = temp_freq % 10;
Seg_Point[6] = 1;
break;
case 1:
/* ʪ<><CAAA> */
Seg_Buf[6] = humidity_demo / 10;
Seg_Buf[7] = humidity_demo % 10;
break;
case 2:
/* <20><><EFBFBD><EFBFBD> */
temp_dis = dis_demo / 10;
Seg_Buf[6] = temp_dis / 10;
Seg_Buf[7] = temp_dis % 10;
Seg_Point[6] = 1;
break;
}
break;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> */
void Led_Proc()
{
switch (Seg_show_mode)
{
case 0:
ucLed[0] = 1;
break;
case 1:
ucLed[1] = 1;
break;
case 2:
ucLed[2] = 1;
break;
case 3:
ucLed[0] = (celi_mode == 0) ? light_flag : 0;
ucLed[1] = (celi_mode == 1) ? light_flag : 0;
ucLed[2] = (celi_mode == 2) ? light_flag : 0;
break;
}
ucLed[3] = (freq > freq_demo);
ucLed[4] = (humidity > humidity_demo);
ucLed[5] = (distance > dis_demo);
}
/* <20><>ʱ<EFBFBD><CAB1>0<EFBFBD>жϳ<D0B6>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Timer0Init(void) // 1<><31><EFBFBD><EFBFBD>@12.000MHz
{
AUXR &= 0x7F; // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>12Tģʽ
TMOD &= 0xF0; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ģʽ
TMOD |= 0x05; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>0Ϊ16λ<36><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TL0 = 0; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
TH0 = 0; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
TF0 = 0; // <20><><EFBFBD><EFBFBD>TF0<46><30>־
TR0 = 1; // <20><>ʱ<EFBFBD><CAB1>0<EFBFBD><30>ʼ<EFBFBD><CABC>ʱ
}
void Timer2_Init(void) // 1<><31><EFBFBD><EFBFBD>@12.000MHz
{
AUXR &= 0xFB; // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>12Tģʽ
T2L = 0x18; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
T2H = 0xFC; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
AUXR |= 0x10; // <20><>ʱ<EFBFBD><CAB1>2<EFBFBD><32>ʼ<EFBFBD><CABC>ʱ
IE2 |= 0x04; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>2<EFBFBD>ж<EFBFBD>
EA = 1; // <20><><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
}
void Timer3_Init(void) // 100΢<30><CEA2>@12.000MHz
{
T4T3M &= 0xFD; // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>12Tģʽ
T3L = 0x9C; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
T3H = 0xFF; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
T4T3M |= 0x08; // <20><>ʱ<EFBFBD><CAB1>3<EFBFBD><33>ʼ<EFBFBD><CABC>ʱ
IE2 |= 0x20; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD>ж<EFBFBD>
EA = 1; // <20><><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
}
/* <20><>ʱ<EFBFBD><CAB1>2<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Timer2Server() interrupt 12
{
if (++Key_Slow_Down == 10)
Key_Slow_Down = 0; // <20><><EFBFBD>̼<EFBFBD><CCBC><EFBFBD>ר<EFBFBD><D7A8>
if (++Seg_Slow_Down == 500)
Seg_Slow_Down = 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD>ר<EFBFBD><D7A8>
if (++Seg_Pos == 8)
Seg_Pos = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾר<CABE><D7A8>
if (++time_1s == 1000)
{
freq = TH0 << 8 | TL0;
TH0 = 0;
TL0 = 0;
time_1s = 0;
}
if (reset_relay_flag)
{
if (++time_up_1s >= 1000)
{
time_up_1s = 1000;
}
}
else
{
time_up_1s = 0;
}
if (++time_100ms == 100)
light_flag ^= 1;
Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos, ucLed[Seg_Pos]);
}
void Timer3Server() interrupt 19
{
if (++pwn_count == 10)
pwn_count = 0;
if (freq > freq_demo)
MOTOR(pwn_count <= 8);
else
MOTOR(pwn_count <= 2);
}
void Delay750ms() //@12MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do
{
do
{
while (--k)
;
} while (--j);
} while (--i);
}
/* Main */
void main()
{
System_Init();
EEPROM_Read(&relay_count, 0, 1);
Timer0Init();
Timer2_Init();
Timer3_Init();
while (1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}