《蓝桥杯真题》:2022单片机省赛第二场(第十三 / 13届第二场)

该代码实现了一个基于STM32单片机的超声波测距系统,结合PCA8591 DAC进行电压控制。系统包括超声波发送与接收、按键处理、显示功能,能够根据用户输入调整电压上下限,并实时显示距离信息。此外,还实现了I2C通信协议,用于与PCA8591的交互。

有关题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

main.c

#include <STC15F2K60S2.H>
#include "iic.h"
#include "intrins.h"

#define uchar unsigned char 
#define uint unsigned int 

sbit TX = P1^0;  //发射引脚
sbit RX = P1^1;  //接收引脚

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L8 = P0^7;

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

uchar jm = 0;
code uchar tab[] = {
   
   0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0xff, 0xc1, 0x8c, 0xc3, 0x88};
//U P L A 11 12 13 14


//初始化为0,一次表示从左至右分别表示S5的参数选择为上限,超声波的连续测量标志不打开,L8灭
bit flag_para, flag_start, flag_L8 ;

float Vup = 4.5, Vdown = 0.5, Vrb2, Vdac;
uint dis = 5;

void sys_init();
void dac_pcf8591(uchar da);
uchar rd_pcf8591(uchar addr);
void Delay5ms();		//@12.000MHz
void Delay12us();		//@12.000MHz 用于延时与产生方波

void key_handle();
void delay_k(uchar t);
void Send_Sonic();//用于发送8个40kHz的方波
void Sonic_handle();
void led();
void dac_handle();

void dsp_smg_bit(uchar pos, val, dot);
void display();
void dsp_vol();
void dsp_para();
void dsp_dis();
void Delay1ms();		//@12.000MHz

void main()
{
   
   
	sys_init();
	while(1)
	{
   
   
		Vrb2 = rd_pcf8591(0x43) * 5 / 255.0;//读取通道3的电压,要同时允许DAC
		key_handle();
		display();
		Sonic_handle();
		led();
		dac_handle();
	}
}
void dac_handle()
{
   
   
	if (!flag_start)
	{
   
   
		Vdac = 0.0;
	}
	else 
	{
   
   
		if (dis <= 20)
			Vdac = 1.0;
		else if (dis >= 80)
			Vdac = 5.0;
		else 
		{
   
   
			Vdac = 1.0 / 15 * (dis - 20) + 1;
		}
	}
	dac_pcf8591((uchar)(Vdac * 51));
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值