📄 work._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 + -