beicheng2r.c
来自「基于89c2051开发的ptr8000一对多无线通信程序.」· C语言 代码 · 共 183 行
C
183 行
#define COMRBUFFLEN 16
#include <reg51.h>
#include <stdio.h>
bit triggle=0,startframe=0,com2rb=1,lastcom2rb=1,lastdirection=1,direction1=0,direction2=1,direction=0;
unsigned char TLV=0xb0; //Now is 16 times of baud,0xc0; //for 18432000,4 times baudrate,
unsigned char THV=0xff; // 0xfe; if 8times baudrate it's 0x60 and 0xff respectively.
unsigned char com2sbufp=0,com2buffs[2],com2buffr[COMRBUFFLEN],com2buffrp=0;
unsigned short SECTICKS=19200; //4800; //65536/(65536-(THV*256+TLV))*18;
unsigned short HALFSECTICKS=9600; //2400;
unsigned char rbuff[COMRBUFFLEN],sbuff[10];
unsigned char rbuffp=0;
unsigned char oldP1Stat,chno=0,ensend=0,rest;
unsigned char ticks=0;ticks1=0,ticks2=0,ticksl2=0,ticksh2=0,ticks3,numberofzero=0,numberofone=16;
unsigned char temptl0,tempth0;
unsigned short filterB=0xffff,count=0,count1=0,com2sbuf;
//sbit P32 = P3^2;
sbit COM2R=P3^2; //P3^0;
sbit COM2S=P3^1;
sbit PULSE=P1^4;
sbit DIRECTION=P1^5;
sbit GLED=P1^3;
void delay()
{
unsigned short i,j;
for(i=0;i<30;i++) j=i;
}
void e0int() interrupt 0
{
P1=P1 ^ 0x80; // Feed watchdog.
ticks3++;
}
void e1int() interrupt 2
{
ticks1++;
}
void t0int() interrupt 1
{
// unsigned char i;
temptl0=TL0;
tempth0=TH0;
TH0=THV+tempth0;
TL0=TLV+temptl0+10;
//if(!(filterB&0x8000)) numberofzero--;
/*No need following code to simulate com2,because of now we use indeed serial.
filterB<<=1;
filterB&=0xfffe;
filterB|=COM2R;
//if(!(filterB&1)) numberofzero++;
switch (filterB&0x3f)
{
case 0x3f:
com2rb=1;
break;
case 0:
com2rb=0;
if((!startframe)) // && (numberofzero>7)) // && (filterB&0xf)) // && (lastcom2rb) && (numberofzero>=8))
{
startframe=1;
com2sbufp=0;
rest=count&0xf;
}
break;
default:
break;
}
lastcom2rb=com2rb;
if(startframe && ((count&0xf) == rest))
{
com2sbuf>>=1;
com2sbuf&=0xfeff;
if(com2rb) com2sbuf|=0x0100;
com2sbufp++;
if(com2sbufp==10)
{
startframe=0;
if(com2sbuf&0x100)
{
com2buffr[com2buffrp]=com2sbuf;
//SBUF=com2sbuf;
if((com2buffr[com2buffrp] == 'E') && (com2buffr[(com2buffrp+19)%COMRBUFFLEN] == 0) && (com2buffr[(com2buffrp+16)%COMRBUFFLEN] == 'S'))
{
//TI=0;
//SBUF=com2buffr[(com2buffrp+17)%COMRBUFFLEN];
sbuff[4]=com2buffr[(com2buffrp+17)%COMRBUFFLEN];
sbuff[5]=com2buffr[(com2buffrp+18)%COMRBUFFLEN];
}
if(++com2buffrp==COMRBUFFLEN) com2buffrp=0;
}
}
}
*/ //End of simulate com2.
if((count & 0x7f) == 0) // Sample P1 150 times per 1 second. do following things.
{
if ((oldP1Stat&0x10)==0x10 && (P1&0x10)==0x00) //DOWN triggle.
{
if ((P1&0x20)==0x20) direction1=1;
else direction1=0;
}
if ((oldP1Stat&0x20)==0x20 && (P1&0x20)==0x00) //DOWN triggle.
{
if ((P1&0x10)==0x10) direction2=1;
else direction2=0;
}
if(direction1 && !direction2) direction=1;
if(!direction1 && direction2) direction=0;
if((oldP1Stat^P1) & 0x10) ticks++;
if((oldP1Stat^P1) & 0x20) ticks++;
oldP1Stat=P1;
}
//if(DIRECTION!=lastdirection) ticks++;
//lastdirection=DIRECTION;
count++;
if(count == HALFSECTICKS)
{
triggle=1;
}
if(count == SECTICKS)
{
sbuff[6]=P1;
sbuff[7]=ticks;
if (direction) sbuff[6]=sbuff[6] | 0x20;
else sbuff[6]=(sbuff[6] & 0xDF);
ticks=0;
count=0;
triggle=1;
}
count1++;
if(count1==HALFSECTICKS/2)
{
GLED=1; //LED is off
}
}
void comint() interrupt 4
{
if(RI)
{
RI=0;
rbuff[rbuffp]=SBUF;
//if((rbuff[rbuffp] == 'E') && (rbuff[(rbuffp+COMRBUFFLEN-4)%COMRBUFFLEN] == 'S') && (rbuff[(rbuffp+COMRBUFFLEN-1)%COMRBUFFLEN] == 0x00))
if((rbuff[(rbuffp+COMRBUFFLEN-5)%COMRBUFFLEN] == 0x06) && (rbuff[(rbuffp+COMRBUFFLEN-4)%COMRBUFFLEN] == 'S') && (rbuff[(rbuffp+COMRBUFFLEN-1)%COMRBUFFLEN] == 0x00))
{
sbuff[4]=rbuff[(rbuffp+COMRBUFFLEN-3)%COMRBUFFLEN];
sbuff[5]=rbuff[(rbuffp+COMRBUFFLEN-2)%COMRBUFFLEN];
GLED=0; //GLED is on.
count1=0;
}
rbuffp++;
if(rbuffp == COMRBUFFLEN) rbuffp=0;
}
}
void main (void)
{
unsigned char i;
sbuff[0]=0xff;
sbuff[1]=0xd7;
sbuff[2]=0x08;
sbuff[3]='S';
sbuff[8]=0x00;
sbuff[9]='E';
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xfb; //0x9600bps,0xd8; /* TH1: reload value for 1200 baud @ 184320000MHz */
TR1 = 1; /* TR1: timer 1 run */
IT1 = 1;
IT0 = 1;
TI = 1; /* TI: set TI to send first char of UART */
TR0 = 1;
IE = 0x92; //enable Serial and t0 interrupt.
while (1)
{
if (triggle==1)
{
//P32=0;
for(i=0;i<10;i++) putchar(sbuff[i]);
//putchar(temptl0);
triggle=0;
//P32=1;
}
delay();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?