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

📄 dema.lst

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

     2: * 对标定函数的说明:

     3: *                               1 与标定操作有关的按键: "WEIGH_DEMA","FORCE_DEMA"

     4: *                                                                        "ESC","ENSURE","MOVE","ADD_ONE"

     5: *                               2 进入标定的条件: "WEIGH_DEMA"或"FORCE_DEMA"按下超过5秒钟

     6: *******************************************************************************************/

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

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

     9: 

    10: ////////////////////////////////////////////////////////////////////////////////////////////

    11: void Send_C(bank3 unsigned char *ptr,unsigned char number)

    12: {

    13:         for (;number > 0; number--){

    14:                 while(TRMT == 0){

    15:                                 ;                                       //等待发送器为空

    16:                 }

    17:                 TXREG = *(ptr++);                       //将要发送的数据装载到发数寄存器中

    18:         }

    19: }

    20: 

    21: /*******************************************************************************************

    22: * 最近修改日期:         05-4-14

    23: * 修改原因:             更改算法

    24: * 修改人:               饶阳胜

    25: * 说明:                 1 这种方法不好,是死循环

    26: /*******************************************************************************************

    27: * 函数名称:     void Froce_Dema_Release(void)

    28: * 功能:                 确认标键全部被松开

    29: * 入口参数:  无

    30: * 出口参数:     无

    31: * 全局变量:     无

    32: * 调用模块:  无

    33: * 设计者:       饶阳胜

    34: * 日期:                 05/3/4

    35: * 说明: 

    36: *******************************************************************************************/

    37: void Dema_Release()

    38: {

    39:         while(1){

    40:                 while(1){

    41:                         if(ESC & MOVE & ENSURE & ADD_ONE & WEIGH_DEMA & FORCE_DEMA)  break;     //判断 标定、移位、确认、加1按键全部松开

    42:                 }

    43:                 Delay(D_SHAKE_H, D_SHAKE_L);    //去抖动延时

    44:                 if(ESC & MOVE & ENSURE & ADD_ONE & WEIGH_DEMA & FORCE_DEMA)     break;  //判断 标定、移位、确认、加1按键全部松开

    45:         }

    46: }

    47: 

    48: /*******************************************************************************************

    49: * 最近修改日期:         05-4-1

    50: * 修改原因:             增加可移植性

    51: * 修改人:               饶阳胜

    52: /*******************************************************************************************

    53: * 函数名称:     void Clear_Zero(unsigned char SideSelect)

    54: * 功能:                 校正0点

    55: * 入口参数:     *ptr            指向标定对象的指针

    56: *                       ad_change       当前0点的AD值

    57: * 出口参数:     无

    58: * 全局变量:     无

    59: * 调用模块:     无

    60: * 设计者:       饶阳胜

    61: * 日期:                 05/3/17

    62: * 说明:                  ptr指针指向的第一个对象是:标定的点数

    63: *                               ----------二-------:标定点的AD值

    64: *                               ----------三-------:标定点的力值

    65: *                               后面依次类推

    66: *******************************************************************************************/

    67: void Clear_Zero(unsigned short *ptr,unsigned short ad_change)

    68: {

    69:         unsigned char i,j;

    70: 

    71:         ad_change -= ptr[1];                                                            //现在0点 - 原来的0点

    72:         for(i = 0,j = 1; i <= ptr[0]; i++,j += 2){                      //对所有的标定进行调整

    73:                 ptr[j] += ad_change;                                                    //更新标定点的AD值

    74:         }

    75: }                 

    76: 

    77: /*******************************************************************************************

    78: * 最近修改日期:         05-4-1

    79: * 修改原因:             简化代码

    80: * 修改人:               饶阳胜

    81: /*******************************************************************************************

    82: * 函数名称:     unsigned char Dema(void)

    83: * 功能:                 标定

    84: * 入口参数:

    85: * 出口参数:     无

    86: * 全局变量:

    87: * 调用模块:

    88: * 设计者:       饶阳胜

    89: * 日期:                 05-3-4

    90: * 说明:                 1 轴重标定时,当前轴重在第0显示窗口显示

    91: *                         制动力标定时,当前制动力值在第1个显示窗口显示

    92: ********************************************************************************************

    93: * 修 改 人: 饶阳胜

    94: * 日       期: 06-3-16

    95: * 原       因: 增加实时发送数据,加在进入标定后.

    96: *******************************************************************************************/

    97: unsigned char Dema(short *ptr,unsigned char object,unsigned char address)

    98: {

    99:         unsigned char i;                                

   100:         unsigned short set_value;               //制动力设定值

   101:         unsigned char bit_value;                //当前位的设定值

   102:         unsigned char current_bit;              //当前的操作位

   103:         static bit      flicker;                        //利用此标志位,来实现当前设定位闪烁显示

   104:         unsigned short temp;

   105:         unsigned char point_number;             //标定点数

   106:         unsigned short realtime;                // 

   107: 

   108:         display_data[0] = 0xFFFF;

   109:         display_data[1] = 0xFFFF;

   110:         display_data[2] = 0xFFFF;

   111:         Display(display_data,DISPLAY_SIZE);                     //所有显示变为"----",提示已进入轴重标定状态

   112:         Dema_Release();                                                         //等待按键松开

   113: 

   114:         if(object == WEIGH)

   115:                 display_weigh = 2;                                              //打开显示轴重标识

   116: 

   117: //依据标定对象的不同,关闭相关的显示

   118:         display_data[TWO] = 0xeeee;

   119:         display_data[object ^ 0x01] = 0xeeee;

   120: 

   121:         i = 0;

   122:         Init_Tmr1();

   123: //进入制动力正式标定前的功能选项

   124:         while(1){

   125:                 if(TMR1IF){

   126:                         Init_Tmr1();

   127:                         ++i;

   128:                         if(i >= 3){

   129:                                 i = 0;

   130:                                 display_data[object] = Hex_Bcd(Count_Force(ptr,Adc_Adverage(object)));  //算出当前制动力

   131: 

   132:                                 if(object == WEIGH){

   133:                                         send_buffer[0] = 0xf1;

   134:                                 }else{

   135:                                         send_buffer[0] = 0xf2;

   136:                                 }

   137:                                 send_buffer[1] = display_data[object] >> 8;

   138:                                 send_buffer[2] = display_data[object];

   139:                                 send_buffer[3] = 0xf3;

   140:                                 Send_Computer(send_buffer,4);                                                                           //向上位机送果                          

   141:                                 

   142:                                 Display(display_data,DISPLAY_SIZE);                                                                             //显示当前制动力                                

   143:                         }

   144:                 }       

   145:                 if(!ESC){                                                                                       //标定键按下

   146:                         Delay(D_SHAKE_H,D_SHAKE_L);                                             //去抖动延时

   147:                         if(!ESC){                                                                               //标定键确实被按下

   148:                                 Dema_Release();                                                         //等待按键被松开

   149: 

   150: //不知道是什么原因,如果只调用一次,写入的第一个字节的数据会出错,找不到原因

   151: //不得已,调用了两次写EEPROM函数

   152:                                 My_Write(ptr,DEMA_POINT_SIZE,address);

   153:                                 My_Write(ptr,DEMA_POINT_SIZE,address);                  //将制动力标定数据写到EEPROM中

   154:                                 Normal_Display();

   155:                                 return FALSE;                                                           //标定返回

   156:                         }

   157:                 }else if(!ENSURE){                                                                      //确认键按下

⌨️ 快捷键说明

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