这个图我们可以看出,这次的模拟题 东西其实不多,但是需要我们多使用一个串口
这是我们的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();
}
}