蓝桥杯第三次模拟题

这个图我们可以看出,这次的模拟题 东西其实不多,但是需要我们多使用一个串口

 这是我们的ADC输出,选择通道0x43,是我们的滑动变阻器,输出需要✖51,显示就需要/51.0,显示一个浮点数,这就是我们的电压值,噪音值就需要我们去计算

 串口发送数据我们使用为sprintf以及发送数据的函数

 两个界面的转化,我们直接使用 ^ 就可以了

 以及一些附加条件

 同时,我们需要注意一下串口通信

以及LED的显示

 最后是初始化

我们首先先把模板搭建出来,然后再继续添加需要的底层,这次我们需要添加IIC,然后再自己写一个Uart

经过测试后我们的到: 其实我们发送数据和接受数据,需要用同一个数组来进行,不然显示的时候以及切换的时候就会出现问题

#include <STC15F2K60S2.H>
#include "init.h"
#include "seg.h"
#include "led.h"
#include "key.h"
#include "uart.h"
#include "iic.h"
#include <stdio.h>

unsigned char Key_val,Key_old,Key_down;
unsigned char Key_slow_down;

unsigned char  Seg_Buf[]={10,10,10,10,10,10,10,10};
unsigned char  Seg_Point[]={0,0,0,0,0,0,0,0};
unsigned int Seg_slow_down;
unsigned char Seg_Pos;

unsigned char  ucLed[]={0,0,0,0,0,0,0,0};

float V_dat;
float db;
unsigned char db_disp=65;

unsigned char Uart_num=0; //发送个数,放在服务函数中,接收数据
unsigned char Uart_Send[15]; //一个数组可以发送可以接受

unsigned char Seg_Mode=0;

void Key_Proc()
{
	if(Key_slow_down) return;
	Key_slow_down=1;
	
	Key_val = Key_Read();
	Key_down = Key_val&(Key_old^Key_val);
	Key_old = Key_val;
	
	switch(Key_down)
	{
		case 12:
			Seg_Mode ^= 1;
			break;
		case 16:
			if(Seg_Mode == 1)
				db_disp=db_disp+5;
			break;
		case 17:
			if(Seg_Mode == 1)
				db_disp=db_disp-5;
			break;
//		case 4:
//			sprintf(Uart_Send,"db=%.2f",db);
//		  Send_String(Uart_Send);
//			break;
//上面是可以进行按键发送数据

	}
}



void Seg_Proc()
{
	if(Seg_slow_down) return;
	Seg_slow_down=1;
	

	V_dat = Ad_Read(0x03)/51.0;
	db = V_dat*18;
	Seg_Buf[2]=Seg_Buf[3]=Seg_Buf[4]=10;
	
	switch(Seg_Mode)
	{
		case 0:
			Seg_Buf[1]=1;
		
	    Seg_Buf[5]=(unsigned char)db/10;
	   	Seg_Buf[6]=(unsigned char)db%10 ;
		  Seg_Buf[7]=(unsigned char)(db*100)%10;
		  Seg_Point[6]=1;
			break;
		
			case 1:
			Seg_Buf[1]=2;
			Seg_Buf[5]=10;
	   	Seg_Buf[6]=db_disp/10;
		  Seg_Buf[7]=db_disp%10;
		  Seg_Point[6]=0;
			break;
	}
}



void Led_Proc()
{
	
}



// 串口函数,如果数据数量不是0,就判断数组里面的数,如果满足要求,就发送sprintf的数组数据
void Uart_Proc()
{
		if(Uart_num!=0)
			{
				if((Uart_Send[0]=='R')&&(Uart_Send[1]=='e')&&(Uart_Send[2]=='t')&&(Uart_Send[3]=='u')&&(Uart_Send[4]=='r')&&(Uart_Send[5]=='n'))
				{
					Uart_num=0; //进入判断完成后,就需要进入把数组置0
					sprintf(Uart_Send,"Noises:%.1fdB\r\n",db); //定义发送格式
					Send_String(Uart_Send); //发送函数
				}
			}
		}

	


void Timer0Init(void)		//[email protected]
{
	AUXR &= 0x7F;		
	TMOD &= 0xF0;		
	TL0 = 0x18;		
	TH0 = 0xFC;		
	TF0 = 0;		
	TR0 = 1;		
	
	ET0 = 1;
	EA = 1;
}



void Timer0Server() interrupt 1
{
	if(++Key_slow_down==10) Key_slow_down=0;
	if(++Seg_slow_down==500) Seg_slow_down=0;
	if(++Seg_Pos==8) Seg_Pos=0;
	
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}

void Uart1Server() interrupt 4 //串口服务函数
{
    if(RI==1)//判断是否接收
    {                  
       Uart_Send[Uart_num]= SBUF;  //把每一位数组字符存入SBUF,等待发送函数发送       
       Uart_num++;  //接收到后加1,计算个数
       RI = 0;//接收置0		
    }
}


void main()
{
	
	Init();
	Timer0Init();
	UartInit();
	while(1)
	{
	Uart_Proc();
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}













猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/129908782