?? work._c
字號(hào):
//**********************FileName:Work.c**************************//
//**********************ICCAVR6.30編譯****************************//
#include <io8535v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//引腳信號(hào)定義
#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蓋章結(jié)束指示燈輸出管腳
#define SIGN_OFF0 (PORTD=PORTD&0xfd) //PD1=0蓋章結(jié)束指示燈輸出管腳
#define PRINT_ON1 (PORTD=PORTD|0x08) //PD3=1打印頁碼工作指示燈輸出管腳
#define PRINT_ON0 (PORTD=PORTD&0xf7) //PD3=0打印頁碼工作指示燈輸出管腳
#define PRINT_OFF1 (PORTD=PORTD|0x10) //PD4=1打印頁碼結(jié)束指示燈輸出管腳
#define PRINT_OFF0 (PORTD=PORTD&0xef) //PD4=1打印頁碼結(jié)束指示燈輸出管腳
#define GRASP_ACT1 (PORTC=PORTC|0x01) //PC0抓紙機(jī)械手輸出管腳
#define GRASP_ACT0 (PORTC=PORTC&0xfe) //PC0抓紙機(jī)械手輸出管腳
#define PRINT_ACT1 (PORTC=PORTC|0x02) //PC1字輪擊打電磁鐵輸出管腳
#define PRINT_ACT0 (PORTC=PORTC&0xfd) //PC1字輪擊打電磁鐵輸出管腳
#define SIGN_ACT1 (PORTC=PORTC|0x04) //PC2蓋章?lián)舸螂姶盆F輸出管腳
#define SIGN_ACT0 (PORTC=PORTC&0xfb) //PC2蓋章?lián)舸螂姶盆F輸出管腳
#define M_DIR1 (PORTC=PORTC|0x08) //PC3電機(jī)方向輸出管腳
#define M_DIR0 (PORTC=PORTC&0xf7) //PC3電機(jī)方向輸出管腳
#define M3_pulse1 (PORTC=PORTC|0x10) //PC4字輪電機(jī)脈沖輸出管腳
#define M3_pulse0 (PORTC=PORTC&0xef) //PC4字輪電機(jī)脈沖輸出管腳
#define M2_pulse1 (PORTC=PORTC|0x20) //PC5行走電機(jī)脈沖輸出管腳
#define M2_pulse0 (PORTC=PORTC&0xdf) //PC5行走電機(jī)脈沖輸出管腳
#define M1_pulse1 (PORTC=PORTC|0x40) //PC6裝票電機(jī)脈沖輸出管腳
#define M1_pulse0 (PORTC=PORTC&0xbf) //PC6裝票電機(jī)脈沖輸出管腳
uchar KeyDown; //有功能鍵按下標(biāo)志
uchar Cancell; //取消功能鍵標(biāo)志
uint u; //翻頁步進(jìn)電機(jī)的步數(shù)變量
uint b; //頁碼序號(hào)的不同位數(shù)之間差值的中間變量
uchar FunkeyNum;//功能按鍵的標(biāo)號(hào)變量
uchar R_Step; //頁碼序號(hào)之間的距離(數(shù)字間距)所需的步進(jìn)電機(jī)的步數(shù)
//*****************I/O口初始化*****************************
void IO_Init(void)
{DDRA=0x00;//A口三態(tài)輸入
PORTA=0x00;
DDRB=0x00;//B口三態(tài)輸入
PORTB=0x00;
DDRC=0xff;//C口推挽輸出
PORTC=0xff;
DDRD=0xfb;//D口推挽輸出,PD2中斷輸入
PORTD=0xfb;
}
//*************************中斷初始化函數(shù)************************//
void INT_Init(void)
{MCUCR=MCUCR&0xfd;//低電平中斷
GIMSK=GIMSK|0x40;//INT0中斷使能
SREG=SREG|0x80;//全局中斷使能
}
//***************************短延時(shí)函數(shù)************************//
void DelayShort(uint j)
{uint i;
for(i=0;i<j;i++) ;
}
//***************************長(zhǎng)延時(shí)函數(shù)************************//
void DelayLong(uint j)
{uint i;
for(i=0;i<j;i++)
{uint l;
for(l=0;l<1000;l++);}
}
//*************************按鍵掃描函數(shù)************************//
void FunkeyScan()
{KeyDown=0;
FunkeyNum=3;
if(KEY_0==0)
{DelayLong(10); //去抖動(dòng)延時(shí)10ms
if(KEY_0==0)
{FunkeyNum=0; //按鍵的標(biāo)號(hào)變量值賦0
KeyDown=1;}} //PA0 裝票功能鍵按下
if(KEY_1==0)
{DelayLong(10); //去抖動(dòng)延時(shí)10ms
if(KEY_1==0)
{FunkeyNum=1; //按鍵的標(biāo)號(hào)變量值賦1
KeyDown=1;}} //PA1 蓋章功能鍵按下
if(KEY_2==0)
{DelayLong(10); //去抖動(dòng)延時(shí)10ms
if(KEY_2==0)
{FunkeyNum=2; //按鍵的標(biāo)號(hào)變量值賦2
KeyDown=1;}} //PA2 打碼功能鍵按下
}
//******************裝票步進(jìn)電機(jī)頻率函數(shù)***********************//
void PulseZhuangPiao()
{
DelayShort(45); //裝票步進(jìn)電機(jī)周期45us
M1_pulse1; //Pc7=1
DelayShort(45); //裝票步進(jìn)電機(jī)周期45us
M1_pulse0; //Pc7=0
}
//******************翻頁步進(jìn)電機(jī)頻率函數(shù)***********************//
void PulseXingZou()
{
DelayShort(35); //翻頁步進(jìn)電機(jī)周期35us
M2_pulse1; //Pc6=1
DelayShort(35); //翻頁步進(jìn)電機(jī)周期35us
M2_pulse0; //Pc6=0
}
//******************字輪步進(jìn)電機(jī)頻率函數(shù)***********************//
void PulseZiLun()
{
DelayShort(55); //字輪電機(jī)周期55us
M3_pulse0; //Pc5=0
DelayShort(55); //字輪電機(jī)周期55us
M3_pulse1; //Pc5=1
}
//***************打印數(shù)碼的電磁擊打錘動(dòng)作函數(shù)******************//
void Print_Act()
{
PRINT_ACT1; //打字電磁鐵打下
DelayLong(5); //打字電磁鐵打下時(shí)間延時(shí)20(*1000)us
PRINT_ACT0; //打字電磁鐵上升
DelayLong(20); //打字電磁鐵上升時(shí)間延時(shí)20(*1000)us
}
//***************蓋章的電磁擊打錘動(dòng)作函數(shù)**********************//
void Sign_Act()
{
SIGN_ACT1; //蓋章電磁鐵打下
DelayLong(20); //蓋章電磁鐵打下時(shí)間延時(shí)20(*1000)us
SIGN_ACT0; //蓋章電磁鐵打下
DelayLong(20); //蓋章電磁鐵上升時(shí)間延時(shí)20(*1000)us
}
//***************翻頁電機(jī)行走字間距函數(shù)************************//
void Num_Step()
{
M_DIR0; //翻頁電機(jī)反轉(zhuǎn)
for(u=0;u<40;u++) //翻頁電機(jī)行走的字間距即步進(jìn)電機(jī)的40步
PulseXingZou();
}
//***************翻頁電機(jī)行走抓紙張函數(shù)************************//
void Reverse_Step()
{
unsigned int i;
{
M_DIR0; //翻頁電機(jī)反轉(zhuǎn)
PulseXingZou(); //翻頁電機(jī)驅(qū)動(dòng)脈沖輸出
}
GRASP_ACT1; //機(jī)械手抓紙
while(SONSOR_5==0) //檢測(cè)傳感器5
{
M_DIR0; //翻頁電機(jī)反轉(zhuǎn)
PulseXingZou(); //翻頁電機(jī)驅(qū)動(dòng)脈沖輸出
}
}
//***************翻頁電機(jī)行走上電后復(fù)位函數(shù)********************//
void Forward_Step()
{
while(SONSOR_6==0) //檢測(cè)傳感器6
{
M_DIR1; //翻頁電機(jī)正轉(zhuǎn)
PulseXingZou(); //翻頁電機(jī)驅(qū)動(dòng)脈沖輸出
}
M_DIR0; //翻頁電機(jī)反轉(zhuǎn)
for(u=0;u<400;u++) //翻頁電機(jī)居中
{
PulseXingZou(); //翻頁電機(jī)驅(qū)動(dòng)脈沖輸出
}
}
//***************字輪電機(jī)轉(zhuǎn)動(dòng)方向及步數(shù)判斷函數(shù)1****************//
void Judge1() //判斷字輪正反轉(zhuǎn)
{
if(b>10){R_Step=(20-b)*12; M_DIR1;}
else {R_Step=b*12; M_DIR0; }
}
//***************字輪電機(jī)轉(zhuǎn)動(dòng)方向及步數(shù)判斷函數(shù)2****************//
void Judge2() //判斷字輪正反轉(zhuǎn)
{
if(b>10){R_Step=(20-b)*12; M_DIR0;}
else {R_Step=b*12; M_DIR1; }
}
//***************機(jī)械手配合翻頁電機(jī)翻頁過程函數(shù)*****************//
void MotorZhua_fangZhi()
{Reverse_Step();
u=0;
DelayLong(5); //吸紙延時(shí)10*(1000)
while(SONSOR_6==0) //檢測(cè)傳感器6
{
M_DIR1; //翻頁電機(jī)正轉(zhuǎn)
u++;
PulseXingZou(); //翻頁電機(jī)驅(qū)動(dòng)脈沖輸出
if(u==380){ GRASP_ACT0;} //抓紙機(jī)械手后翻頁電機(jī)往正轉(zhuǎn)380步放紙
}
}
//******************裝票步進(jìn)電機(jī)出倉(cāng)過程函數(shù)********************//
void Motor3QianZou()
{
M_DIR1; //裝票步進(jìn)電機(jī)出倉(cāng)方向
while(SONSOR_0==0) //檢測(cè)前傳感器
PulseZhuangPiao(); //承票板往前走
}
//******************裝票步進(jìn)電機(jī)入倉(cāng)過程函數(shù)********************//
void Motor3HouZhong()
{
uchar e;
while(SONSOR_1==0) //檢測(cè)中傳感器
{
M_DIR0; //裝票步進(jìn)電機(jī)入倉(cāng)方向
PulseZhuangPiao(); //裝票步進(jìn)電機(jī)驅(qū)動(dòng)脈沖輸出
}
for(e=0;e<55;e++) //修正傳感器位置誤差55
{
M_DIR0; //裝票步進(jìn)電機(jī)入倉(cāng)方向
PulseZhuangPiao(); //裝票步進(jìn)電機(jī)驅(qū)動(dòng)脈沖輸出
}
}
//*********裝票步進(jìn)電機(jī)入倉(cāng)后再進(jìn)入蓋章位置的過程函數(shù)***********//
void Motor3HouZou()
{
M_DIR0; //裝票步進(jìn)電機(jī)入倉(cāng)方向
while(SONSOR_2==0) //檢測(cè)后傳感器
PulseZhuangPiao(); //裝票步進(jìn)電機(jī)驅(qū)動(dòng)脈沖輸出
}
//*********************裝票過程函數(shù)*****************************//
void Motor3()
{
Motor3QianZou(); //調(diào)用裝票步進(jìn)電機(jī)出倉(cāng)過程函數(shù)
Motor3HouZhong(); //調(diào)用裝票步進(jìn)電機(jī)入倉(cāng)過程函數(shù)
}
//*******裝票步進(jìn)電機(jī)入倉(cāng)后再進(jìn)入蓋章位置的逆過程函數(shù)***********//
void Motor3QianZhong()
{uint i;
M_DIR1; //裝票步進(jìn)電機(jī)出方向
while(SONSOR_1==0) //檢測(cè)中傳感器
{
PulseZhuangPiao(); //裝票步進(jìn)電機(jī)驅(qū)動(dòng)脈沖輸出
}
for(i=0;i<20;i++) //修正傳感器位置誤差20
PulseZhuangPiao(); //裝票步進(jìn)電機(jī)驅(qū)動(dòng)脈沖輸出
}
//***************翻頁電機(jī)打印頁碼過程中復(fù)位函數(shù)*****************//
void Motor1_Fuwei()
{
Reverse_Step(); //翻頁電機(jī)行走抓紙張函數(shù)
DelayLong(5);
while(SONSOR_6==0) //檢測(cè)中傳感器5
{
M_DIR1; //翻頁電機(jī)正轉(zhuǎn)
PulseXingZou(); //翻頁電機(jī)行驅(qū)動(dòng)脈沖輸出
}
M_DIR0; //翻頁電機(jī)反轉(zhuǎn)
}
//***************字輪電機(jī)打印頁碼過程中復(fù)位函數(shù)*****************//
void Motor2_Fuwei()
{
M_DIR0; //字輪電機(jī)反轉(zhuǎn)
while(SONSOR_4==0) //檢測(cè)字輪定位傳感器
{
PulseZiLun(); //字輪電機(jī)行驅(qū)動(dòng)脈沖輸出
}
}
//***********字輪電機(jī)與翻頁電機(jī)配合打印頁碼過程函數(shù)*************//
void Motor12_Dama()
{
uchar k=0;
uchar p;
while(SONSOR_3==0) //紙張傳感器為0(有票據(jù))時(shí)執(zhí)行循環(huán)
{
for(u=0;u<150;u++) //字輪電機(jī)進(jìn)入打印位置
{
M_DIR0; //字輪電機(jī)反轉(zhuǎn)
PulseXingZou(); //字輪電機(jī)行驅(qū)動(dòng)脈沖輸出
}
Motor2_Fuwei(); //字輪電機(jī)復(fù)位
p=0;
if(k<10)
{
b=k+k;
Judge1();
for(u=0;u<R_Step;u++) //字輪電機(jī)轉(zhuǎn)到打印位置
{PulseZiLun(); }
Print_Act();
}
else
{
b=k/10+k/10; //取整的余數(shù)(個(gè)位數(shù)的值)
Judge1();
for(u=0;u<R_Step;u++) //字輪電機(jī)轉(zhuǎn)到打印位置
{PulseZiLun(); }
Print_Act(); //打印個(gè)位數(shù)
p=2*(k%10); //取整的值(十位數(shù)的值)
if(p>b)
{
b=p-b;
Judge1();
}
else
{
b=b-p;
Judge2();
}
for(u=0;u<R_Step;u++) //字輪電機(jī)轉(zhuǎn)到打印位置
{PulseZiLun(); }
Print_Act(); //打印十位數(shù)
}
k++;
MotorZhua_fangZhi(); //翻頁
if(Cancell==1)
goto OUT2;
}
OUT2:
Cancell=0; //取消動(dòng)作并進(jìn)行翻頁復(fù)位
for(u=0;u<450;u++)
{
M_DIR0;
PulseXingZou();
}
}
//**************裝票電機(jī)與翻頁電機(jī)配合的蓋章過程函數(shù)*************//
void MotorGaiZhang()
{
while(SONSOR_3==0) //紙張傳感器位為0時(shí)執(zhí)行循環(huán)
{
Motor3HouZou(); //進(jìn)入蓋章位置
Sign_Act(); //蓋章動(dòng)作
Motor3QianZhong(); //進(jìn)入翻頁位置
MotorZhua_fangZhi(); //翻頁
if(Cancell==1) //檢測(cè)取消標(biāo)志
goto OUT3;
}
OUT3:
Cancell=0; //取消動(dòng)作
}
//*********************************主程序***********************************//
void main(void)
{ INT_Init(); //初始化中斷
begin:
Cancell=0;
SIGN_ACT0; //蓋章?lián)舸螂姶盆F1吸起
PRINT_ACT0; //打印頁碼擊打電磁鐵2吸起
GRASP_ACT0; //抓紙機(jī)械手不動(dòng)作
Forward_Step(); //翻頁步進(jìn)電機(jī)復(fù)位
Motor3HouZou(); //承票板往后走
Motor3QianZhong(); //承票板往中間走進(jìn)行復(fù)位
do{do {FunkeyScan();} while(KeyDown==0);
switch(FunkeyNum)
{case 0: //裝票操作
Motor3();
break;
case 1 : //蓋章操作
Motor3QianZou(); //出倉(cāng)
wait1:
while(KEY_1!=0);
while(KEY_1==0)
{DelayLong(50);
if(KEY_1==0)
Motor3HouZhong(); //入倉(cāng)
else goto wait1;}
SIGN_ON0;
SIGN_OFF1; //蓋章進(jìn)行中指示燈亮
Motor3HouZou(); //進(jìn)入蓋章位置
MotorGaiZhang(); //蓋章函數(shù)調(diào)用
Motor3QianZhong(); //退出蓋章位置
SIGN_ON1;
SIGN_OFF0; //蓋章結(jié)束指示燈亮
break;
case 2: //打印頁碼
Motor3QianZou(); //出倉(cāng)
wait2: while(KEY_2!=0);
while(KEY_2==0)
{if(KEY_2==0)
Motor3HouZhong(); //入倉(cāng)
else goto wait2;}
PRINT_ON0;
PRINT_OFF1; //打印頁碼進(jìn)行指示燈亮
Motor1_Fuwei();
Motor12_Dama(); //打印頁碼
PRINT_ON1;
PRINT_OFF0; //打印頁結(jié)束指示燈亮
break;
default:break;}}while(1);
}
//**************************中斷服務(wù)程序*******************************//
#pragma interrupt_handler INTHandler:2
void INTHandler()
{Cancell=1; //置位取消標(biāo)志
NOP();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -