STM32毕设:蓝牙电子秤设计与实现(含源码、硬件、论文)
文章目录
0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 单片机蓝牙电子秤设计与实现(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 项目分享:见文末!
1 主要功能
2 硬件设计(原理图)
原理图
仿真效果
3 核心软件设计
单片机完成初始化程序后进入主程序,主程序主要完成对存储参数的读取,对检测到的数据进行数据处理,键处理,显示处理等。
篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。
关键代码
uint max_weight;//最大称量
uchar dsel;//分度值
uchar dp;//小数点
float beilv;//倍率
ulong zero_save;//传感器零位值
}bdf;
uint code num_ten[4]={1,10,100,1000};
uchar code adcount2[4]={2,4,5};//数据处理进平均次数
uchar code tab_dsel[4]={1,2,5,10};//分度值表
//0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
uchar code tab[]={0xB7,0x03,0xD6,0xC7,0x63,0xE5,0xF5,0x83,0xF7,0xE7,
//A , b , C , d , E , F , 暗, - , t , P
0xF3,0x75,0xB4,0x57,0xF4,0xF0,0x00,0x40,0x74,0xF2,
//H , L , o , J , r , n , U, =, - i
0x73,0x34,0x55,0x07,0x50,0x51,0x37,0x44,0x04,0x01};
//显示位码表
//0, 1, 2, 3, 4, 5, 6
uchar code digit[]={0xfe,0xdf,0xef,0xfd,0xfb,0xbf,0xF7};//显示位码表
sbit P_OE =P2^1;//显示控制
sbit P_LE =P2^0;
sbit buz0 =P3^6;//蜂鸣器
sbit buz1 =P3^7;
/******************************************************/
bit b_follow;//启动零位跟踪标记
bit b_serial;//串口发送完标记
bit b_followdelay;//第一次不进行零位跟踪
bit b_steady;//稳定标记
/******************************************************/
void (* data task)(void);//函数指针变量,接受下一步要做的任务
uint idata fendushu;//分度数
uchar weight_led[6] ;//重量窗显示缓存
uchar idata temp_var;
uchar weight_dp;//小数点位数
uchar fu_number;//负号显示位置
uchar wdcount;//稳定计数
uchar adup_count;//异常值计数
uchar addcount3;//累加次数
/******************************************************/
extern void key_scan(void);//按键扫描
extern void weight_disp(void);//重量计算,超载报警
extern void start_set(void);//单片机初始化设置
extern void adc (void);//读取AD值
extern void ad_processor(void);//AD数据滤波处理
extern void fun_weight(void);//正常称重状态
extern void bd_start(void);//重量或电压标定选择
extern void dy_disp(void);//电压显示
extern void led_disp(ulong temp,uchar num);
extern uchar get_jiaoyan(uchar *address,uchar num);//计算校验字
extern void neima(void);
void delay60ms(uchar time);//40ms延时
void fendu_val(void);//分度数运算
void check_canshu(void);//读参数,并校验是否正确
void ver_disp(void);//显示版本号
void seg_check(void);//笔画检测
/******************************************/
void main (void)
{
start_set(); //单片机初始化
beep_time=3; //开机鸣叫
flash_num=6; //没有闪烁位
spi_sys(); //ad芯片初始化
check_canshu(); //读参数,并校验是否正确
if(bdf.shuduval>2) //若是异常值,用默认值
bdf.shuduval=1;
addcount3=4;
bdf_dp_temp=bdf.dp; //保存小数点(标定修改参数时用)
bdf_dsel_temp=bdf.dsel;//保存分度值(标定修改参数时用)
key_scan(); //标定按键扫描
switch(key_temp) //功能键处理函数
{
case 0xc0:b_biaoding=1;task=bd_start ; break;//
default:
bdf.dp=0;
ver_disp();//显示版本号
seg_check();//笔画检测
fendu_val();//分度数运算
zero_current=ad_steady;//保存当前零位值
task=fun_weight;
break;
}
do
{ //主循环程序
adc(); //A/D采样
ad_processor();//数据处理
zero_follow(); //零位跟踪程序
neima(); //内码计算
weight_disp(); //重量显示
key_scan(); //按键扫描
(* task)(); //任务切换函数
}
while(1);
}
/*****************************************************************/
void fendu_val(void)//分度数运算
{ uchar i;
ulong temp;
temp=(ulong)bdf.max_weight*num_ten[bdf_dp_temp];
fendushu=temp/bdf.dsel;
i=fendushu/3000;
if (i==0)
i=1;
half_sel_bound=5/bdf.beilv;//半个分度的原始码
follow_bound=i*half_sel_bound;//计算零位跟踪时的原始码,按3000分度
time_weight=200;
}
/*****************************************************************/
void ver_disp(void)//显示版本号及最大量程
{
weight_led[0]=7;// 7
weight_led[1]=1;// 1
weight_led[2]=2;// 2
weight_led[3]=17;// -
weight_led[4]=0;// 0
weight_led[5]=5;// 5
fun_led=0xff;
delay60ms(15);//40ms延时
beep_time=3;
led_disp(bdf.max_weight,5);//显示最大量程
weight_led[0]=15;// F
delay60ms(20);//40ms延时
4 实现效果
5 最后
包含内容
🧿 项目分享:见文末!
作者:m0_984093