黑龙江八一农垦大学
{ //主循环程序
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;
21
黑龙江八一农垦大学
led_disp(bdf.max_weight,5);//显示最大量程 weight_led[0]=15;// F delay60ms(20);//40ms延时
4.2信号采样与A/D转换子程序的设计
A/D数据处理(采用数组平均值法)产生新的A/D值与上一次值累加累加次数到n否NY取平均值递推放入数组中新值与上一次稳定值比较表示是上升N是否接近稳定过程Y表示是上升(或下降)A/D值变化不大累加次数n增加提高精度重量送显示返回
如图 4-3 信号采样与A/D转换子程序的设计
extern uchar code adcount2[3]; extern bit bAd;//已产生AD值 extern bit b_warnled; extern bit b_steady; extern bit b_up_last;
22
黑龙江八一农垦大学
extern uchar adup_count;
extern ulong idata ad_steady;//AD数据处理后的稳定值 extern uchar add_count;//AD累加计数器 extern ulong idata add_val;//AD累加值 extern uchar wdcount;
extern uchar adup_count;//AD异常值计数
extern uchar addcount3; extern ulong idata up_val;
extern ulong idata adval;//AD芯片采样值 extern ulong idata lvbo[6];
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
temp1=add_val/addcount3; //累加n次平均 add_count=0;
add_val=0;//传感器累加清零 i=(uchar)(temp1>>16)+1;
23
黑龙江八一农垦大学
4.3 键盘/显示子程序设计
重量显示流程A/D值乘以标定系数计算出实际重量是否超载报警是否有皮重显示皮重标记显示毛重显示净重返回
如图 4-4 键盘/显示子程序设计
是否有键按下行列扫描读键码返回
如图 4-5 按键扫描流程图
程序清单
extern bit b_keyok;//有按键产生标记
24
黑龙江八一农垦大学
extern bit b_longdown;//长按下标记 extern uchar key_num;//键值 extern uchar key_temp;//临时键值 extern uchar key_count;//键长按计数 extern uchar key_dly;//键去抖动延时 extern uchar beep_time;//蜂鸣时间
void key_scan1();////按键松开或没有按下处理
/****************************************************/ oid disp_t1(void) interrupt 3 using 1//显示中断程序 {
uchar temp; TR1 =0;
P_OE=1;//高阻态,禁止输出
if((disp_number==(5-bdf.dp))&(bdf.dp!=0))//这一位是否有小数点temp=0x08;//小数点段码 else temp=0;
if(disp_number==6)//指示灯显示不用查表 P0=fun_led;// else {
if((disp_number==fu_number)&&b_fuhao) temp=temp|0x40;
if((disp_number==flash_num)&b_flash)//是否有闪烁位 P0=0x0; else
P0=tab[weight_led[disp_number]]|temp;//查表取段码 }
P_LE=1;
P_LE=0;//573锁存段码
P0=digit[disp_number];//送位码 P_OE=0;//573输出有效 disp_number++;
if(disp_number==7)//是否显示最后一位 {
disp_number=0;
if(beep_time)//是否要鸣叫 {
if(!TR0)
{buz0=~buz1;TR0 =1;} beep_time--; } else
25