前提说明
电子开发合作请私信联系,商业/非商业项目均可洽谈,价格友好,负责可靠。
目前已开发项目三百余单,不限时售后,直到项目完结。
需知
对此项目有需求请私信联系我,备注对应项目名称号(非免费,伸手党勿扰,价格公道,售后负责)
所有项目均有个人验证无误后发出,保证不坑害任何一位朋友,个人有接单渠道,不缺钱,随缘分享案例+和有需求的朋友合作。
项目设计要求
本设计基于STM32单片机对采集到的数据进行智能化处理。通过使能STM32单片机的外部按钮切换不同参数的显示界面。对于电阻电容的测量,通过自锁开关切换不同的通道测量,根据外部测量的需求,可对电阻或者电容进行参数测量。设计了一路直流电压检测和一路直流电流检测通道,交流电压电流通过电能测量模块获取。设计了蜂鸣器报警电路,并设置了通断档,可通过改变软件内部的代码从而改变通断对应的不同电阻阈值,目前本文设定50欧姆以下的电阻视为通路,50欧姆以上的电阻视为开路。
本次基于STM32单片机的万用表设计指标如下,总共设置了其中不同类型的检测指标,分别为:
(1)直流电压测量范围0-30V
(2)直流电流测量范围0-6A
(3)交流电压测量范围1-300V
(4)交流电流测量范围10mA-16A
(5)电阻测量范围10Ω-1MΩ
(6)电容测量范围1pF-100nF
(7)线路通断检测
其中许多指标基于本设计现有测试环境而言,由于是通过同相放大电路对电压电流进行参数转换,因此可通过改变其中的电阻从而改变缩小的倍数。软件内部可以实时针对不同电路的不同测量条件进行修正,可以修改蜂鸣器报警鸣叫的触发范围。
项目提供资料
1、原理图源文件(嘉立创标准版,可导为专业版)
2、PCB源文件(嘉立创标准版,可导为专业版)
3、代码(有注释,规范设计,详情可看我其他单模块设计实例,keil5 MDK)
4、售后(分单资料售卖或售后指导设计两种,不同的价格,优质的服务提供给想设计出来这款作品的朋友们)
main.c代码
int main(void)
{
u8 key=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
uart2_init(4800); //串口初始化为115200
USART3_Init(9600);
EXTIX_Init();
LED_Init();
Init_adc();
KEY_Init();
TIM3_Int_Init(999,71); //1ms定时
OLED_Init(); //初始化OLED
OLED_Clear();
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
delay_ms(20); //消抖
if(key==KEY0_PRES)
{
mode+=1; //模式+1
OLED_Clear();
if(mode==7)mode=0;
}
}
if(key==KEY1_PRES) //开启播报
{
delay_ms(20);
if(key==KEY1_PRES)
{
mode-=1; //模式+1
OLED_Clear();
if(mode>7)mode=6;
}
}
if(mode==0)
{
DC_view();
OLED_ShowNum(40,4,(u32)(ADC_ConvertedValueLocal),2,16);
OLED_ShowNum(64,4,(u32)(ADC_ConvertedValueLocal*100)%100,2,16);
}
else if(mode==1)
{
DI_view();
OLED_ShowNum(40,4,(u32)(ADC_ConvertedValueLoca2),2,16);
OLED_ShowNum(64,4,(u32)(ADC_ConvertedValueLoca2*100)%100,2,16);
}
else if(mode==2)
{
AC_view();
OLED_ShowNum(40,4,(u32)(ACVotage),3,16);
OLED_ShowNum(72,4,(u32)(ACVotage*10)%10,1,16);
}
else if(mode==3)
{
AI_view();
OLED_ShowNum(40,4,(u32)(ACCurrent),2,16);
OLED_ShowNum(64,4,(u32)(ACCurrent*100)%100,2,16);
}
else if(mode==4)
{
R_view();
OLED_ShowNum(28,4,RX2/1000000,1,16);
OLED_ShowNum(28+8,4,RX2%1000000/100000,1,16);
OLED_ShowNum(28+16,4,RX2%100000/10000,1,16);
OLED_ShowNum(28+24,4,RX2%10000/1000,1,16);
OLED_ShowNum(28+32,4,RX2%1000/100,1,16);
OLED_ShowNum(28+40,4,RX2%100/10,1,16);
OLED_ShowNum(28+48,4,RX2%10,1,16);
OLED_ShowCHinese(28+56,4,12);
}
else if(mode==5)
{
C_view();
OLED_ShowNum(28,4,(unsigned long)CZ/1000000,1,16);
OLED_ShowNum(28+8,4,(unsigned long)CZ%1000000/100000,1,16);
OLED_ShowNum(28+16,4,(unsigned long)CZ%100000/10000,1,16);
OLED_ShowNum(28+24,4,(unsigned long)CZ%10000/1000,1,16);
OLED_ShowNum(28+32,4,(unsigned long)CZ%1000/100,1,16);
OLED_ShowNum(28+40,4,(unsigned long)CZ%100/10,1,16);
OLED_ShowNum(28+48,4,(unsigned long)CZ%10,1,16);
}
else if(mode==6)
{
TONG_view();
if(ADC_ConvertedValueLoca3<=1.65f)BEEP=1,OLED_ShowCHinese(48,4,10),OLED_ShowCHinese(64,4,5);
else BEEP=0,OLED_ShowCHinese(48,4,6),OLED_ShowCHinese(64,4,11);
}
//检测到的交流电压和交流电流
ACVotage=(Voltage_Parameter_Reg*1.88/Voltage_Reg)*1.0026;//交流电压有效值
if(ACVotage<=2)ACVotage=0;
ACCurrent=Current_Parameter_Reg*1.0/Current_Reg*0.4761;//交流电流有效值
if(ACCurrent<0.1)ACCurrent=0;
printf ("电压有效值:%f\r\n",ACVotage);
printf ("电流有效值:%f\r\n",ACCurrent);
delay_ms(100);
}
}