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

📄 ccd.c

📁 keilc51编译的51单片机读条码枪源程序
💻 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 + -