智能电子称的设计 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; //保存小数点(标定修改参数时用)单片机初始化 开机鸣叫 没有闪烁位 ad芯片初始化
读参数,并校验是否正
25
智能电子秤设计
保存小数点(标定修改参数 时用)
bdf_dsel_temp=bdf.dsel;// 用)
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)(); //单片机初始化 开机鸣叫 没有闪烁 ad芯片初始
读参数,并校验是否正确 若是异常值,用默认值
保存小数点(标定修改参数时用)单片机初始 开机鸣叫 没有闪烁位 ad芯片初始化
读参数,并校验是否正 保存小数点(标定修改参数 时用)
26
智能电子称的设计 保存分度值(标定修改参数时用) 标定按键扫描 功能键处理函数 显示版本号 分度数运算 笔画检测
保存当前零位值 /主循环程序 A/D采样 数据处理
零位跟踪程序 内码计算 重量显示 按键扫描
(* 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)//显示版本号及最大量程 {
27
智能电子秤设计
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.2.2 信号采样与A/D转换子程序的设计
A/D数据处理(采用数组平均值法)产生新的A/D值与上一次值累加累加次数到n否Y取平均值递推放入数组中N新值与上一次稳定值比较表示是上升过程N是否接近稳定Y表示是上升(或下降)A/D值变化不大累加次数n增加提高精度重量送显示返回
28
智能电子称的设计
如图 4-3 信号采样与A/D转换子程序的设计
extern uchar code adcount2[3];
extern bit bAd;//extern bit b_warnled; extern bit b_steady; extern bit b_up_last;
extern uchar adup_count;
extern ulong idata ad_steady;//extern uchar add_count;//extern ulong idata add_val;// 已产生AD值 AD数据处理后的稳定值 AD累加计数器 AD累加值
AD异常值计数 AD芯片采样值
extern ulong idata lvbo[6];
extern uchar wdcount;
extern uchar adup_count;// extern uchar addcount3; extern ulong idata up_val; extern ulong idata adval;//
extern uchar idata follow_time;//零位跟踪时间
extern uchar idata time_weight;//重量为0时,消隐时间 void time(void);
ulong buf_left(ulong temp);
/*******************************************/ //
void ad_processor(void) { ulong temp1; ulong temp2; uchar i; bit b_up; if(bAd) {
bAd=0;
time();//时间计数器自减
//-------------------------------------------------------- adval=adval>>4;
add_val=add_val+adval;//传感器累加滤波 add_count++;
if(add_count
29