📄 ccd.c
字号:
#pragma ROM(SMALL)
#pragma CD SB DB OE
#include<REG51.H>
#define STX 0x55
#define ETX 0x41
#define DELAY_C 15
#define SPACE 0
#define MARK 1
#define ON 1
#define OFF 0
sbit g_sbtACC_7=ACC^7;
sbit g_sbtkey_data = 0x93;
sbit g_sbtkey_clk = 0xB2;/*50801,外部中断0*/
bit g_btsendlastflag;
bit g_btkeyrecflag;
bit g_btkeysendflag;
unsigned char ccdbuf[60];
unsigned char ccdverify;
unsigned char ig_flag;
unsigned char ccdlen;
unsigned char sendlen;
unsigned char keyvalue;
unsigned char rcounter;
unsigned char * data ccdptr;
unsigned char data t0_cnt;
unsigned char data g_bTime;
/*8051 based Full Static CMOS controller with Two-Level Program Memory Lock
15 I/O lines, 2 Timers/Counters, 6 Interrupts sources
UART, Direct LED Drive Outputs, On-Chip Analog Comparator
2 K Flash Memory, 128 Bytes On-chip RAM*/
/****************************************************************************
外部中断先接收条码枪传来的数据
*****************************************************************************/
void init_89c2051(void) using 0
{
IE=0X11; /*EA XX XX ES ET1 EX1 ET0 EX0*/
IP=0x01; /*int0 high interrupt*/
TMOD=0X21; /*??T1 is mode 2*/
TCON=0X41; /*TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0*//*50801,IT0=1:外部中断0设为下降沿触发*/
TH0=0XFC;
TL0=0X18;
TH1=0XFD;
TL1=0XFD;
PCON=0;
SCON=0X50;
ET0=1;
g_sbtkey_data=1;
g_sbtkey_clk=1;
g_btkeysendflag=1;
ccdverify=0;
g_btsendlastflag=0;
g_btkeyrecflag=0;
ig_flag=0;/*50801,从外部中断中接收到的8位数据是f0时,此标志置1???*/
ccdlen=0;
sendlen=0;
keyvalue=0;
rcounter=0;
t0_cnt=0;
g_bTime=0;
ccdptr=ccdbuf;
TR0=1;
}
void sio () interrupt 4 using 1/*50801,用来向上位机发送条码*/
{
if(TI)
{
TI=0;
if(sendlen<ccdlen)
{
SBUF=*ccdptr;
ccdverify=*ccdptr+ccdverify;
ccdptr+=1;
sendlen+=1;
}
else
{
if(g_btsendlastflag)
{
SBUF=ccdverify;
ccdptr=ccdbuf;
ccdlen=0;
sendlen=0;
g_btsendlastflag=0;
ccdverify=0;
g_btkeysendflag=1;/*50801,建立串口发送完ccd标志*/
g_sbtkey_clk=1;
rcounter=0;
EX0=1;
}
}
}
else
RI=0;
}
/*1ms*/
void ctc0_ser() interrupt 1 using 2
{
TH0=0XFC;
TL0=0X18;
if (g_bTime)
{
g_bTime--;
if (!g_bTime)
{
t0_cnt=0;
ccdlen=0;
ccdptr=ccdbuf;
rcounter=0;
}
}
if (t0_cnt)
{
t0_cnt--;
if (!t0_cnt)
{
EX0=0;
g_bTime=0;
if(ccdbuf[ccdlen-1]==0x5a)
ccdlen=ccdlen-1;
g_sbtkey_clk=0;
ccdbuf[ccdlen]=ETX;/*50801,添加尾信息*/
ccdlen++;
g_btkeyrecflag=1;/*50801,建立接收完条码标志*/
g_btsendlastflag=1;
t0_cnt=0;
}
}
}
/**************************************************
数据的接收是在外部中断中完成的,第一次来中断时不接收
因为是起始位,第二开始一直到第九位为接收到的8位数据
第十位为校验位,放入全局变量中,第十一位为停止位,在
这一位对接收进行结束处理表示接收完了一个字节,然后将
接收来的字节存起来,在接收到信息尾字节后将接收标志
置起来此接收的信息中有信息头和信息尾
**************************************************/
void int0_sev(void) interrupt 0 using 2
{
if(rcounter)
{
g_bTime=2;/*位超时计数*/
if(rcounter<9)/*50729,第二次开始一直到第八次为接收到的8位数据 */
{
keyvalue>>=1;
ACC=keyvalue;
g_sbtACC_7=g_sbtkey_data;
g_sbtkey_data=1;
keyvalue=ACC;
rcounter+=1;
}
else if(rcounter==9)/*50729,校验位?*/
rcounter+=1;
else
{
g_bTime=20;/*字节超时计数*/
t0_cnt=DELAY_C;
if(g_btkeyrecflag==1)
return;
if(ccdlen>=15)
{
t0_cnt=0;
ccdlen=0;
ccdptr=ccdbuf;
rcounter=0; /* add */
}
else
{
if(keyvalue==0xf0)
ig_flag=1;
else
{
if(ig_flag!=1)
{
*ccdptr=keyvalue;/*50801,保存数据到缓冲区,8位数据作为一个char*/
ccdptr+=1;
ccdlen+=1;
}
else
ig_flag=0;
}
rcounter=0;
}
}
}
else/*50729,第一次来中断*/
{
g_bTime=2;
rcounter=1;
}
}
/*********************************************
此函数在没有数据时等侍,在来数据后判断是否是有
效的数据,如果是有效的数据则进行处理,在全部数
据都有效同时又合法后接收到结束时将一个接收OK置
起来这样可以进行下一步的发送操作
*********************************************/
void sendccd()
{
g_btkeyrecflag=0;
ccdptr=ccdbuf;
ccdverify=STX;
SBUF=STX;
}
/*********************************************
主函数在接收完成后进行发送,在没有接收
完时等侍如此循环的进行
**********************************************/
void main()
{
unsigned int ii;
for(ii=0;ii<20000;ii++);
init_89c2051();
EA=1;
/* g_btkeysendflag=1; */
while(1)
{
while(!g_btkeyrecflag||!g_btkeysendflag);
sendccd();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -