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

333 lines
8.2 KiB
C
Raw Permalink Normal View History

2025-04-13 01:02:19 +08:00
#include "main.h"
/* LED<45><44>ʾ */
uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0};
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ */
uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ֵ
uchar Seg_Pos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ
uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // ijλ<C4B3>Ƿ<EFBFBD><C7B7><EFBFBD>ʾС<CABE><D0A1><EFBFBD><EFBFBD>
/* <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD> */
uchar Uart_Buf[6]; // <20><><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Uart_Rx_Index; // <20><><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><D6B8>
/* ʱ<><EFBFBD><E4B7BD> */
uint time_all_1s;
uint long_press_1s_12; // <20><><EFBFBD><EFBFBD>1s<31>ļ<EFBFBD>ʱ<EFBFBD><CAB1>
uint long_press_1s_13; // <20><><EFBFBD><EFBFBD>1s<31>ļ<EFBFBD>ʱ<EFBFBD><CAB1>
uchar Sys_Tick; // <20><><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
/* <20><><EFBFBD><EFBFBD> */
uchar Seg_show_mode; // 0 <20><><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD>
uchar Data_show_mode; // 0 <20><EFBFBD> 1 <20><><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Para_show_mode; // 0 <20><EFBFBD> 1 <20><><EFBFBD><EFBFBD>
uchar Out_mode; // 0 <20><><EFBFBD><EFBFBD> 1 ֹͣ
/* <20><><EFBFBD><EFBFBD> */
uint T_value_100x; // <20>¶ȵ<C2B6>100<30><30>
uchar Dis_value; // <20><><EFBFBD><EFBFBD>
uint Change_times; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Para_T = 30; // <20>¶Ȳ<C2B6><C8B2><EFBFBD>
uchar Para_Dis = 35; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uchar Para_T_temp;
uchar Para_Dis_temp;
/* <20>ж<EFBFBD>*/
bit press_12; // <20><><EFBFBD><EFBFBD>12
bit press_13; // <20><><EFBFBD><EFBFBD>13
bit Uart_flag; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Ϣ
bit out_range; // <20>Ƿ񳬳<C7B7><F1B3ACB3><EFBFBD>Χ
bit hot_T; // <20>Ƿ<EFBFBD><C7B7>¶ȹ<C2B6><C8B9><EFBFBD>
/* <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Data_Proc() {
if (time_all_1s % 100 == 0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
Dis_value = Ut_Wave_Data();
out_range = Dis_value > Para_Dis;
}
if (time_all_1s % 500 == 0) {
// <20>¶ȶ<C2B6>ȡ
T_value_100x = rd_temperature() * 100;
hot_T = (T_value_100x > Para_T * 100);
}
}
/* <20><><EFBFBD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Key_Proc() {
static uchar Key_Val, Key_Down, Key_Up, Key_Old;
if (time_all_1s % 10) return;
Key_Val = Key_Read();
Key_Down = Key_Val & (Key_Old ^ Key_Val);
Key_Up = ~Key_Val & (Key_Old ^ Key_Val);
Key_Old = Key_Val;
if (Key_Down == 12) {
press_12 = 1; // <20><><EFBFBD><EFBFBD>12
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (long_press_1s_12 >= 1000) {
press_12 = 0;
// ִ<>г<EFBFBD><D0B3><EFBFBD>1s<31>IJ<EFBFBD><C4B2><EFBFBD>
Change_times = 0;
}
// ̧<><CCA7>12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>û<EFBFBD>е<EFBFBD><D0B5><EFBFBD>1s
if (Key_Up == 12 && press_12) {
press_12 = 0; // <20>ɿ<EFBFBD>12
// ʱ<><CAB1>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>
switch (Seg_show_mode) {
case 0:
/* <20><><EFBFBD><EFBFBD> */
Data_show_mode = (++Data_show_mode) % 3;
break;
case 1:
/* <20><><EFBFBD><EFBFBD> */
Para_show_mode = (++Para_show_mode) % 2;
break;
}
}
if (Key_Down == 13) {
press_13 = 1; // <20><><EFBFBD><EFBFBD>13
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (long_press_1s_13 >= 1000) {
press_13 = 0;
// ִ<>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Out_mode = (++Out_mode) % 2;
}
// ̧<><CCA7>13<31><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>û<EFBFBD>е<EFBFBD><D0B5><EFBFBD>1s
if (Key_Up == 13 & press_13) {
press_13 = 0; // <20>ɿ<EFBFBD>13
// ʱ<><CAB1>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>
Seg_show_mode = (++Seg_show_mode) % 2;
Data_show_mode = 0;
Para_show_mode = 0;
if (Seg_show_mode == 1) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
Para_Dis_temp = Para_Dis;
Para_T_temp = Para_T;
} else {
// <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
if (Para_Dis_temp != Para_Dis || Para_T_temp != Para_T) {
Change_times = (Change_times == 65535) ? 65535 : Change_times + 1;
EEPROM_Write(&Change_times, 0, 2);
}
Para_Dis = Para_Dis_temp;
Para_T = Para_T_temp;
}
}
switch (Para_show_mode) {
case 0:
/* <20><EFBFBD> */
if (Key_Down == 16) Para_T = (Para_T <= 1) ? 99 : Para_T - 2;
if (Key_Down == 17) Para_T = (Para_T >= 98) ? 0 : Para_T + 2;
break;
case 1:
/* <20><><EFBFBD><EFBFBD> */
if (Key_Down == 16) Para_Dis = (Para_Dis <= 4) ? 99 : Para_Dis - 5;
if (Key_Down == 17) Para_Dis = (Para_Dis >= 95) ? 0 : Para_Dis + 5;
break;
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Seg_Proc() {
if (time_all_1s % 20) return;
switch (Seg_show_mode) {
case 0:
/* <20><><EFBFBD><EFBFBD> */
switch (Data_show_mode) {
case 0:
/* <20><EFBFBD> */
Seg_Point[5] = 1;
Seg_Buf[0] = 11; // C
Seg_Buf[1] = Seg_Buf[2] = Seg_Buf[3] = 10;
Seg_Buf[4] = T_value_100x / 1000 % 10;
Seg_Buf[5] = T_value_100x / 100 % 10;
Seg_Buf[6] = T_value_100x / 10 % 10;
Seg_Buf[7] = T_value_100x % 10;
break;
case 1:
/* <20><><EFBFBD><EFBFBD> */
Seg_Point[5] = 0;
Seg_Buf[0] = 12; // L
Seg_Buf[1] = Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = Seg_Buf[5] = 10;
Seg_Buf[6] = Dis_value / 10 % 10;
Seg_Buf[7] = Dis_value % 10;
break;
case 2:
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
Seg_Point[5] = 0;
Seg_Buf[0] = 13; // n
Seg_Buf[1] = Seg_Buf[2] = 10;
Seg_Buf[3] =
(Change_times / 10000 % 10 == 0) ? 10 : Change_times / 10000 % 10;
Seg_Buf[4] = (Seg_Buf[3] == 10 && (Change_times / 1000 % 10 == 0))
? 10
: Change_times / 1000 % 10;
Seg_Buf[5] = (Seg_Buf[4] == 10 && (Change_times / 100 % 10 == 0))
? 10
: Change_times / 100 % 10;
Seg_Buf[6] = (Seg_Buf[5] == 10 && (Change_times / 10 % 10 == 0))
? 10
: Change_times / 10 % 10;
Seg_Buf[7] = Change_times % 10;
break;
}
break;
case 1:
/* <20><><EFBFBD><EFBFBD> */
Seg_Point[5] = 0;
Seg_Buf[0] = 14; // P
Seg_Buf[1] = Seg_Buf[2] = 10;
Seg_Buf[3] = Para_show_mode + 1;
Seg_Buf[4] = Seg_Buf[5] = 10;
switch (Para_show_mode) {
case 0:
/* <20><EFBFBD> */
Seg_Buf[6] = Para_T_temp / 10 % 10;
Seg_Buf[7] = Para_T_temp % 10;
break;
case 1:
/* <20><><EFBFBD><EFBFBD> */
Seg_Buf[6] = Para_Dis_temp / 10 % 10;
Seg_Buf[7] = Para_Dis_temp % 10;
break;
}
break;
}
}
/* LED<45><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Led_Proc() {
switch (Out_mode) {
case 0:
/* <20><><EFBFBD><EFBFBD> */
if (out_range)
Da_Write(4 * 51); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4V
else
Da_Write(2 * 51); // û<><C3BB><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2V
break;
case 1:
/* ֹͣ */
Da_Write(0.4 * 51); // ֹͣ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0.4V
break;
}
ucLed[0] = hot_T;
ucLed[1] = !out_range;
ucLed[2] = !Out_mode;
}
/* <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Uart_Proc() {
if (Uart_Rx_Index == 0) return;
// <20><><EFBFBD><EFBFBD>10msû<73><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
if (Sys_Tick >= 10) {
Sys_Tick = Uart_flag = 0;
if (Uart_Buf[0] == 'S' && Uart_Buf[1] == 'T') {
printf("$%bu,%5.2f\r\n", Dis_value, (float)T_value_100x / 100.0);
} else if (Uart_Buf[0] == 'P' && Uart_Buf[1] == 'A' && Uart_Buf[2] == 'R' &&
Uart_Buf[3] == 'A') {
printf("#%bu,%bu\r\n", Para_Dis, Para_T);
} else {
printf("ERROR\r\n");
}
memset(Uart_Buf, 0, Uart_Rx_Index);
Uart_Rx_Index = 0;
}
}
/* <20><>ʱ<EFBFBD><CAB1>0<EFBFBD>жϳ<D0B6>ʼ<EFBFBD><CABC> */
void Timer0_Init(void) // 1<><31><EFBFBD><EFBFBD>@12.000MHz
{
AUXR &= 0x7F; // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>12Tģʽ
TMOD &= 0xF0; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ģʽ
TL0 = 0x18; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
TH0 = 0xFC; // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʼֵ
TF0 = 0; // <20><><EFBFBD><EFBFBD>TF0<46><30>־
TR0 = 1; // <20><>ʱ<EFBFBD><CAB1>0<EFBFBD><30>ʼ<EFBFBD><CABC>ʱ
ET0 = 1;
EA = 1;
}
/* <20><>ʱ<EFBFBD><CAB1>0<EFBFBD>жϺ<D0B6><CFBA><EFBFBD> */
void Timer0_ISR(void) interrupt 1 {
uchar i;
if (++time_all_1s == 1000) time_all_1s = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (press_12) {
if (++long_press_1s_12 >= 1000) {
long_press_1s_12 = 1001;
}
} else {
long_press_1s_12 = 0;
}
if (press_13) {
if (++long_press_1s_13 >= 1000) {
long_press_1s_13 = 1001;
}
} else {
long_press_1s_13 = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AAB2><EFBFBD>
if (Uart_flag) Sys_Tick++;
Seg_Pos = (++Seg_Pos) % 8;
Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]);
for (i = 0; i < 8; i++) Led_Disp(i, ucLed[i]);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Uart_ISR(void) interrupt 4 {
if (RI == 1) // <20><><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
{
Uart_flag = 1;
Sys_Tick = 0; // <20><><EFBFBD>ܼ<EFBFBD>ʱ
Uart_Buf[Uart_Rx_Index] = SBUF;
Uart_Rx_Index++;
RI = 0;
}
if (Uart_Rx_Index > 6) Uart_Rx_Index = 0;
}
void Delay750ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do {
do {
while (--k);
} while (--j);
} while (--i);
}
uchar passwd = 155;
uchar input_passwd;
void main() {
System_Init();
Timer0_Init();
Uart1_Init();
rd_temperature();
Delay750ms();
EEPROM_Read(&input_passwd, 8, 1); // <20>ò<EFBFBD><C3B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ĵط<C4B5><D8B7><EFBFBD>У<EFBFBD><D0A3>
if (input_passwd != passwd) // У<><D0A3>ʧ<EFBFBD>ܣ<EFBFBD>֮ǰδд<CEB4><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1/256<35><36><EFBFBD>ʳ<EFBFBD><CAB3><EFBFBD><EFBFBD><EFBFBD>
{
EEPROM_Write(&passwd, 8, 1);
} else // У<><D0A3>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
EEPROM_Read(&Change_times, 0, 2);
}
T_value_100x = rd_temperature() * 100;
while (1) {
Data_Proc();
Key_Proc();
Seg_Proc();
Uart_Proc();
Led_Proc();
}
}