?? wwork.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 + -