新闻  |   论坛  |   博客  |   在线研讨会
C8051F340波纹管生产线计数程序
于言江 | 2009-08-11 12:08:18    阅读:2339   发布文章

/*--------------------------------------------------------------------- 文件名称: JSQIII_main.C 初始作者: 于言江 初始版本: V2.0 功能说明: 此程序用于波纹管生产线计数。 1、根据选用波纹管模块的不同自动调整系数以适应各种波纹管的计数。 2、可设置长度报警,达到设定长度时报警提示,也可接自动切割机。 3、具有长度校准功能。 初始日期: 2009年8月03日 修改版本: 修改内容: 修改日期: CPU 型号: C8051F340 软件工具: keil ----------------------------------------------------------------------------*/ #include "c8051F340.h" #include "INTRINS.H" #define delay_time_scan 100 /*修改键盘扫描去抖时间*/ #define Flicker_time 600 /*修改闪烁时间*/ #define FlashAddress 0x3a00 //存取Flash数据的地址 //永久保存数据(数据地址0x3a00) #define ElementX 10 //定义存储数组元素的个数 #define Alert_time 5000 /*修改报警时间*/ /***************************************************** 变量声明 ******************************************************/ sbit SET =P2^5;//设置按键 sbit NEXT=P2^6;//光标移位按键 sbit UP =P2^7;//增数按键 sbit OUT =P1^7;//输出 bit SETUP_flag;//设置标志 “1”进入设置状态;“0”退出设置状态。 bit key_action_flag;//按键动作标志 bit Flicker_flag;//闪烁标志 bit save_flag;//保存标志 bit out_flag;//输出标志 bit error_flag;//错误标志 unsigned char key_data,delay_T2;//键盘数据,按键延时 unsigned char Cursor;//光标 unsigned int data_reg,set_reg,set_reg_Comparison; unsigned int Flicker_Count;//闪烁时间计数 unsigned int OUT_Count;//输出倒计时 unsigned char LED_INC; unsigned char LED_BCD[8]; unsigned int long_data;//产品长度数据 unsigned long count_data;//产品计数 unsigned char MODE;//模块编码 #define AA 10 #define yy 17 #define JJ 18 #define uu 19 #define iii 20 #define nn 21 #define GG 22 #define nop 16 unsigned char code name_tab[]={yy,uu,nop,yy,AA,nn,nop,JJ,iii,nn,GG,nop}; // 0 1 2 3 4 5 6 7 8 9 A b c d E F 灭 y J u i n G unsigned char code LED_CODE_TAB[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x05,0x31,0x73,0x61,0x13,0x17,0xff,0x29,0x69,0xf1,0xf7,0x75,0x91}; unsigned int ApplyNumber;//用户可以应用的数 unsigned long ADdataInc; unsigned char idata test_string[ElementX];//将被拷贝到FLASH中的字符串 #define UFW075 0.033 // 1号 波峰/米:304, 单位分米 #define UFW085 0.033 // 2号 波峰/米:297, #define UFW10 0.033 // 3号 波峰/米:300, #define UFW13 0.035 // 4号 波峰/米:284, #define UFW17 0.041 // 5号 波峰/米:240, #define UFW22 0.043 // 6号 波峰/米:233, #define UFW23 0.043 // 7号 波峰/米:, #define UFW26 0.047 // 8号 波峰/米:217, #define UFW29 0.051 // 9号 波峰/米:199, #define UFW37 0.051 //10号 波峰/米:197, */ float code Tube_Name_TAB[]={0,UFW075,UFW085,UFW10,UFW13,UFW17,UFW22,UFW23,UFW26,UFW29,UFW37}; //float code Tube_Name_TAB[]={1,1,1,1,1,1,1,1,1,1,1,1}; /*==================================================================================== ====================================================================================*/ void Timer_Init(void){ TCON = 0x01; TMOD = 0x05; CKCON = 0x02; TH0 = 0x00; TL0 = 0x00; TMR2CN = 0x24; TMR2RLH = 0x80; TMR2H = 0x80; } void Port_IO_Init(void){ P0MDOUT = 0x00; P1MDOUT = 0xF7; P2MDOUT = 0xe0; P3MDOUT = 0x00; P4MDOUT = 0x00; P0SKIP = 0x01; XBR0 = 0x01; XBR1 = 0xd0; //d0 } void Oscillator_Init(void){ OSCICN = 0x83; // Set internal oscillator to run // at its maximum frequency } void Interrupts_Init(void){ IP = 0x02; IE = 0xA2; EIE1 = 0x10; EIP1 = 0x10; IT01CF = 0x00; } /***************************************************** 初始化 ******************************************************/ void Init_Device(void){//MCU驱动初始化 Timer_Init(); //定时器初始化 Port_IO_Init(); //IO引脚初始化 Oscillator_Init(); //时钟初始化 Interrupts_Init(); //中断初始化 } /***************************************************** 延时函数(1ms) ******************************************************/ void delay_s(unsigned int ms){ unsigned int i,j; for (i=0;i=delay_time_scan){ if(key_tmp!=0xe0){ delay_T2=0;//计时清零 key_action_flag=1;//按键动作 if(key_tmp==0xc0){ key_data=1; SETUP_flag=~SETUP_flag;//设置标志“1”有效;“0”无效。 Cursor=SETUP_flag;//光标有效 if(SETUP_flag){ set_reg_Comparison=set_reg;//暂保存原始设置的数据,用于判断是否需要将设置的数据存入FLASH。 save_flag=1;//保存标志 } }else if(key_tmp==0xa0){ if(SETUP_flag){ Cursor++;if(Cursor4)Cursor=1;//光标移动 } }else if(key_tmp==0x60){ if(SETUP_flag){ LED_BCD[Cursor-1]++; if(LED_BCD[Cursor-1]9)LED_BCD[Cursor-1]=0;//增值:0--9循环 BCD_TO_HEX(); }else{ count_data=0; } } } } } //-----------------------------------按键“抬起”后执行此段程序 if((key_tmp==0xe0)&(key_action_flag)){ delay_T2++; if(delay_T2=delay_time_scan){ delay_T2=0;//计时清零 key_action_flag=0; key_data=0; } } } /***************************************************** HEX转换为BCD码 转换函数 ******************************************************/ void HEX_TO_BCD(unsigned int hex,hex1){ EA=0; //++++++++++++++++++++++++++ LED_BCD[3]=hex/1000;hex=hex%1000; LED_BCD[2]=hex/100;hex=hex%100; LED_BCD[1]=hex/10;hex=hex%10; LED_BCD[0]=hex; //-------------------------- if(!SETUP_flag){ if(LED_BCD[3]==0){ LED_BCD[3]=16; if(LED_BCD[2]==0){ LED_BCD[2]=16; } } } //++++++++++++++++++++++++++ LED_BCD[7]=hex1/1000;hex1=hex1%1000; LED_BCD[6]=hex1/100;hex1=hex1%100; LED_BCD[5]=hex1/10;hex1=hex1%10; LED_BCD[4]=hex1; //-------------------------- if(!SETUP_flag){ if(LED_BCD[7]==0){ LED_BCD[7]=16; if(LED_BCD[6]==0){ LED_BCD[6]=16; if(LED_BCD[5]==0){ LED_BCD[5]=16; } } } } //++++++++++++++++++++++++++ EA=1; } /***************************************************** 显示函数 YUYANJIANG ******************************************************/ unsigned char JinWei_flag;//千进位标志 void display(void){ P3=(0xff); //消除阴影 if(LED_INC==0){ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □.■ if((Flicker_flag)&(Cursor==1)){ P3=(0xff); }else{ P3=(0xef); } } if(LED_INC==1){ P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■.□ if((Flicker_flag)&(Cursor==2)){ P3=(0xff); }else{ P3=(0xdf); } } if(LED_INC==2){ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■ □.□ if((Flicker_flag)&(Cursor==3)){ P3=(0xff); }else{ P3=(0x7f); } } if(LED_INC==3){ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //■ □ □.□ if((Flicker_flag)&(Cursor==4)){ P3=(0xff); }else{ P3=(0xbf); } } //-------------------------------- if(LED_INC==4){ if(JinWei_flag==4){ P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □ ■. }else{ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □ ■ } P3=(0xfb); } if(LED_INC==5){ if(JinWei_flag==3){ P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■.□ }else{ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■ □ } P3=(0xf7); } if(LED_INC==6){ if(JinWei_flag==2){ P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■.□ □ }else{ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■ □ □ } P3=(0xfe); } if(LED_INC==7){ if(JinWei_flag==1){ P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //■.□ □ □ }else{ P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //■ □ □ □ } P3=(0xfd); } //-------------------------------- LED_INC++; if(LED_INC=8){ LED_INC=0; } } /////////////////////////////////////////////////////////////// unsigned long count_dis;//计数高于四位数乘十再显示。 void get_count_data(void){ //计数 unsigned char tmpH,tmpL; unsigned int inc=0; EA=0; tmpL=TL0;TL0=0; tmpH=TH0;TH0=0; inc=tmpH;inc=incFlicker_time){ Flicker_flag=~Flicker_flag; Flicker_Count=0; } if(!TF2H){ TF2L=0; }else{ TF2L=0; TF2H=0; TMR2RLH = 0xb3;//0xb3 TMR2RLL = 0x80;//0xf0 } display(); key_scan(); if(out_flag){ OUT_Count=Alert_time; out_flag=0; } if(OUT_Count!=0){ OUT_Count--; if(OUT_Count==0){ OUT=1; } } TR2=1; } /***************************************************** Flash存取程序 ******************************************************/ //----------------------------------------------------- //Flash存取程序开始 void Save_Flash(void){// 程序存储器空间的指针(FLASH), 指向待写地址 unsigned char *pgen; // 一般指针 unsigned char xdata *pwrite; unsigned int j=ElementX, ii; EA=0; // 擦除512字节的信息页(位于'FlashAddress') FLSCL = 0x80; // 设置FLASH标度寄存器(对2MHz系统时钟) PSCTL = 0x03; // 将PSWE和PSEE置‘1’MOVX指令写对应的FLASH页 pwrite =FlashAddress; // 将指针指向待擦除页 FLKEY=0xa5; FLKEY=0xf1;//开锁,//每写一个字节都要开锁一次 *pwrite = 0xff; // 启动擦除过程 PSCTL = 0x01; // 清除PSEE,PSWE仍然置1 // MOVX指令将写到对应的地址 // 拷贝字符串 的内容到FLASH页,从地址FlashAddress开始。 pgen = test_string; //指针pgen 指向源字符串 do { FLKEY=0xa5;FLKEY=0xf1;//开锁,******每写一个字节必须开锁一次****** *pwrite++ = *pgen; //拷贝字节 j--;pgen++; }while(j!=0); //直到NULL结束符 FLSCL = 0x80; // 设置FLASH标度寄存器(对2MHz系统时钟) PSCTL = 0x00; // 将PSWE和PSEE置‘0’MOVX指令不能写FLASH页 for(ii=0;ii8; test_string[i]=ch2;i++; test_string[i]=ch1; } //----------------------------------------------------- //从数组中读取数据,参数为数组中第几组数据 Read_Data(unsigned char Element){ unsigned char i,ch1,ch2; int IntData; i=Element*2; ch1=test_string[i];i++; ch2=test_string[i]; IntData=ch1; IntData=IntData4; LED_BCD[1]=0x0f&hex;hex=hex4; LED_BCD[2]=0x0f&hex;hex=hex4; LED_BCD[3]=0x0f&hex; //-------------------------- if(!SETUP_flag){ if(LED_BCD[3]==0){ LED_BCD[3]=16; if(LED_BCD[2]==0){ LED_BCD[2]=16; } } } //++++++++++++++++++++++++++ EA=1; } /***************************************************** 模块识别函数 ******************************************************/ unsigned char pdata Comp=0; unsigned int Comp_k[]={0,0xF075,0xF085,0xF100,0xF130,0xF170,0xF220,0xF230,0xF260,0xF290,0xF370}; unsigned code code_k[]={0,6,10,2,0,4,8,0,0,5,9,1,0,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void identify_mode(void){ //识别 unsigned char i,k; TR2=0; EA=0; P2=0xff; k=((~(P2&0x1f))&0x1f); MODE=code_k[k];k=MODE; if((k10)|(k==0)){ /*目前只有种“10”型号,所以此数只到“9”*/ error_flag=1;//如果没有模块插入则报错 }else { error_flag=0; } EA=1; TR2=1; /*每次装入新模块显示模块编号20秒钟左右*/ if(Comp!=MODE){ Comp=MODE; delay_s(20); for(i=0;i=set_reg){ if(OUT_Count==0){ out_flag=1; OUT=0; } long_data=0;count_data=0; } //---------------------------------------------------------------------------------------- 显示 if(SETUP_flag){ //选择正运行显示与设置数据显示 HEX_TO_BCD(set_reg,0); }else if(error_flag==0){ HEX_TO_BCD(long_data,count_dis); }else if(error_flag==1){ HEX_TO_BCD(long_data,count_dis/*=0*/); } //---------------------------------------------------------------------------------------- 存储 if((!SETUP_flag)&(set_reg_Comparison!=set_reg)&(save_flag)){//避免多次存储 Int_to_Char(set_reg,0); Save_Flash(); save_flag=0; } } }

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客