📄 ha0_de.c
字号:
//----------------------------------------
buf=bian_liang;
buf = bian_liang/1000;
num[ table ] = Number[ buf ]; //--------取出千位的数据
buf = bian_liang%1000;
buf /= 100;
num[ table + 1 ] = Number[ buf ];//-------取出百位的数据
buf=bian_liang%100;
buf/=10;
num[ table + 2 ] = Number[ buf ];//-------取出十位的数据
buf = bian_liang % 10;
buf %= 10;
num[ table + 3 ] = Number[buf];//-------取出个位的数据
if ( bian_liang < 10 ) num[ table + 0 ] = num[ table + 1 ] = 0;
else if ( bian_liang < 100 ) num[ table + 0 ] = num[ table + 1 ] = 0;
else if ( bian_liang < 1000 ) num[ table + 0 ] = 0;
}
//--------------------------------读TLC2543---------------------------
unsigned int read2543(unsigned char port)
{
unsigned int ad = 0,i;
CLOCK = 0;
CS = 0;
port <<= 4;
for(i = 0 ;i < 12;i++)
{
if(DOUT) ad |= 0x01;
DINT = (bit)(port&0x80);
CLOCK = 1;
delay(1);
CLOCK = 0;
delay(1);
port <<= 1;
ad <<= 1;
}
CS = 1;
ad >>= 1;
return(ad);
}
//------------------------------------与上位机通信-----------------------------------
void send(uint weight)
{ uint shu;
if(flag)
{ ES = 0; RI = 0;
FSCX( 0x23 );//#号开始
FSCX( 0x2d );//-
shu = weight / 1000 ;
FSCX( shu + 0x30 );//千 位
weight %= 1000;
shu = weight / 100;
FSCX( shu + 0x30 );//百位
weight %= 100;
shu = weight / 10;weight %= 10 ;
FSCX( shu + 0x30 ) ;//十位
shu = weight;
FSCX( shu + 0x30 ) ;//个位
ES = 1;
}
}
//-----------------------------------接收数据//处理成显示数据---------------------------------
void take(void) //表中第八个开始为CMD显示
{
if(data_chuan[4] == 0x23) //**第五位是否为位止字节"#"
{ //是则前面接收的是CMD命令
cmd = (data_chuan[0] - 30) * 1000;
num[8] = Number[data_chuan[0] - 30] ; //显示千位的CMD
cmd += (data_chuan[1] - 30) * 100;
num[9] = Number[data_chuan[1] - 30] ; //显示百位的CMD
cmd += (data_chuan[2] - 30) * 10;
num[10] = Number[data_chuan[2] - 30] ; //显示十位的CMD
cmd += data_chuan[3] - 30;
num[11] = Number[data_chuan[3] - 30] ; //显示个位的CMD
}
}
//-----------------------------------串口发送数据--------------------------------------
void FSCX(int dat)
{
SBUF = dat;
a: if(TI == 0)goto a;
TI = 0;
}
//-----------------------------------延时程序-------------------------------------------
void delay(uint i)
{
while(i--);
}
//---------------------------------水位控制----------------------------
void ctrl(void)
{
if((cmd > weight) && flag == 1)//泵启动条件:系统开启 且 输入设定值大于重量
pump = 1;
else //泵关闭条件:系统关闭 或 输入设定值小于重量
pump = 0;
}
//------------------------------------键盘输入------------------------------
void key(void)
{
uint kk = 0x00; //存放键盘扫描码
if( ( P1&0xe0 ) != 0xe0 )
{
kk = P1 & 0xe0 ;
switch( kk )
{
case 0xc0 : //开始键按下
while( a == 0 );
if( com != 0 )flag =! flag;TR0 =! TR0;
miao = shi_miao = shi_fen = fen = 0;//开始计时
CLEAR(); break;
case 0xa0: //加命令 最大1500 步进50
while( b == 0 ) ; cmd += 50 ; if ( cmd >= 3000 ) cmd = 30000 ; break ;
case 0x60: //减命令 最小50 步进50
while( c == 0 ) ; cmd -= 50 ; if ( cmd <= 50 ) cmd = 50 ; break ;
}
}
}
//------------------------------------计时程序------------------------------------------
void time0(void) interrupt 1 using 2 /*电机定时中断*/
{
time ++ ;
if ( time >= 4500 ) //秒进一
{
time = 0 ;
miao += 1 ;
if( ( miao == 10 ) && ( shi_miao == 5 ) ) //秒进到十 十位进到五时 分加一 前两个清零
{ fen += 1 ; shi_miao = 0 ; miao = 0 ; }
if ( miao == 10 ) //秒到十 十秒进一 秒清零
{ shi_miao += 1; miao = 0; }
if ( fen == 10 ) //分到十 十位进一 分清零
{ shi_fen += 1; fen = 0; }
if( shi_fen == 6 ) //分十位到六 全部都清零
shi_fen = shi_miao = miao = fen = 0;
}
}
//-----------------------------------串口接收中断------------------------------
void ComInINT ( void ) interrupt 4 using 1
{
ES=0; //关中断
RI=0; //清零RI
switch (SBUF)
{
case 0x2f: flag = 1; CLEAR(); jie=0;break;
case 0x2d: flag = 0; CLEAR();jie=0; break;
default: data_chuan [ jie ]=SBUF;
if ( ( data_chuan [ jie ] >= 30 ) && ( data_chuan [ jie ] <= 39 ) )
{
data_chuan[ jie ] -= 0x30;jie ++ ;
}
else data_chuan [ jie ] = 0;
if(SBUF == 0x2C)
{
ming_ling=data_chuan[0]*1000+data_chuan[1]*100+data_chuan[2]*10+data_chuan[3];
switch(jie)
{
case 0:ming_ling/=1000;break;
case 1:ming_ling/=100;break;
case 2:ming_ling/=10;break;
}
}
}
ES=1; //开中断
cmd=ming_ling;
}
//------------------------------------处理重量程序------------------------------------
void get_weight ( void )
{
long int ad_temp=0,w;
for(w=0;w<100;w++)
{
ad_temp += read2543(0x00);
}
ad_temp/=100;
ad = ad_temp ;
weight=ad * 2 - 350;
}
//------((((((((((((((((((((((((((((((主程序))))))))))))))))))))))))))))))))))))))))))
void main()
{
INT_1(); // 初始化函数
CLEAR(); // 清屏函数
start();
while(1)
{
pump=0;
key();//扫描键盘
get_weight();//采集重量数据
make_data( 4 , weight );//处理重量显示数据
play(); //显示
take(); //向上位机传输重量数据
while ( flag )
{
key();//扫描键盘
get_weight(); //采集重量数据
make_data( 4 , weight );//处理重量显示数据
ctrl(); //继电器控制
make_data( 8 ,cmd ); //处理设定值
send(weight); //向上位机传送重量
play(); //显示
take();
}
}
}
//----------------------------------THE END----------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -