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

📄 work._c

📁 AVRkaifashili.rar
💻 _C
字号:
//**********************FileName:Work.c**************************//
//**********************ICCAVR6.30编译****************************//
#include <io8535v.h>
#include <macros.h>
#define uchar unsigned char
#define uint  unsigned int

//引脚信号定义
#define  KEY_0 (PINA&0x01)     //PA0装票键 
#define  KEY_1 (PINA&0x02)     //PA1打印页码键
#define  KEY_2 (PINA&0x04)     //PA2盖章键 

#define  SONSOR_0 (PINB&0x01)  //PB0前传感器
#define  SONSOR_1 (PINB&0x02)  //PB1中传感器
#define  SONSOR_2 (PINB&0x04)  //PB2后传感器
#define  SONSOR_3 (PINB&0x08)  //PB3纸传感器
#define  SONSOR_4 (PINB&0x10)  //PB4字轮传感器
#define  SONSOR_5 (PINB&0x20)  //PB5行走左传感器
#define  SONSOR_6 (PINB&0x40)  //PB6行走右传感器

#define  SIGN_ON1   (PORTD=PORTD|0x01) //PD0=1盖章工作指示灯输出
#define  SIGN_ON0   (PORTD=PORTD&0xfe) //PD0=0盖章工作指示灯输出
#define  SIGN_OFF1  (PORTD=PORTD|0x02) //PD1=1盖章结束指示灯输出管脚
#define  SIGN_OFF0  (PORTD=PORTD&0xfd) //PD1=0盖章结束指示灯输出管脚
#define  PRINT_ON1  (PORTD=PORTD|0x08) //PD3=1打印页码工作指示灯输出管脚
#define  PRINT_ON0  (PORTD=PORTD&0xf7) //PD3=0打印页码工作指示灯输出管脚
#define  PRINT_OFF1 (PORTD=PORTD|0x10) //PD4=1打印页码结束指示灯输出管脚
#define  PRINT_OFF0 (PORTD=PORTD&0xef) //PD4=1打印页码结束指示灯输出管脚

#define  GRASP_ACT1 (PORTC=PORTC|0x01) //PC0抓纸机械手输出管脚
#define  GRASP_ACT0 (PORTC=PORTC&0xfe) //PC0抓纸机械手输出管脚
#define  PRINT_ACT1 (PORTC=PORTC|0x02) //PC1字轮击打电磁铁输出管脚
#define  PRINT_ACT0 (PORTC=PORTC&0xfd) //PC1字轮击打电磁铁输出管脚
#define  SIGN_ACT1  (PORTC=PORTC|0x04) //PC2盖章击打电磁铁输出管脚
#define  SIGN_ACT0  (PORTC=PORTC&0xfb) //PC2盖章击打电磁铁输出管脚
#define  M_DIR1     (PORTC=PORTC|0x08) //PC3电机方向输出管脚
#define  M_DIR0     (PORTC=PORTC&0xf7) //PC3电机方向输出管脚
#define  M3_pulse1  (PORTC=PORTC|0x10) //PC4字轮电机脉冲输出管脚
#define  M3_pulse0  (PORTC=PORTC&0xef) //PC4字轮电机脉冲输出管脚
#define  M2_pulse1  (PORTC=PORTC|0x20) //PC5行走电机脉冲输出管脚
#define  M2_pulse0  (PORTC=PORTC&0xdf) //PC5行走电机脉冲输出管脚
#define  M1_pulse1  (PORTC=PORTC|0x40) //PC6装票电机脉冲输出管脚
#define  M1_pulse0  (PORTC=PORTC&0xbf) //PC6装票电机脉冲输出管脚

uchar KeyDown;  //有功能键按下标志
uchar Cancell;  //取消功能键标志
uint  u;        //翻页步进电机的步数变量
uint  b;        //页码序号的不同位数之间差值的中间变量    
uchar FunkeyNum;//功能按键的标号变量
uchar R_Step;   //页码序号之间的距离(数字间距)所需的步进电机的步数

//*****************I/O口初始化*****************************
void IO_Init(void)
{DDRA=0x00;//A口三态输入
 PORTA=0x00;
 DDRB=0x00;//B口三态输入
 PORTB=0x00;
 DDRC=0xff;//C口推挽输出
 PORTC=0xff;
 DDRD=0xfb;//D口推挽输出,PD2中断输入
 PORTD=0xfb;
}
//*************************中断初始化函数************************//
void INT_Init(void)
{MCUCR=MCUCR&0xfd;//低电平中断
 GIMSK=GIMSK|0x40;//INT0中断使能
 SREG=SREG|0x80;//全局中断使能
}

//***************************短延时函数************************//
void DelayShort(uint j)                        
{uint i;
 for(i=0;i<j;i++) ;  
}

//***************************长延时函数************************//
void DelayLong(uint j)                
{uint i;
 for(i=0;i<j;i++)
   {uint l;
    for(l=0;l<1000;l++);}    
}
//*************************按键扫描函数************************//
void FunkeyScan()
{KeyDown=0;
 FunkeyNum=3;
 if(KEY_0==0)
  {DelayLong(10);       //去抖动延时10ms
   if(KEY_0==0)
    {FunkeyNum=0;       //按键的标号变量值赋0
     KeyDown=1;}}       //PA0  装票功能键按下
 if(KEY_1==0)
  {DelayLong(10);       //去抖动延时10ms
   if(KEY_1==0)
    {FunkeyNum=1;       //按键的标号变量值赋1
     KeyDown=1;}}       //PA1  盖章功能键按下
 if(KEY_2==0)
  {DelayLong(10);       //去抖动延时10ms
   if(KEY_2==0)
    {FunkeyNum=2;       //按键的标号变量值赋2
     KeyDown=1;}}       //PA2 打码功能键按下
}
//******************装票步进电机频率函数***********************//
void PulseZhuangPiao()     
{
   DelayShort(45);      //装票步进电机周期45us
   M1_pulse1;           //Pc7=1
   DelayShort(45);      //装票步进电机周期45us
   M1_pulse0;           //Pc7=0
}
//******************翻页步进电机频率函数***********************//
void PulseXingZou()
{
   DelayShort(35);      //翻页步进电机周期35us
   M2_pulse1;           //Pc6=1
   DelayShort(35);      //翻页步进电机周期35us
   M2_pulse0;           //Pc6=0
}
//******************字轮步进电机频率函数***********************//
void PulseZiLun()        
{
   DelayShort(55);      //字轮电机周期55us
   M3_pulse0;           //Pc5=0
   DelayShort(55);      //字轮电机周期55us
   M3_pulse1;           //Pc5=1
}
//***************打印数码的电磁击打锤动作函数******************//
void Print_Act()
{
   PRINT_ACT1;           //打字电磁铁打下      
   DelayLong(5);         //打字电磁铁打下时间延时20(*1000)us
   PRINT_ACT0;           //打字电磁铁上升     
   DelayLong(20);        //打字电磁铁上升时间延时20(*1000)us
}
//***************盖章的电磁击打锤动作函数**********************//
void Sign_Act()
{
   SIGN_ACT1;            //盖章电磁铁打下     
   DelayLong(20);        //盖章电磁铁打下时间延时20(*1000)us
   SIGN_ACT0;            //盖章电磁铁打下   
   DelayLong(20);        //盖章电磁铁上升时间延时20(*1000)us
}
//***************翻页电机行走字间距函数************************//
void  Num_Step()
{
   M_DIR0;                //翻页电机反转
   for(u=0;u<40;u++)      //翻页电机行走的字间距即步进电机的40步
    PulseXingZou();       
}
//***************翻页电机行走抓纸张函数************************//
void Reverse_Step()
{
  unsigned int i;
  for(i=0;i<350;i++)      //居中以后再走100吸纸
   { 
    M_DIR0;               //翻页电机反转
    PulseXingZou();       //翻页电机驱动脉冲输出
   }
    GRASP_ACT1;           //机械手抓纸
   while(SONSOR_5==0)     //检测传感器5
   { 
    M_DIR0;               //翻页电机反转
    PulseXingZou();       //翻页电机驱动脉冲输出
   }
}
//***************翻页电机行走上电后复位函数********************//
void Forward_Step()
{
   while(SONSOR_6==0)     //检测传感器6
   { 
    M_DIR1;               //翻页电机正转
    PulseXingZou();       //翻页电机驱动脉冲输出
   }
    M_DIR0;               //翻页电机反转
    for(u=0;u<400;u++)    //翻页电机居中
    {
     PulseXingZou();      //翻页电机驱动脉冲输出
    } 
}
//***************字轮电机转动方向及步数判断函数1****************//
void  Judge1()           //判断字轮正反转
 {
  if(b>10){R_Step=(20-b)*12; M_DIR1;}  
  else {R_Step=b*12; M_DIR0; }  
 }
//***************字轮电机转动方向及步数判断函数2****************//
void  Judge2()           //判断字轮正反转
{
  if(b>10){R_Step=(20-b)*12; M_DIR0;}  
  else {R_Step=b*12; M_DIR1; }  
}
//***************机械手配合翻页电机翻页过程函数*****************//
void MotorZhua_fangZhi()
{Reverse_Step();
 u=0;
 DelayLong(5);           //吸纸延时10*(1000)	 
  while(SONSOR_6==0)     //检测传感器6
   {   
      M_DIR1;            //翻页电机正转  
      u++;
      PulseXingZou();    //翻页电机驱动脉冲输出 
      if(u==380){ GRASP_ACT0;}   //抓纸机械手后翻页电机往正转380步放纸
    }
}
//******************装票步进电机出仓过程函数********************//
void Motor3QianZou()
{
 M_DIR1;                   //装票步进电机出仓方向
 while(SONSOR_0==0)        //检测前传感器                  
      PulseZhuangPiao();   //承票板往前走	 
}
//******************装票步进电机入仓过程函数********************//
void Motor3HouZhong()
{
 uchar e;
 while(SONSOR_1==0)             //检测中传感器
	     {
         M_DIR0;                //装票步进电机入仓方向
		 PulseZhuangPiao();     //装票步进电机驱动脉冲输出
		 }
		 for(e=0;e<55;e++)      //修正传感器位置误差55
		 {
		  M_DIR0;               //装票步进电机入仓方向
		  PulseZhuangPiao();    //装票步进电机驱动脉冲输出
          }
}
//*********装票步进电机入仓后再进入盖章位置的过程函数***********//
void Motor3HouZou()
{
       M_DIR0;                  //装票步进电机入仓方向
	while(SONSOR_2==0)          //检测后传感器
       PulseZhuangPiao();       //装票步进电机驱动脉冲输出
}
//*********************装票过程函数*****************************//
void Motor3()
{
Motor3QianZou();                //调用装票步进电机出仓过程函数
Motor3HouZhong();               //调用装票步进电机入仓过程函数
}
//*******装票步进电机入仓后再进入盖章位置的逆过程函数***********//
void Motor3QianZhong()
{uint i;
 M_DIR1;                         //装票步进电机出方向
 while(SONSOR_1==0)              //检测中传感器
	     {
		 PulseZhuangPiao();      //装票步进电机驱动脉冲输出
		 }
 for(i=0;i<20;i++)               //修正传感器位置误差20
    PulseZhuangPiao();           //装票步进电机驱动脉冲输出
}
//***************翻页电机打印页码过程中复位函数*****************//
void Motor1_Fuwei()
{
  Reverse_Step();               //翻页电机行走抓纸张函数
  DelayLong(5);    
   while(SONSOR_6==0)           //检测中传感器5
   { 
    M_DIR1;                     //翻页电机正转
   PulseXingZou();              //翻页电机行驱动脉冲输出
	}
    M_DIR0;                     //翻页电机反转
}
//***************字轮电机打印页码过程中复位函数*****************//
void Motor2_Fuwei()
{
   M_DIR0;                      //字轮电机反转            
   while(SONSOR_4==0)           //检测字轮定位传感器
     {
      PulseZiLun();             //字轮电机行驱动脉冲输出 
     }
}
//***********字轮电机与翻页电机配合打印页码过程函数*************//
void Motor12_Dama()
{
uchar k=0;
uchar p;
while(SONSOR_3==0)              //纸张传感器为0(有票据)时执行循环
 {
    for(u=0;u<150;u++)          //字轮电机进入打印位置
     {
	  M_DIR0;                   //字轮电机反转
      PulseXingZou();	        //字轮电机行驱动脉冲输出
     }                          
     Motor2_Fuwei();            //字轮电机复位 
     p=0;
     if(k<10)                                   
	   {
	     b=k+k;
         Judge1();
		 for(u=0;u<R_Step;u++)     //字轮电机转到打印位置
         {PulseZiLun(); }     
         Print_Act();
	    }

	  else
	   {
	    b=k/10+k/10;               //取整的余数(个位数的值)
         Judge1();
		 for(u=0;u<R_Step;u++)     //字轮电机转到打印位置
         {PulseZiLun(); }   
         Print_Act();              //打印个位数
        p=2*(k%10);                //取整的值(十位数的值)
         if(p>b)
		   {
		     b=p-b;
			 Judge1();
		   }
		   else
		   {
		     b=b-p;
		     Judge2();
		    }
		 for(u=0;u<R_Step;u++)    //字轮电机转到打印位置
         {PulseZiLun(); }   
         Print_Act();             //打印十位数
	   }

     k++;
    MotorZhua_fangZhi();          //翻页
	 if(Cancell==1)
     goto OUT2;
 }
 OUT2:  
 Cancell=0;                       //取消动作并进行翻页复位
 for(u=0;u<450;u++) 
     {
	  M_DIR0; 
      PulseXingZou();	   
     }   
}
//**************装票电机与翻页电机配合的盖章过程函数*************//
void MotorGaiZhang()
{
 while(SONSOR_3==0)         //纸张传感器位为0时执行循环
 { 
   Motor3HouZou();          //进入盖章位置
   Sign_Act();              //盖章动作
   Motor3QianZhong();       //进入翻页位置
   MotorZhua_fangZhi();     //翻页
    if(Cancell==1)          //检测取消标志
   goto OUT3;
 }
OUT3: 
 Cancell=0;                 //取消动作
}
//*********************************主程序***********************************//
void main(void)
{ INT_Init();            //初始化中断	
 begin: 	
	Cancell=0; 
	SIGN_ACT0;           //盖章击打电磁铁1吸起	
    PRINT_ACT0;          //打印页码击打电磁铁2吸起
    GRASP_ACT0;          //抓纸机械手不动作
	Forward_Step();        //翻页步进电机复位
	Motor3HouZou();        //承票板往后走
  	Motor3QianZhong();     //承票板往中间走进行复位
 do{do {FunkeyScan();} while(KeyDown==0); 
   	switch(FunkeyNum)
		{case 0:                     //装票操作             
			    Motor3();                   
				break;									 
         case 1 :                     //盖章操作
				Motor3QianZou();      //出仓				 
          wait1:
				while(KEY_1!=0);
                while(KEY_1==0) 
                   {DelayLong(50);
                    if(KEY_1==0)
                        Motor3HouZhong(); //入仓
                    else goto wait1;}
				SIGN_ON0;                     
                SIGN_OFF1;              //盖章进行中指示灯亮
			    Motor3HouZou();         //进入盖章位置
				MotorGaiZhang();        //盖章函数调用
			    Motor3QianZhong();		//退出盖章位置 
                SIGN_ON1;                     
                SIGN_OFF0;              //盖章结束指示灯亮
				break;
        case 2:                         //打印页码
                Motor3QianZou();        //出仓
         wait2: while(KEY_2!=0); 
                while(KEY_2==0) 
                   {if(KEY_2==0)
                     Motor3HouZhong();  //入仓
					else goto wait2;}
				PRINT_ON0;                     
                PRINT_OFF1;             //打印页码进行指示灯亮
                Motor1_Fuwei();          
				Motor12_Dama();         //打印页码  
				PRINT_ON1;                     
                PRINT_OFF0;             //打印页结束指示灯亮
				break;
		default:break;}}while(1);
}

//**************************中断服务程序*******************************//
#pragma interrupt_handler INTHandler:2
void INTHandler()  
{Cancell=1;                             //置位取消标志 
 NOP();
}

⌨️ 快捷键说明

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