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

📄 cy.c

📁 很有用的CYGNAL C语言程序,
💻 C
字号:
#include <C8051F020.h>
#include <yz05.h>
#define uchar unsigned char
#define uint  unsigned int

uchar rcv0cnt,rcv0pnt,rcv1cnt,rcv1pnt,transflag;
uchar transto[18];
uchar idata rcv0[64],rcv1[64];


void config(void);

/*
void trans0(uchar data1)
{
	SBUF0=data1;
	while(!TI0);
	TI0=0;
}
*/

void trans1(uchar data1)
{
	uchar i;
	SBUF1=data1;
	i=SCON1&0x02;
	while(i==0)i=SCON1&0x02;
	SCON1=SCON1&0xfd;
}

uint check(uchar channel)
{
	AMX0SL = channel&0x0f;
	AD0INT=0;
	AD0BUSY=1;
	while(!AD0INT);
	//trans1(ADC0H);
	//trans1(ADC0L);
	return ADC0H*256+ADC0L;
}

void getdata(void)
{
	uchar i;
	uint k;
	unsigned long j;
	//MFC1
	j=0;
	for(i=0;i<16;i++){
		j+=check(0);
		k=1000;while(k--);
	}
	j*=16;			//Vxi/Vi=4096/3792
	j/=0xed;
	if(j>4095)j=4095;
	transto[7]=j/1000+0x30;
	transto[8]=(j%1000)/100+0x30;
	transto[9]=(j%100)/10+0x30;
	transto[10]=j%10+0x30;

	//MFC2
	j=0;
	for(i=0;i<16;i++){
		j+=check(1);
		k=1000;while(k--);
	}
	j*=16;
	j/=0xed;
	if(j>4095)j=4095;
	transto[11]=j/1000+0x30;
	transto[12]=(j%1000)/100+0x30;
	transto[13]=(j%100)/10+0x30;
	transto[14]=j%10+0x30;

	transflag=0x55;
}

void DAC0OUT(uint data1)
{
	uint i;
	i=data1/31;		//1#	25/30.8
	i*=25;
//	i=data1*10;		//2#    25/30.4
//	i/=61;
//	i*=5;
//	i=data1*16;		//3#    32/38.6
//	i/=77;
//	i*=4;
//	i=data1*16;		//4#    32/39.9
//	i/=40;
//	i*=2;

	DAC0CN = 0x80;	// DAC0 Control Register
	DAC0L = i&0x00ff;	// DAC0 Low Byte Register
	DAC0H = i>>8;	// DAC0 High Byte Register
}

uchar rdbuf0(void)
{
	uchar i,j,cnt,pnt;
	EA=0;
	cnt=rcv0cnt;pnt=rcv0pnt;
	EA=1;
	if(cnt==0){
		return 0;
	}else{
		if(pnt>=cnt) i=pnt-cnt; else i=64+pnt-cnt;
		rcv0cnt--;
		//trans1(rcv1[i]);
		j=rcv0[i];
		rcv0[i]=0;
		return j;
	}
}

uchar rdbuf1(void)
{
	uchar i,j,cnt,pnt;
	EA=0;
	cnt=rcv1cnt;pnt=rcv1pnt;
	EA=1;
	if(cnt==0){
		return 0;
	}else{
		if(pnt>=cnt) i=pnt-cnt; else i=64+pnt-cnt;
		rcv1cnt--;
		//trans1(rcv1[i]);
		j=rcv1[i];
		rcv1[i]=0;
		return j;
	}
}

uchar viewbuf0(uchar index)
{
	uchar i,cnt,pnt;
	EA=0;
	if(index>rcv0cnt){
		EA=1;
		return 0;
	}else{
		cnt=rcv0cnt;pnt=rcv0pnt;
		if(pnt>=cnt) i=pnt-cnt; else i=64+pnt-cnt;
		i+=index;
		if(i>63)i-=64;
		EA=1;
		return rcv0[i];
	}
}

uchar viewbuf1(uchar index)
{
	uchar i,cnt,pnt;
	EA=0;
	if(index>rcv1cnt){
		EA=1;
		return 0;
	}else{
		cnt=rcv1cnt;pnt=rcv1pnt;
		if(pnt>=cnt) i=pnt-cnt; else i=64+pnt-cnt;
		i+=index;
		if(i>63)i-=64;
		EA=1;
		return rcv1[i];
	}
}

void rdfrompc(void)
{
	uchar i,k;
	uint j;
	j=0;
	if(rcv1cnt>=6){
		for(k=0;k<rcv1cnt-5;k++){
			
			//start DAC
			if(viewbuf1(k)==START && viewbuf1(k+5)==END){
				if(rdbuf1()==START){
					if(viewbuf1(4)==END){
						i=rdbuf1();
						if(i>=0x30 && i<=0x34){
							j=(i-0x30)*1000;
							i=rdbuf1();
							if(i>=0x30 && i<=0x39){
								j+=(i-0x30)*100;
								i=rdbuf1();
								if(i>=0x30 && i<=0x39){
									j+=(i-0x30)*10;
									i=rdbuf1();
									if(i>=0x30 && i<=0x39){
										j+=(i-0x30);
										if(j<4096)DAC0OUT(j);
									}
									i=rdbuf1();			//move the remain data
								}
								//i=rdbuf1();i=rdbuf1();
							}
							//i=rdbuf1();i=rdbuf1();i=rdbuf1();
						}
						//i=rdbuf1();i=rdbuf1();i=rdbuf1();i=rdbuf1();
					}
				}
			}
			// start ADC
			if(viewbuf1(k)=='G' && viewbuf1(k+7)==0x0d){
				if(rdbuf1()=='G'){
					if(viewbuf1(6)==0x0d){
						if(rdbuf1()=='E' && rdbuf1()=='T' && rdbuf1()=='D' && rdbuf1()=='A' && rdbuf1()=='T' && rdbuf1()=='A'){
							i=rdbuf1();
							getdata();
						}
					}
				}
			}
		}
		
	}
}

void rdfromout(void)
{
	uchar i;
	if(rcv0cnt>=9){
		if(rdbuf0()==START){
			if(viewbuf0(7)==END){
				for(i=0;i<7;i++)transto[i]=rdbuf0();
			}
		}
	}
}

void send(void)
{
	uchar i;
	if(transflag==0x55){
		transflag=0;
		for(i=0;i<18;i++){
			trans1(transto[i]);
			if(i==8)WDTCN = 0xA5;
		}
	}
}

void initdata(void)
{
	rcv0cnt=0;			//clear recive buffer
	rcv0pnt=0;
	rcv1cnt=0;
	rcv1pnt=0;
	transflag=0;
	//transto[6] =0x30;
	//transto[10]=0x30;
	transto[15]='O';
	transto[16]='K';
	transto[17]=0x0d;

/*	transto[0] =0x2b;
	transto[1] =0x30;
	transto[2] =0x2e;
	transto[3] =0x30;
	transto[4] =0x32;
	transto[5] =0x35;
*/
}

main()
{
	config();
	initdata();
	
	while(1){
	//trans0(255);
	rdfrompc();
	rdfromout();
	send();
	WDTCN = 0xA5;
	}
}

void UART0(void) interrupt 4 using 3
{
    if(RI0){
		rcv0[rcv0pnt]=SBUF0;
		rcv0pnt++;rcv0cnt++;
		if(rcv0pnt>63)rcv0pnt=0;		//recycle the point
		if(rcv0cnt>63)rcv0cnt=64;		//overwrite when buffer is full
		RI0=0;
	}

    if(TI0){
	TI0=0;
	}
}

void UART1(void) interrupt 20 using 2
{
	uchar i;

	i=SCON1&0x01;	//RI1
    if(i==1){
		rcv1[rcv1pnt]=SBUF1;
		rcv1pnt++;rcv1cnt++;
		if(rcv1pnt>63)rcv1pnt=0;		//recycle the point
		if(rcv1cnt>63)rcv1cnt=64;		//overwrite when buffer is full
		SCON1&=0xfe;
	}

	i=SCON1&0x02;	//TI1
//    if(i==2)SCON1&=0xfd;

}

void ADC0(void) interrupt 15 using 3
{

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -