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

📄 icc_gmj.lst

📁 一款挂面机的自动化控制源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0018) #define K1 2      
(0019) //1
(0020) #define INC_SPEED 2
(0021) //增速
(0022) #define K2 3      
(0023) //2
(0024) #define DEC_SPEED 3
(0025) //减速
(0026) #define K3 4
(0027) //4
(0028) #define SET 4
(0029) //设定
(0030) #define K4 6
(0031) //4
(0032) #define SPEED 6
(0033) //速度
(0034) #define K5 7
(0035) //5
(0036) #define COUNT 7
(0037) //计数
(0038) #define K6 8
(0039) //8
(0040) #define SUM 8
(0041) //累计
(0042) #define K0 9
(0043) //9
(0044) #define CLEAR 9
(0045) //清零
(0046) #define K7 10
(0047) //7
(0048) #define MIAN_LENGTH 10
(0049) //面长
(0050) #define K8 11
(0051) //8
(0052) #define CUT_NUM 11
(0053) //刀数
(0054) #define K9 12
(0055) //9
(0056) #define JIGAN 12
(0057) //积杆
(0058) #define M_ZHUANBI 4000  
(0059) //转刀一周步进电机的步数
(0060)  
(0061) ///////////////  全局变量定义
(0062) unsigned char M_state=0;  //步进电机的运行状态
(0063) /*
(0064) 0:停转
(0065) 1:启动
(0066) 2:减速至停转
(0067) 3:加速至随动
(0068) 4:减速至随动
(0069) 5:随动
(0070) 6:加速至碎刀
(0071) 7:碎刀
(0072) 8:转动至平行
(0073) */
(0074) unsigned int step_num=0;  //步进电机相对平行点的占步数
(0075) //unsigned char M_maichong; //步进电机的脉冲
(0076) unsigned int tmp_t1=64536; //计时器1的当前数值
(0077) unsigned char qidong_num=0;      //启动过程中步进电机所走的占步数
(0078) unsigned char dec_speed_bz=0;    //启动减速标志
(0079) unsigned int dec_speed_num=0;    //减速所走的步数
(0080) float DW_juli;    //单位距离
(0081) float P_speed;    //皮带速度
(0082) float juli;       //切刀到杆切点的距离
(0083) unsigned char time0_chi;  //计时器0的次数(256的倍数)
(0084) unsigned char time0_yu;   //计时器0的余数(整除256后所得的余数)
(0085) unsigned char time0_fen;  //如果余数太小,则从次数中分出一次来,和余数加在一起分担剩余的时间
(0086) unsigned char pidai_yunxing=0;   //皮带运行:1表示正常运行,0表示停止运行
(0087) float set_speed;   //设定的转速******
(0088) unsigned char dj_jibie=0;    //电磁调速电动机速度增减的级别
(0089) unsigned char dj_fangxi=0;   //电磁调速电动机调速的方向
(0090) unsigned char on_scr=0;      //可控硅导通标志
(0091) unsigned int pre_jsq=2000;      //上一次可控硅触发计时
(0092) unsigned char key=0;    //按键的键值
(0093) unsigned char on_key=0; //有键按下的标志
(0094) unsigned char key_num=0;  //计数,每计50查一次按键
(0095) unsigned char next_gan=0; //过下一杆标志
(0096) unsigned char guogan=0;   //开始正式过杆的标志
(0097) float dw_speed=0.00000025;      //一个时间单位所走的毫米数*******
(0098) float ganwei;   //杆位:挂面杆相对于切点的位置
(0099) float next_ganwei;   //下一杆的杆位
(0100) float juli_jcd;      //检测点到切点的距离*******
(0101) float ganju;        //两根挂面杆的距离*******
(0102) float longth_guamian;   //切好的挂面的长度*******
(0103) float longth_zongmian;  //一杆上挂面的总长度*******
(0104) unsigned char jidao;    //一杆面共切几刀
(0105) unsigned char first_gan=1; //第一杆标志
(0106) unsigned char qidong=0;   //步进电机是否起动
(0107) unsigned char jileigan=0;  //累积的杆数
(0108) unsigned char max_ganshu=10;  //积累杆数的上限
(0109) unsigned char caoshu=0;  //高速标志
(0110) float current_speed;     //当前速度
(0111) float caogan_speed;      //高速时的速度
(0112) unsigned char menu_jb=0;   //菜单级别
(0113) unsigned char menu_gn=0;      //菜单功能码  
(0114) char *string1;
(0115) char string2[]="    PASS"; 
(0116) char tmp_string[9];          //输入参数时,显示的数字
(0117) unsigned char cs_num=0;        //当前参数的位数
(0118)  char *str_dis;
(0119) 
(0120) ///////////////
(0121) void port_init(void)
(0122) {
(0123)  PORTA = 0x00;
_port_init:
    0380 2422      CLR	R2
    0381 BA2B      OUT	0x1B,R2
(0124)  DDRA  = 0x00;
    0382 BA2A      OUT	0x1A,R2
(0125)  PORTB = 0xF0;
    0383 EF80      LDI	R24,0xF0
    0384 BB88      OUT	0x18,R24
(0126)  DDRB  = 0xF0;
    0385 BB87      OUT	0x17,R24
(0127)  PORTC = 0x00; //m103 output only
    0386 BA25      OUT	0x15,R2
(0128)  DDRC  = 0xC0;
    0387 EC80      LDI	R24,0xC0
    0388 BB84      OUT	0x14,R24
(0129)  PORTD = 0x00;
    0389 BA22      OUT	0x12,R2
(0130)  DDRD  = 0x00;
    038A BA21      OUT	0x11,R2
    038B 9508      RET
_read_adc:
  adc_jg               --> R20
  adc_L                --> R20
  adc_H                --> R22
    038C 940E0FB9  CALL	push_gset2
(0131) }
(0132) 
(0133) unsigned int read_adc(void)  //读取模数转换的值,即测速发电机的电压值
(0134) {
(0135) unsigned char adc_H,adc_L;
(0136) unsigned int adc_jg;
(0137) adc_L=ADCL;
    038E B144      IN	R20,0x04
(0138) adc_H=ADCH;
    038F B165      IN	R22,0x05
(0139) adc_jg=adc_H*256+adc_L;
    0390 2F26      MOV	R18,R22
    0391 2733      CLR	R19
    0392 E000      LDI	R16,0
    0393 E011      LDI	R17,1
    0394 940E0F97  CALL	empy16s
    0396 0118      MOVW	R2,R16
    0397 2E44      MOV	R4,R20
    0398 2455      CLR	R5
    0399 0C24      ADD	R2,R4
    039A 1C35      ADC	R3,R5
    039B 01A1      MOVW	R20,R2
(0140) return adc_jg;
    039C 0181      MOVW	R16,R2
    039D 940E0FA7  CALL	pop_gset2
    039F 9508      RET
(0141) }
(0142) //TIMER0 initialize - prescale:8
(0143) // WGM: Normal
(0144) // desired value: 1Hz
(0145) // actual value: Out of range
(0146) void timer0_init(void)
(0147) {
(0148)  TCCR0 = 0x00; //stop
_timer0_init:
    03A0 2422      CLR	R2
    03A1 BE23      OUT	0x33,R2
(0149)  TCNT0 = 0x00 /*INVALID SETTING*/; //set count
    03A2 BE22      OUT	0x32,R2
(0150)  OCR0  = 0x00 /*INVALID SETTING*/;  //set compare
    03A3 BE2C      OUT	0x3C,R2
(0151)  TCCR0 = 0x02; //start timer
    03A4 E082      LDI	R24,2
    03A5 BF83      OUT	0x33,R24
    03A6 9508      RET
_timer0_ovf_isr:
  i                    --> R16
    03A7 922A      ST	R2,-Y
    03A8 923A      ST	R3,-Y
    03A9 930A      ST	R16,-Y
    03AA 938A      ST	R24,-Y
    03AB B62F      IN	R2,0x3F
    03AC 922A      ST	R2,-Y
(0152) }
(0153) 
(0154) #pragma interrupt_handler timer0_ovf_isr:10
(0155) void timer0_ovf_isr(void)  
(0156) {
(0157) unsigned char i; 
(0158) if (on_scr==1)   //如果可控硅触发标志为1,则触发可控硅
    03AD 9180006C  LDS	R24,on_scr
    03AF 3081      CPI	R24,1
    03B0 F471      BNE	0x03BF
(0159)    {
(0160)    TCCR0=0;
    03B1 2422      CLR	R2
    03B2 BE23      OUT	0x33,R2
(0161)    PORTC=PORTC | 0b01000000;
    03B3 9AAE      SBI	0x15,6
(0162)    for (i=0;i<20;i++)  ;
    03B4 2700      CLR	R16
    03B5 C001      RJMP	0x03B7
    03B6 9503      INC	R16
    03B7 3104      CPI	R16,0x14
    03B8 F3E8      BCS	0x03B6
(0163)    PORTC=PORTC & 0b10111111;
    03B9 B385      IN	R24,0x15
    03BA 7B8F      ANDI	R24,0xBF
    03BB BB85      OUT	0x15,R24
(0164)    on_scr=0;
    03BC 2422      CLR	R2
    03BD 9220006C  STS	on_scr,R2
(0165)    }
(0166) if (time0_chi>0) //如果计数器0次数大于0,则重新开始(0-255)的计时
    03BF 2422      CLR	R2
    03C0 90300110  LDS	R3,time0_chi
    03C2 1423      CP	R2,R3
    03C3 F440      BCC	0x03CC
(0167)    {
(0168)    TCNT0=0;
    03C4 BE22      OUT	0x32,R2
(0169)    TCCR0=2;
    03C5 E082      LDI	R24,2
    03C6 BF83      OUT	0x33,R24
(0170)    time0_chi--;
    03C7 2D83      MOV	R24,R3
    03C8 5081      SUBI	R24,1
    03C9 93800110  STS	time0_chi,R24
(0171)    }
    03CB C013      RJMP	0x03DF
(0172) else
(0173)    {
(0174)    if (time0_fen>0)
    03CC 2422      CLR	R2
    03CD 9030010E  LDS	R3,time0_fen
    03CF 1423      CP	R2,R3
    03D0 F430      BCC	0x03D7
(0175)       {
(0176) 	  TCNT0=time0_fen;
    03D1 BE32      OUT	0x32,R3
(0177) 	  TCCR0=2;
    03D2 E082      LDI	R24,2
    03D3 BF83      OUT	0x33,R24
(0178) 	  time0_fen=0;
    03D4 9220010E  STS	time0_fen,R2
(0179) 	  }
    03D6 C008      RJMP	0x03DF
(0180)    else
(0181)       {
(0182) 	  TCNT0=time0_yu;
    03D7 9020010F  LDS	R2,time0_yu
    03D9 BE22      OUT	0x32,R2
(0183) 	  TCCR0=2;
    03DA E082      LDI	R24,2
    03DB BF83      OUT	0x33,R24
(0184) 	  on_scr=1;
    03DC E081      LDI	R24,1
    03DD 9380006C  STS	on_scr,R24
(0185) 	  }
(0186)    }
    03DF 9029      LD	R2,Y+
    03E0 BE2F      OUT	0x3F,R2
    03E1 9189      LD	R24,Y+
    03E2 9109      LD	R16,Y+
    03E3 9039      LD	R3,Y+
    03E4 9029      LD	R2,Y+
    03E5 9518      RETI
(0187) 
(0188) }
(0189) 
(0190) //TIMER1 initialize - prescale:8
(0191) // WGM: 0) Normal, TOP=0xFFFF
(0192) // desired value: 1Hz
(0193) // actual value: Out of range
(0194) void timer1_init(void)
(0195) {
(0196)  TCCR1B = 0x00; //stop
_timer1_init:
    03E6 2422      CLR	R2
    03E7 BC2E      OUT	0x2E,R2
(0197)  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
    03E8 BC2D      OUT	0x2D,R2
(0198)  TCNT1L = 0x00 /*INVALID SETTING*/;
    03E9 BC2C      OUT	0x2C,R2
(0199)  OCR1AH = 0x00 /*INVALID SETTING*/;
    03EA BC2B      OUT	0x2B,R2
(0200)  OCR1AL = 0x00 /*INVALID SETTING*/;
    03EB BC2A      OUT	0x2A,R2
(0201)  OCR1BH = 0x00 /*INVALID SETTING*/;
    03EC BC29      OUT	0x29,R2
(0202)  OCR1BL = 0x00 /*INVALID SETTING*/;
    03ED BC28      OUT	0x28,R2
(0203)  //OCR1CH = $OCR1CH$;
(0204)  //OCR1CL = $OCR1CL$;
(0205)  ICR1H  = 0x00 /*INVALID SETTING*/;
    03EE BC27      OUT	0x27,R2
(0206)  ICR1L  = 0x00 /*INVALID SETTING*/;
    03EF BC26      OUT	0x26,R2
(0207)  TCCR1A = 0x00;
    03F0 BC2F      OUT	0x2F,R2
(0208)  TCCR1B = 0x02; //start Timer
    03F1 E082      LDI	R24,2
    03F2 BD8E      OUT	0x2E,R24
    03F3 9508      RET
_timer1_ovf_isr:
  avg_speed            --> R12
  time1_jsq            --> R10
  i                    --> R12
    03F4 920A      ST	R0,-Y
    03F5 921A      ST	R1,-Y
    03F6 922A      ST	R2,-Y
    03F7 923A      ST	R3,-Y
    03F8 924A      ST	R4,-Y
    03F9 925A      ST	R5,-Y
    03FA 926A      ST	R6,-Y
    03FB 927A      ST	R7,-Y
    03FC 928A      ST	R8,-Y
    03FD 929A      ST	R9,-Y
    03FE 930A      ST	R16,-Y
    03FF 931A      ST	R17,-Y
    0400 932A      ST	R18,-Y
    0401 933A      ST	R19,-Y
    0402 938A      ST	R24,-Y
    0403 939A      ST	R25,-Y
    0404 93EA      ST	R30,-Y
    0405 93FA      ST	R31,-Y
    0406 B60F      IN	R0,0x3F
    0407 920A      ST	R0,-Y
    0408 940E0FB3  CALL	push_gset5
    040A 9724      SBIW	R28,4
(0209) }
(0210) 
(0211) #pragma interrupt_handler timer1_ovf_isr:9
(0212) void timer1_ovf_isr(void)  //步进电机控制
(0213) {
(0214)  unsigned char i;  //循环变量
(0215)  unsigned int time1_jsq;   //time1的时间值
(0216)  unsigned int avg_speed;   //平均速度
(0217)  if (M_state==0)   //停止状态
    040B 90200060  LDS	R2,M_state
    040D 2022      TST	R2
    040E F409      BNE	0x0410
(0218)     {
(0219) 	return;
    040F C22F      RJMP	0x063F
(0220) 	}
(0221)  //TIMER1 has overflowed
(0222) TCNT1 = tmp_t1;   //计数器赋初值
    0410 90200063  LDS	R2,tmp_t1
    0412 90300064  LDS	R3,tmp_t1+1
    0414 BC3D      OUT	0x2D,R3
    0415 BC2C      OUT	0x2C,R2
(0223) PORTC |=0b10000000;      //给出步进电机驱动脉冲
    0416 9AAF      SBI	0x15,7
(0224) for (i=0;i<5;i++);
    0417 24CC      CLR	R12
    0418 C001      RJMP	0x041A
    0419 94C3      INC	R12
    041A 2D8C      MOV	R24,R12
    041B 3085      CPI	R24,5
    041C F3E0      BCS	0x0419
(0225) PORTC &=0b01111111; 
    041D B385      IN	R24,0x15
    041E 778F      ANDI	R24,0x7F
    041F BB85      OUT	0x15,R24
(0226) step_num++;     //计步加一
    0420 91800061  LDS	R24,step_num
    0422 91900062  LDS	R25,step_num+1
    0424 9601      ADIW	R24,1
    0425 93900062  STS	step_num+1,R25
    0427 93800061  STS	step_num,R24
(0227) time1_jsq=65535-tmp_t1+1;;
    0429 90200063  LDS	R2,tmp_t1
    042B 90300064  LDS	R3,tmp_t1+1
    042D EF8F      LDI	R24,0xFF
    042E EF9F      LDI	R25,0xFF
    042F 1982      SUB	R24,R2
    0430 0993      SBC	R25,R3
    0431 9601      ADIW	R24,1
    0432 015C      MOVW	R10,R24
(0228)  switch (M_state)
    0433 90E00060  LDS	R14,M_state
    0435 24FF      CLR	R15
    0436 01C7      MOVW	R24,R14
    0437 3081      CPI	R24,1
    0438 E0E0      LDI	R30,0
    0439 079E      CPC	R25,R30
    043A F121      BEQ	0x045F
    043B 3082      CPI	R24,2
    043C E0E0      LDI	R30,0
    043D 079E      CPC	R25,R30
    043E F409      BNE	0x0440
    043F C034      RJMP	0x0474
    0440 3083      CPI	R24,3
    0441 E0E0      LDI	R30,0
    0442 079E      CPC	R25,R30
    0443 F409      BNE	0x0445
    0444 C075      RJMP	0x04BA
    0445 3084      CPI	R24,4
    0446 E0E0      LDI	R30,0
    0447 079E      CPC	R25,R30
    0448 F409      BNE	0x044A
    0449 C070      RJMP	0x04BA
    044A 3085      CPI	R24,5
    044B E0E0      LDI	R30,0
    044C 079E      CPC	R25,R30

⌨️ 快捷键说明

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