📄 yh_t3_new.c
字号:
//为0,正常称重状态
//为1,去皮称重状态
bit bdata f_bat=0;//表征电池电量
//为0,电量充足
//为1,电量不足
bit bdata f_zero=0;//表征示数归零
//为0,没有归零;
//为1,当前的示数为0
bit bdata f_add=0;//表征累加状态
//为0,称重结果不累加
//为1,称重结果累加
//---------------------------------
//下面这两个旗标暂时什么也不代表。
bit bdata f_x1=0;
//----------------------------------
bit bdata f_minus=1;//表征结果的正负,
//为1,结果是正数;
//为0,结果是负数。
//----------------------------------
bit bdata f_delay1m=0;//表征定时器T0和计数器C1
//是否正在运行
//为1,正在运行;
//为0,没有运行。
bit bdata f_LCD=0;//表征LCD是否处于屏保状态;
//为1,屏保;
//为0,正常显示。
bit bdata f_stab_mainly=0;//表征LCD显示示数基本稳定
//变化的范围控制在正负一个
//数字之间。
//为1,表示稳定;
//为0,表示不稳定
//-----------------------------------
//以下是4种单位的旗标
bit bdata f_g=0;//表征单位克
//为1,显示该单位
//为0,不显示该单位
//bit bdata f_kg=0;//表征单位千克
//为1,显示该单位
//为0,不显示该单位
//bit bdata f_lb=0;//表征单位英镑
//为1,显示该单位
//为0,不显示该单位
//bit bdata f_oz=0;//表征单位盎司
//为1,显示该单位
//为0,不显示该单位
ulong temp_ad13; //排序过程中,作为中间量,因为涉及到
//相邻的几次排序,所以必须定义成
//全局变量
uint ad_zero;//表示当前零点的AD平均值
uint ad_zero_kj;//表示开机时最初零点的AD平均值
//注意:按键数目限制在4个。
//按键的功能
sbit ZERO=P0^0;//功能说明:清零及校准时空载AD确认
sbit MENU=P0^1;//功能说明:单位转换及进入AD校准。
//进入AD校准方法:先按住UNIT键,然后
//开机,最后松开UNIT键
//注意:给MENU键增加一个串口输出功能
sbit ADD=P0^2;//功能说明:累加,电路图上是PCS键
//sbit PRN=P0^3;//功能说明:串口输出
sbit TARE=P0^4;//功能说明:去皮及校准时加校准砝码后
//AD确认
char count1;
char count2;
//除了AD校准时存放AD的BCD需要6位全部使用,别的只使用
//后5位。
uchar arr_BCD[6];
ulong ad3[3];//最新的三次AD存放缓冲区
//最新的13次AD3次平均值缓冲区
struct AFEI idata ad13[13];
char temp_j;
void rotate3(void);
ulong average3(void);
void rotate(void);
void sort(void);
void BIN_to_BCD(ulong data_BIN);
void over_load(void);
ulong zero_comp(void);
bit stab(ulong ad,ulong ad0);
bit stab2(void);
ulong auto_zero(ulong ave3_ad);
//void zero_button(void);
//void tare_button(void);
//uchar code arr_step[6]={1,2,5,10,20,50};
//uint code arr_baud[4]={1200,2400,4800,9600};
//ulong idata limit_load;//表示超载界限的AD平均值
//long idata AD_over;//表示
//long idata zero_pos;
//long idata zero_neg;
//long idata manu_zero_pos;
//long idata manu_zero_neg;
//long idata auto_zero_pos;
//long idata auto_zero_neg;
//long idata tare_high;
long y; // 作为一系列宏定义的实际参数,存储的是满量程
//的AD平均值增量。
char idata step;//表示真正的分度值
//-----------------------------
//主函数开始
void main(void)
{
ulong idata weight;//称重的结果
ulong temp_weight;//作为重量计算时四舍五入的数据
//缓冲,另外,在单位转换中也会
//用到,作用:数据缓冲。
ulong idata temp_weight0;//缓冲变量,存放上次的重量值
ulong temp_weight_5m;
ulong total=0;//表示累加的重量
uchar n_add=0;//表示累加的次数
long dif;//清零、去皮时的中间结果
ulong inc_ad;//表示AD平均值的增量
ulong ave3_ad;//表示AD的平均值
ulong ave3_ad0;//表示上一次的AD平均值
char i;//循环变量
uchar count_stab=0;//
//char j;//循环变量
/**********************************************
单位转换,循环计数器的取值说明:
目前使用的LCD是1621--GD-1730WP;
count_unit可以取值:1,盎司
2,英镑
3,克
4,千克
**********************************************/
//char count_unit=3;//单位转换,循环计数器,默认是g
/**********************************************
菜单的设计流程: 菜单开始
1,分度值
2,小数点的位置
3,波特率
4,背光
//5,量程
//6,校准
菜单结束
**********************************************/
/*******************************************
count_range_zeroes 表示量程数字后面0的个数
count_range_zeroes的取值范围:0~4
*******************************************/
//uchar idata count_range_zeroes=0;
/*******************************************
count_step 表示分度值的代码。
count_step取值范围:0 对应的分度值1;
1 对应的分度值2;
2 对应的分度值5;
3 对应的分度值10;
4 对应的分度值20;
5 对应的分度值50;
*******************************************/
uchar idata count_step;
/*******************************************
count_point 表示小数点的位置。
count_point取值范围: 0 没有小数点;
1~5 表示2至6位(从右边数)
的小数点 ;
注意:第五位的小数点也就是LCD的最高位的小数点,
实际上是没有意义的。
*******************************************/
uchar idata count_point;
/*******************************************
count_baud 表示串口的波特率。
count_baud的取值范围:0 对应的波特率1200;
1 对应的波特率2400;
2 对应的波特率4800;
3 对应的波特率9600;
*******************************************/
uchar idata count_baud;
/*******************************************
count_BL 表示背光开关的代码。
count_BL的取值范围:0 对应的背光OFF;
1 对应的背光ON;
*******************************************/
uchar idata count_BL;
/*******************************************
count_range 表示量程的最低位,值域:[0,9]
*******************************************/
uchar idata count_range;
/*******************************************
temp_range 表示新的量程,值域:[0,99999]
*******************************************/
ulong idata temp_range;
//旗标f_cal的用途是检验在菜单的量程处是否有TARE键
//或者ZERO键按下。
//另外,也可以判断TARE键或者ZERO键是否是首次按下。
bit bdata f_cal;
/*******************************************
count_FaMa 表示校准砝码重量的最低位,值域:[0,9]
*******************************************/
uchar idata count_FaMa;
/*******************************************
temp_FaMa 表示校准砝码重量的最低位,值域:[0,9]
*******************************************/
ulong idata temp_FaMa;
//旗标f_FaMa的用途:判断TARE键或者ZERO键是否是首次
//按下。
bit bdata f_FaMa;
//----------------------------------------
cmd_5460(0xff);
cmd_5460(0xff);
cmd_5460(0xff);
cmd_5460(0xfe);//初始化5460的串口
//---------------------------------------
cmd_5460(0x4a);//将转换周期改为N
write_5460(N_5460);
//修改配置寄存器,将电流通道的增益改为50
cmd_5460(0x40);
write_5460(0x00010001);
//启动5460的连续转换
cmd_5460(0xe8);
reset_1621();//初始化LCD的一些参数。
cmd_1621(BIAS_COM);
cmd_1621(SYSTEN);
cmd_1621(LCDON);//打开LCD
alarm_low();
display_1621(); //利用dis_zone[]的初始化数据,使
//开机LCD完全不显示。
//----------------------------------
//菜单部分
if(MENU==0)
{
delay_nms(50);
if(MENU==0)
{
while(!MENU);
alarm(200);//按键音
//delay_nms(2000);
f_g=1; //在菜单状态下也显示单位:克。
//--------------------------------------
while(1)
{
rd_seq(0x08,buf_24c02_4B,4);
//--------------------------------------
count_step=buf_24c02_4B[0];
count_point=buf_24c02_4B[1];
count_baud=buf_24c02_4B[2];
count_BL=buf_24c02_4B[3];
//--------------------------------------
//buf_24c02_2L[0]=rd_long(0x10);
//buf_24c02_2L[1]=rd_long(0x14);
rd_seq(0x10,buf_24c02_2L,8);
//下面这些条件判断语句的目的是防止从24C02中第一次
//的读出数据超出指定的范围,造成差错。
if(count_step>5)
count_step=0;
if(count_point>5)
count_point=0;
if(count_BL>1)
count_BL=0;
if(count_baud>3)
count_baud=0;
//菜单进入:显示“SEt”
dis_zone[0]=0x00;
//dis_zone[1]=0xda;
dis_zone[1]=discode_cap[19];
//dis_zone[2]=discode_cap[5];
dis_zone[2]=discode_cap[5];
//dis_zone[3]=discode_low[20];
dis_zone[3]=discode_low[20];
dis_zone[4]=0x00;
dis_zone[5]=0x00;
dis_zone[6]=0x00;
display_1621();
while(1)
{
if(MENU==0)
{
delay_nms(50);
if(MENU==0)
{
while(!MENU);
alarm(200);//按键音,表示按键有效
break;
}
}
}
//菜单一:分度值选择
dis_zone[0]=discode_low[4]; //LCD第一个字位显示”d“
dis_zone[1]=0x00;
dis_zone[2]=0x00;
dis_zone[3]=0x00;
while(1)
{
if(TARE==0)
{
delay_nms(50);
if(TARE==0)
{
while(!TARE);
alarm(200);//按键音
count_step++;
if(count_step==6)
count_step=0;
}
}
if(MENU==0)
{
delay_nms(50);
if(MENU==0)
{
while(!MENU);
alarm(200);//按键音
buf_24c02_4B[0]=count_step;
break;
}
}
switch(count_step)
{
case 0: dis_zone[4]=0x00;//分度值为1
dis_zone[5]=0x06;
break;
case 1: dis_zone[4]=0x00;//分度值为2
dis_zone[5]=0x7c;
break;
case 2: dis_zone[4]=0x00;//分度值为5
dis_zone[5]=0xda;
break;
case 3: dis_zone[4]=0x06;//分度值为10
dis_zone[5]=0xbe;
break;
case 4: dis_zone[4]=0x7c;//分度值为20
dis_zone[5]=0xbe;
break;
case 5: dis_zone[4]=0xda;//分度值为50
dis_zone[5]=0xbe;
break;
default: //显示错误号"Err 7"
dis_zone[0]=0x00;//
//dis_zone[1]=discode_cap[5];
//dis_zone[2]=discode_low[18];
//dis_zone[3]=discode_low[18];
dis_zone[1]=discode_cap[5];
dis_zone[2]=discode_low[18];
dis_zone[3]=discode_low[18];
dis_zone[4]=0x00;
dis_zone[5]=discode_num[7];
display_1621();
alarm(800);
//此处延时很长,目的是让使用者
//看清楚错误号。
delay_nms(5000);
//alarm(200);
}
display_1621();
}
//菜单二:小数点位置选择
//dis_zone[0]=discode_low[4]; //LCD第一个字位显示”d“
//dis_zone[1]=0xec; //LCD第一个字位显示”P“
dis_zone[0]=discode_low[4];
dis_zone[1]=discode_low[16];
dis_zone[2]=0x00;
dis_zone[3]=0x00;
dis_zone[4]=0x00;
while(1)
{
if(TARE==0)
{
delay_nms(50);
if(TARE==0)
{
while(!TARE);
alarm(200);//按键音
count_point++;
if(count_point==6)
count_point=0;
}
}
if(MENU==0)
{
delay_nms(50);
if(MENU==0)
{
while(!MENU);
alarm(200);//按键音
buf_24c02_4B[1]=count_point;
break;
}
}
dis_zone[5]=discode_num[count_point];
display_1621();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -