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

📄 dema.lst

📁 这个是汽车制动台控制程序的C语言版本. 用于实际产品中.单片机用的是PIC16F877A.
💻 LST
📖 第 1 页 / 共 2 页
字号:
   158:                         Delay(D_SHAKE_H,D_SHAKE_L);                                             //去抖动延时

   159:                         if(!ENSURE){

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

   161:                                 break;                                                                          //退出循环,进入标定

   162:                         }

   163:                 }else if(!ADD_ONE){                                                                     //加1键按下

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

   165:                         if(!ADD_ONE){

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

   167:                                 Clear_Zero(ptr,Adc_Adverage(object));           //调用清0函数

   168:                         }

   169:                 }

   170:         }

   171: 

   172: //对控制参数初始化

   173:         i = 0;

   174:         point_number = 0;

   175:         flicker = 0;            

   176:         bit_value = 0;

   177:         current_bit = 3;

   178:         set_value = 0;

   179:         Init_Tmr1();

   180: 

   181: //正式进入标定状态

   182:         while(1){

   183: //判断要做何种操作

   184:                 if(!ESC){

   185:                         Delay(D_SHAKE_H,D_SHAKE_L);

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

   187:                                 Dema_Release();

   188: 

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

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

   191:                                 My_Write(ptr,DEMA_POINT_SIZE,address);          

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

   193:                                 Normal_Display();

   194:                                 return FALSE;           

   195:                         }

   196:                 }else if(!ENSURE){

   197:                         Delay(D_SHAKE_H,D_SHAKE_L);

   198:                         if(!ENSURE){                                                                                    //确认键按下

   199:                                 Dema_Release();

   200:                                 if(point_number < 9){

   201:                                         ptr[point_number * 2 + 1] = Adc_Adverage(object);       //存放当前标定点的AD值

   202:                                                                                                                                                 //存放当前标定点的设定值,转换成16进制格式       ,设定值为BCD码          

   203:                                         ptr[point_number * 2 + 2] = Bcd_Hex(set_value); 

   204:                                 }

   205:                                 ++point_number;

   206:                                 if(point_number >= 2 && point_number != 0xa)

   207:                                         ptr[0] = point_number;          

   208:                                 if(point_number == 0xa){                                                                //如果到达允许的标定点数,返回

   209: 

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

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

   212:                                         My_Write(ptr,DEMA_POINT_SIZE,address);

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

   214:                                         Normal_Display();

   215:                                         return FALSE;

   216:                                 }

   217:                                 bit_value = 0;                                                                          //进入对下一点的标定,复位相关设定值

   218:                                 current_bit = 3;

   219:                                 set_value = 0x0;

   220:                         }

   221:                 }else if(!MOVE){

   222:                         Delay(D_SHAKE_H,D_SHAKE_L);

   223:                         if(!MOVE){                                                                                              //移位键按下

   224:                                 Dema_Release();

   225:                                 --current_bit;                                                                          //操作位加1

   226:                                 bit_value = 0;                                                                          //位设置值设定为0

   227:                                 if(current_bit > 3){

   228:                                         current_bit = 3;                                                                //操作位溢出,刷新位操作 

   229:                                 }       

   230:                         }

   231:                 }else if(!ADD_ONE){

   232:                         Delay(D_SHAKE_H,D_SHAKE_L);

   233:                         if(!ADD_ONE){                                                                                   //加1键按下

   234:                                 Dema_Release();

   235:                                 ++bit_value;                                                                            //位设定值加1

   236:                                 if(bit_value > 9){

   237:                                         bit_value = 0;                                                                  //位设定值溢出,位设定值清0

   238:                                 }

   239: 

   240:                                 //将当前操作位的值填入制动设置变量中

   241:                                 switch(current_bit){                            

   242:                                         case ZER0:                                                                              //当前设定位是最低位

   243:                                                 set_value &= 0xfff0;

   244:                                                 set_value |= bit_value;

   245:                                                 break;

   246:                                         case ONE:                                                                               //当前设定位是次低位

   247:                                                 set_value &= 0xff0f;

   248:                                                 set_value |= bit_value << 4;

   249:                                                 break;

   250:                                         case TWO:                                                                               //当前设定位是次高位

   251:                                                 set_value &= 0xf0ff;

   252:                                                 set_value |= bit_value << 8;

   253:                                                 break;

   254:                                         case THREE:                                                                             //当前设定位是最高位

   255:                                                 set_value &= 0x0fff;

   256:                                                 set_value |= bit_value << 12;   

   257:                                                 break;

   258:                                         default:                                                                                //出错

   259:                                                 break;

   260:                                 }

   261:                                 display_data[TWO] = set_value;

   262:                         }               

   263:                 }else if(TMR1IF ){                                                                      //检测闪烁时间是否已到

   264:                         // 每隔0.1秒向上位机发送实时数据

   265:                         realtime = Hex_Bcd(Count_Force(ptr,Adc_Adverage(object)));

   266:                         send_buffer[0] = '*';

   267:                         send_buffer[1] = (unsigned char)(realtime >> 12 & 0x0f) + '0';

   268:                         send_buffer[2] = (unsigned char)(realtime >> 8 & 0x0f) + '0';

   269:                         send_buffer[3] = (unsigned char)(realtime >> 4 & 0x0f) + '0';

   270:                         send_buffer[4] = (unsigned char)(realtime & 0x0f) + '0';

   271:                         send_buffer[5] = '#';

   272:                         Send_Computer(send_buffer, 6);                                  // 向上位机送数

   273: 

   274:                         Init_Tmr1();                                                                    //更新TMR1设定

   275:                         i++;                                                                                    //时间参数加1

   276:                         if(i >= 3){

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

   278:                                 display_data[object] = realtime;

   279:                                 Display(display_data,DISPLAY_SIZE);                                                             //开显示

   280:                                 i = 0;                                                                          //时间已到,时间参数复位

   281:                                 flicker ^= 0x1;                                                         //标志位取反

   282:                                 if(!flicker){

   283:                                         display_data[TWO] = set_value;                  //显示设定值

   284:                                 }else{

   285:                                         temp = set_value;

   286:                                         switch(current_bit){                            

   287:                                                 case ZER0:                                                                              //当前设定位是最低位

   288:                                                         temp &= 0xfff0;

   289:                                                         temp |= 0xe;

   290:                                                         break;

   291:                                                 case ONE:                                                                               //当前设定位是次低位

   292:                                                         temp &= 0xff0f;

   293:                                                         temp |= 0xe0;

   294:                                                         break;

   295:                                                 case TWO:                                                                               //当前设定位是次高位

   296:                                                         temp &= 0xf0ff;

   297:                                                         temp |= 0xe00;

   298:                                                         break;

   299:                                                 case THREE:                                                                             //当前设定位是最高位

   300:                                                         temp &= 0x0fff;

   301:                                                         temp |= 0xe000; 

   302:                                                         break;

   303:                                                 default:                                                                                //出错

   304:                                                         break;

   305:                                         }

   306:                                         display_data[TWO] = temp;                               //显示屏蔽掉当前位的设定值

   307:                                 }

   308:                         }

   309:                 }

   310:         }

   311: }

   312: 

⌨️ 快捷键说明

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