⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure.lst

📁 这个是汽车制动台控制程序的C语言版本. 用于实际产品中.单片机用的是PIC16F877A.
💻 LST
字号:
     1: /******************************************************************************************

     2: * 此函数用于检测轴重与制动力

     3: ******************************************************************************************/

     4: #include <pic.h>                                //包含系统头文件

     5: #include "total.h"                              //包含项目头文件

     6: 

     7: const unsigned char  command_table[3] = {0x03, 0x02, 0x01};

     8: /******************************************************************************************

     9: * 最后修改日期: 05-4-30

    10: * 修改原因:             添加注释

    11: * 修改人:               饶阳胜

    12: /******************************************************************************************

    13: * 函数名称:     unsigned char Measure_Weign(void)

    14: * 功能:                 轮重检测

    15: * 入口参数:     无

    16: * 出口参数:     无

    17: * 全局变量:     f_motor_weigh           前轮重

    18: *                       b_motor_weigh           后轮重

    19: *                       weigh_side                      轮标识

    20: *                       display_weigh           轴重标识

    21: *                       display_data[]          显示数组

    22: *                       send_buffer[]           发送数据数组

    23: *

    24: * 调用模块:     Init_Tmr1();            初始化TMR1函数

    25: *                       Count_Force();          计算函数

    26: *                       Display();                      显示函数

    27: *                       Send_Computer();        向上位机发送数据函数    

    28: *                       Hex_Bcd();                      16进制数转BCD码函数

    29: *                       di();                           关中断函数

    30: *                       ei();                           开中断函数

    31: *

    32: * 设计者:       饶阳胜

    33: * 日期:                 05-3-4

    34: * 说明:                 1 检测前轮时,在第0个窗口显示

    35: *                         检测后轮时,在第1个窗口显示    

    36: *                       2 要显示小数点

    37: *******************************************************************************************/

    38: unsigned char Measure_Weigh(void)

    39: {

    40:         unsigned char i;

    41:     unsigned short temp_weigh;                                  //轮重的临时变量

    42: 

    43:         if(!(weigh_side & 0x01)){

    44:                 f_motor_weigh = 0;                                              // 前轮重清0

    45:                 b_motor_weigh = 0;                                              // 后轮重清0

    46:                 display_data[1] = 0;                                    // 第1显示窗口清0

    47:         }

    48:         Init_Tmr1();

    49:         for(i = 0; i < 100; i++){                                                                                       //要连续10S钟超过10Kg

    50:                 while(!TMR1IF){

    51:                         if((temp_weigh = Count_Force(dema_weigh,Adc_Adverage(WEIGH))) < 100)

    52:                         {

    53:                                 display_data[weigh_side] = 0;

    54:                                 display_data[2] = display_data[0] + display_data[1];

    55:                 Display(display_data,DISPLAY_SIZE);                                                     //显示

    56:                 return;

    57:                         }

    58:                         if(!weigh_side )                                        //是前轮

    59:                                 f_motor_weigh = temp_weigh;                                                             //取前轮重

    60:                         else                                                            //是后轮                        

    61:                                 b_motor_weigh = temp_weigh;                                                             //取后轮重      

    62:                         display_data[weigh_side] = Hex_Bcd(temp_weigh);                         

    63:                         display_data[2] = Hex_Bcd(f_motor_weigh + b_motor_weigh);       //第2个显示窗口显示总重

    64:                 }

    65:                 Init_Tmr1();

    66:                 if(!(i % 2))

    67:                         Display(display_data,DISPLAY_SIZE);                                                     //显示

    68:         }

    69:         Display(display_data,DISPLAY_SIZE);                                                                     //显示最终结果

    70:         send_buffer[0] = 0xFE;

    71:         if(!weigh_side){

    72:                 send_buffer[1] = 0xAA;

    73:         }else{

    74:                 send_buffer[1] = 0xBB;

    75:         }       

    76:         send_buffer[2] = display_data[weigh_side] >> 8;

    77:         send_buffer[3] = display_data[weigh_side];

    78:         send_buffer[4] = 0xED;

    79:         Send_Computer(send_buffer,5);                                                                           //向上位机送果

    80:         LIGHT = 1;                                                                                              //制动灯亮,提示称重完成

    81:         SelectDisplay273();

    82:         while(Count_Force(dema_weigh,Adc_Adverage(WEIGH)) >= 50);                       //等待车辆离台(轮重小于5Kg)

    83:         LIGHT = 0;                                                                                              //制动灯灭

    84:         SelectDisplay273();

    85:         di();                                                                                                                           //关中断,用于调整标志

    86:         weigh_side ^= 0x01;                                                                                                     //处理前后轮            

    87:         ei();                                                                                                                           //开中断                        

    88:     Delay(1000,500);    

    89: }

    90: 

    91: /******************************************************************************************

    92: * 函数名称:  unsigned char Measure_Trig()

    93: * 功能:                 制动检测

    94: * 入口参数:     

    95: * 出口参数:     

    96: * 全局变量:

    97: * 调用模块:     Init_Tmr1()                     TMR1初始化函数

    98: *                       SelectDisplay273()      选通输出函数

    99: *                       Delay()                         延时函数

   100: *                               

   101: *

   102: * 设计者:       饶阳胜

   103: * 日期:                 05-4-20

   104: * 说明:                 1 检测前轮制动力时,在第0个窗口显示

   105: *                         检测后轮制动力时,在第1个窗口显示

   106: *******************************************************************************************/

   107: unsigned char Measure_Trig(unsigned char side)

   108: {

   109:         unsigned char i;

   110:         short temp_force;                                                               //力的临时变量

   111: 

   112:         for(i = 0; i < 5; i++){                                                                 //到位信号要保持0.5秒钟

   113:                 Init_Tmr1();

   114:                 do{

   115:                         if(side == FRONT){

   116:                                 if(ARRIVE)      return;

   117:                         }

   118:                         else{

   119:                                 if(BACK_ARRIVE) return;

   120:                         }

   121:                 }while(!TMR1IF);

   122:         }

   123:         send_buffer[0] = 0xcc;

   124:         Send_Computer(send_buffer,1);

   125:         LOCK = 1;                                                                                               //松锁

   126:         SelectDisplay273();             

   127:         Delay(1080,500);                                                                                //延时5秒

   128:         LOCK = 0;                                                               

   129:         MOTOR = 1;                                                                                              //启动电机

   130:         SelectDisplay273();

   131:         Delay(720,500);                                                                                 //延时2S

   132:         if(side == FRONT){

   133:                 f_trig_force = 0;

   134:                 b_trig_force = 0;

   135:                 display_data[1] = 0;

   136:                 // 如果当前检的是前轮,则前轮和后轮的制动力清0

   137:         }

   138:         LIGHT = 1;                                                                                              //制动灯亮

   139:         SelectDisplay273();

   140:         Init_Tmr1();

   141:         for(i = 0; i < 200; i++){                                                               //采制动力,15S

   142:                 while(!TMR1IF){

   143:                         temp_force = Count_Force(dema_force,Adc_Adverage(FORCE));

   144:                         // 算当前制动力

   145:                         if(side == FRONT){                                                              //存储最大制动力        

   146:                                 if(temp_force > f_trig_force)

   147:                                         f_trig_force = temp_force;

   148:                         }else{

   149:                                 if(temp_force > b_trig_force)

   150:                                         b_trig_force = temp_force;

   151:                         }

   152:                         display_data[side] = Hex_Bcd(temp_force);                       // 当前轮的制动力

   153:                         display_data[2] = Hex_Bcd(f_trig_force + b_trig_force); // 制动和(最大和)

   154:                 }

   155:                 Init_Tmr1();

   156:                 if(!(i % 2))

   157:                         Display(display_data,DISPLAY_SIZE);                             //显示实时制动力

   158:         }

   159:         display_data[0] = Hex_Bcd(f_trig_force);                                //取最大制动力显示

   160:         display_data[1] = Hex_Bcd(b_trig_force);

   161:         Display(display_data,DISPLAY_SIZE);                                             //显示

   162:         send_buffer[0] = 0xff;

   163:         if(side == FRONT){

   164:                 send_buffer[1] = 0xAA;

   165:         }else{

   166:                 send_buffer[1] = 0xBB;

   167:         }

   168:         send_buffer[2] = display_data[side] >> 8;

   169:         send_buffer[3] = display_data[side];

   170:         send_buffer[4] = 0xee;

   171:         Send_Computer(send_buffer,5);                                                   //向上位机送结果

   172:         // 送检测结果,数据序列如下: FF -- XX XX EE 

   173:         LIGHT = 0;                                                                                              //制动灯灭              

   174:         MOTOR = 0;                                                                                              //电机关

   175:         BACK_CLOSE = 1;                 //后夹动作

   176:         SelectDisplay273();

   177:         Delay(540,500);                                                                         //延时3秒

   178:         BACK_CLOSE = 0;

   179:         SelectDisplay273();

   180: 

   181:         while(1){                                                                                               //等待到位信号无效

   182:                 while(1){

   183:                         if(ARRIVE & BACK_ARRIVE)

   184:                                 break;

   185:                 }

   186:                 Delay(D_SHAKE_H,D_SHAKE_L);

   187:                 if(ARRIVE & BACK_ARRIVE)

   188:                         break;

   189:         }

   190: }

   191: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -