📄 cy.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 + -