基于51单片机的电子秤的设计 联系客服

发布时间 : 星期一 文章基于51单片机的电子秤的设计更新完毕开始阅读981ffbed3069a45177232f60ddccda38366be156

.

第四章 软件设计

软件流程图及程序设计

为了方便程序调试和提高可靠性,程序设计采用自上而下、模块化、结构化的程序设计方法,把总的编程过程逐步细分,分解成一个个功能模块,每个功能模块相互独立,每个模块都能完成一个明确的任务,实现某个具体的功能。本设计按任务模块划分的程序主要有初始化程序、主程序, A/D转换子程序、显示子程序、键盘处理子程序。

4.1初始化程序设计流程图

单片机系统上电后,进入初始化程序,完成单片机片内各模块的设置和A/D转换器的功能设置初始化,然后进入主程序。

如图 4-1 初始化程序设计流程图

..

.

4.2主程序设计流程图

单片机完成初始化程序后进入主程序,主程序主要完成对存储参数的读取,对检测到的数据进行数据处理,键处理,显示处理等。

如图4-2 主程序设计流程图

4.2 主程序设计及其相关程序设计

4.2.1程序清单

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();//分度数运算

..