前言:
本篇主要分享了蓝桥杯单片机第十届国赛代码,主要偏重于串口的考察
(所示代码在开发板上已经实现全部功能)
代码:
#include <STC15F2K60S2.H>
#include "InitHC138.h"
#include "Nixie.h"
#include "Key.h"
#include "Delay.h"
#include "csb.h"
#include "iic.h"
#include "onewire.h"
#include "stdio.h"
#include "Uart.h"
unsigned char Uart_Recv[10];
unsigned char Uart_Recv_Index;
float t;
bit flag_t=0;//温度读取
unsigned char length;//距离
unsigned int num;//参数变更次数
char temper_set=30;//温度参数
char length_set=35;//距离参数
unsigned char compare_t_set=30;
unsigned char compare_l_set=35;
bit turn=0;//0为数据界面 1为参数界面
unsigned char mode1;//数据切换
bit mode2=0;//参数切换
bit lock=0;//长按键锁住键盘
bit lock2=0;//长按键锁住键盘
bit time_1s=0;
bit time2_1s=0;
bit flag_dac=0;
bit flag_da=0;
bit flag_uart=0;
bit compare=0;//参数变化标志
float vcc;
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void SystemInit()
{
P0=0xff;
InitHC138(4);
P0=0x00;
InitHC138(5);
}
void Led_Config(unsigned char pin,state)
{
unsigned char i,ledstate;
static unsigned char LED[8]={0,0,0,0,0,0,0,0};
if(LED[pin]!=state)
{
LED[pin]=state;
ledstate=0xff;
for(i=0;i<8;i++)
{
ledstate=ledstate^(LED[i]<<i);
}
P0=ledstate;
InitHC138(4);
}
}
//数据界面
//温度数据
void Temper_page()
{
Nixie_SetBuf(1,12);
Nixie_SetBuf(2,19);
Nixie_SetBuf(3,19);
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,(unsigned char)t/10);
Nixie_SetBuf(6,(unsigned char)t%10);
Nixie_SetBuf(7,(unsigned int)(t*10)%10);
Nixie_SetBuf(8,(unsigned int)(t*100)%10);
point[6]=1;
}
//距离数据
void Distance_page()
{
Nixie_SetBuf(1,16);
Nixie_SetBuf(2,19);
Nixie_SetBuf(3,19);
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,length/10);
Nixie_SetBuf(8,length%10);
if(length>=99)length=99;
point[6]=0;
}
//变更次数
void Num_page()
{
Nixie_SetBuf(1,17);
Nixie_SetBuf(2,19);
Nixie_SetBuf(3,19);
point[6]=0;
if(num==0)
{
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,19);
Nixie_SetBuf(8,19);
}
else if(num/10==0)
{
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,19);
Nixie_SetBuf(8,num);
}
else if(num/100==0)
{
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,num/10);
Nixie_SetBuf(8,num%10);
}
else if(num/1000==0)
{
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,num/100);
Nixie_SetBuf(7,num/10%10);
Nixie_SetBuf(8,num%10);
}
else if(num/10000==0)
{
Nixie_SetBuf(4,19);
Nixie_SetBuf(5,num/1000);
Nixie_SetBuf(6,num/100%10);
Nixie_SetBuf(7,num/10%10);
Nixie_SetBuf(8,num%10);
}
else
{
Nixie_SetBuf(4,num/10000);
Nixie_SetBuf(5,num/1000%10);
Nixie_SetBuf(6,num/100%10);
Nixie_SetBuf(7,num/10%10);
Nixie_SetBuf(8,num%10);
}
}
//参数界面
//温度参数
void Temper_Setpage()
{
Nixie_SetBuf(1,18);
Nixie_SetBuf(2,19);
Nixie_SetBuf(3,19);
Nixie_SetBuf(4,1);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,temper_set/10);
Nixie_SetBuf(8,temper_set%10);
point[6]=0;
}
//距离参数
void Length_Setpage()
{
Nixie_SetBuf(1,18);
Nixie_SetBuf(2,19);
Nixie_SetBuf(3,19);
Nixie_SetBuf(4,2);
Nixie_SetBuf(5,19);
Nixie_SetBuf(6,19);
Nixie_SetBuf(7,length_set/10);
Nixie_SetBuf(8,length_set%10);
point[6]=0;
}
void Key_Loop()
{
static unsigned char Key_Val,Key_Old,Key_Down,Key_Up;
Key_Val=ScanKey();
Key_Down=Key_Val&(Key_Old^Key_Val);
Key_Up=~Key_Val&(Key_Old^Key_Val);
Key_Old=Key_Val;
if(lock==0&&lock2==0)
{
if(Key_Up==13)
{
if(turn==0)
{
turn=1;
mode2=0;
}
else if(turn==1)
{
turn=0;
mode1=0;
}
}
else if(Key_Up==12)
{
if(turn==0)
{
if(mode1==0)mode1=1;
else if(mode1==1)mode1=2;
else if(mode1==2)mode1=0;
}
else if(turn==1)
{
if(mode2==0)mode2=1;
else if(mode2==1)mode2=0;
}
}
else if(Key_Up==16)
{
if(turn==1)
{
if(mode2==0)
{
temper_set-=2;
if(temper_set<0)temper_set=0;
}
else if(mode2==1)
{
length_set-=5;
if(length_set<0)length_set=0;
}
}
}
else if(Key_Up==17)
{
if(turn==1)
{
if(mode2==0)
{
temper_set+=2;
if(temper_set>99)temper_set=99;
}
else if(mode2==1)
{
length_set+=5;
if(length_set>99)length_set=99;
}
}
}
}
if(Key_Down==12)
{
time_1s=1;
}
else if(Key_Up==12)
{
time_1s=0;
}
if(Key_Down==13)
{
time2_1s=1;
}
else if(Key_Up==13)
{
time2_1s=0;
}
}
//数据读取函数
void Date_Read()
{
if(flag_t==1)
{
t=read_t();
if(t>80)return ;
flag_t=0;
}
if(flag_da==1)
{
DA_Write(vcc*51.0);
length=csb();
flag_da=0;
}
if(turn==0)
{
if(mode1==0)Temper_page();
else if(mode1==1)Distance_page();
else if(mode1==2)Num_page();
}
else if(turn==1)
{
if(mode2==0)Temper_Setpage();
else if(mode2==1)Length_Setpage();
}
if(flag_dac==1)vcc=0.4;
else if(flag_dac==0)
{
if(length<=length_set)vcc=2.0;
else if(length>length_set)vcc=4.0;
}
}
//串口
void Uart_Page()
{
if(Uart_Recv_Index>0)
{
if(Uart_Recv_Index==4)
{
if(Uart_Recv[0]=='S'&&Uart_Recv[1]=='T'&&Uart_Recv[2]=='\r'&&Uart_Recv[3]=='\n')
{
printf("$%2d,%.2f\r\n",(unsigned int)length,t);
}
else printf("ERROR\r\n");
}
else if(Uart_Recv_Index==6)
{
if(Uart_Recv[0]=='P'&&Uart_Recv[1]=='A'&&Uart_Recv[2]=='R'&&Uart_Recv[3]=='A'&&Uart_Recv[4]=='\r'&&Uart_Recv[5]=='\n')
{
printf("#%2d,%2d\r\n",(unsigned int)temper_set,(unsigned int)length_set);
}
else
printf("ERROR\r\n");
}
else printf("ERROR\r\n");
Uart_Recv_Index=0;
}
}
void main()
{
Timer0Init();
SystemInit();
UartInit();
read_t();
Delay(750);
while(1)
{
Date_Read();
if(flag_uart==1)
{
Uart_Page();
flag_uart=0;
}
if(t>temper_set&&t<80)
{
Led_Config(0,1);
}
else if(t<=temper_set||t>80)
{
Led_Config(0,0);
}
if(length<length_set)
{
Led_Config(1,1);
}
else if(length>=length_set)
{
Led_Config(1,0);
}
if(flag_dac==0)
{
Led_Config(2,1);
}
else if(flag_dac==1)
{
Led_Config(2,0);
}
if(compare==1)
{
if(compare_t_set!=temper_set)
{
num++;
compare_t_set=temper_set;
}
else if(compare_l_set!=length_set)
{
num++;
compare_l_set=length_set;
}
compare=0;
}
}
}
void Timer0_Service() interrupt 1
{
static unsigned char count1=0;
static unsigned char count2=0;
static unsigned int count3=0;
static unsigned char count4=0;
static unsigned int count5=0;
static unsigned int count6=0;
static unsigned char count7=0;
static unsigned char count8=0;
count1++;
count2++;
count3++;
count4++;
count7++;
count8++;
if(count8>=200)
{
flag_uart=1;
count8=0;
}
if(time_1s==1)
{
count5++;
}
if(count5<1000)
{
if(time_1s==0)
count5=0;
lock=0;
}
if(count5>=1000)
{
if(time_1s==0)
{
num=0;
count5=0;
}
lock=1;
}
if(time2_1s==1)
{
count6++;
}
if(count6<1000)
{
if(time2_1s==0)
count6=0;
lock2=0;
}
if(count6>=1000)
{
if(time2_1s==0)
{
flag_dac=!flag_dac;
count6=0;
}
lock2=1;
}
if(count7>=199)
{
count7=0;
flag_da=1;
}
if(count1>=2)
{
Nixie_Loop();
count1=0;
}
if(count2>=10)
{
Key_Loop();
count2=0;
}
if(count3>=399)
{
flag_t=1;
count3=0;
}
if(count4>=100)
{
count4=0;
compare=1;
}
}
void Uart_Sev() interrupt 4
{
if(RI)
{
Uart_Recv[Uart_Recv_Index]=SBUF;
Uart_Recv_Index++;
RI=0;
}
}
/*
#ifndef ___H__
#define ___H__
#endif
*/