📄 张.txt
字号:
#include <reg591.h>
#define uint unsigned int
#define uchar unsigned char
uchar recvdata[8],senddata[8];
uchar openpttid[8];
uchar id1,id2;
uchar PTTFLAG=0,PTTTemp; //record the value of P2;
bit PTTFLAG1=0;
sbit dog=P3^5;
sbit MT8816_DATA=P3^3; //8816数据,决定矩阵节点断通
sbit MT8816_CS1=P3^4; // need try to reset 8816
sbit MT8816_CS2=P3^6;
sbit MT8816_CS3=P3^7;
sbit MT8816_STORE=P0^7; //8816锁存
sbit MT8816_RESET=P3^2; //reset
void InitPort(void);
void InitTimer0(void);
void dlynms(uint n);
bit CanReceive(void);
bit CanSend(void);
void clearchmain(uchar zxid);
void writechmain(uchar chmain,uchar zxid);
void clearchlisten(uchar zxid);
void writechlisten(uchar chmain,uchar zxid);
void WR_MT8816(uchar address,bit Type,uchar cs);
void InitCan();
void dlynms(uint n);
void dlynus(uint n);
main()
{
uchar recvzxid,P2temp;
uchar PTT,i;
recvzxid=1;
InitPort();
InitCan(); //have enable int(RX and TX)
InitTimer0();
PTTTemp=P2;
dog=~dog;
MT8816_RESET=1;
dlynms(4);
MT8816_RESET=0;
dlynms(1);
for(i=0;i<16;i++)
{
WR_MT8816(i,1,1);
dog=~dog;
WR_MT8816(i,1,2);
}
while(1)
{
dog=~dog;
if(CanReceive())
{
if((recvdata[0]>0)&&(recvdata[0]<17))
{
recvzxid=recvdata[0];
if(recvdata[1]) //PTT is valid
{
PTT=0x01;
P2temp=P2&(PTT<<(recvdata[2]-1));
if(!P2temp) // no user
{
openpttid[recvdata[2]-1]=recvdata[0]; //record id of zx that open the PTT
P2=P2|(PTT<<(recvdata[2]-1));
}
else
{
; //using
}
}
else
{
if(openpttid[recvdata[2]-1]==recvzxid) //keep the indentify between zx and ptt
{
PTT=0x01;
P2=P2&(~(PTT<<(recvdata[2]-1)));
}
}
dog=~dog;
clearchmain(recvzxid);
writechmain(recvdata[2],recvzxid);
clearchlisten(recvzxid);
writechlisten(recvdata[3],recvzxid);
dog=~dog;
}
}
if(PTTFLAG1)
{
senddata[0]=17;
senddata[1]=PTTFLAG;
CanSend();
dog=~dog;
}
dog=~dog;
}
}
void timer0() interrupt 1 using 1
{
TH0=0x4c;
TL0=0xf6;
PTTFLAG=P2;
if(PTTFLAG!=PTTTemp) //PTT--1,the ptt have been released;
{
PTTFLAG1=1;
PTTTemp=PTTFLAG;
}
else
{
PTTFLAG1=0;
}
}
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x4c;
TL0=0xf6;
EA=1;
ET0=1;
TR0=1;
}
void InitCan()
{
CANMOD=1; //enter reset mode
CANADR=4; //interrupt enable
CANDAT=0; //CANDAT=0x8d
/*
.7 1:bus error
.6 0:arbitration
.5 0:error passive
.4 0:wake up
.3 1:data over run
.2 1:error warning
.1 1:transimit
.0 1:receive
*/
CANADR=0x05;/*RIL;*/
CANDAT=0;
/*
interrupt receive number reg
*/
CANADR=0x06;/*BTR0;*/
CANDAT=0x47;
CANADR=0x07;/*BTR1;*/
CANDAT=0x1c;
/*
BPLS=50K
SJW=2,BRP=12,
SP=85,NBT=20,
SAM=0,TSEG1=16,TSEG2=3
*/
CANADR=0x0a;/*RBSA;*/ //recieve buffer start address
CANDAT=0;
CANADR=0x0c;/*ECC;*/
CANDAT=0;
CANADR=0x0e;/*RXERR;*/
CANDAT=0;
CANADR=0x0f;/*TXERR;*/
CANDAT=0;
CANADR=0x1d;/*ACFMOD;*/
CANDAT=0x55; //////aa
CANADR=0x1e;/*ACFEN;*/
CANDAT=0xff;
CANADR=0x1f;/*ACFPRIO;*/
CANDAT=1;
/*bank1*/
CANADR=0x20;/*ACR0*/
CANDAT=0;
CANADR=0x21;/*ACR1*/
CANDAT=10;
CANADR=0x22;/*ACR2*/
CANDAT=101;
CANADR=0x23;/*ACR3*/
CANDAT=0;
CANADR=0x24;/*AMR0*/
CANDAT=0xff;
CANADR=0x25;/*AMR1*/
CANDAT=0xff;
CANADR=0x26;/*AMR2*/
CANDAT=0xff;
CANADR=0x27;/*AMR3*/
CANDAT=0xff;
/*bank2*/
CANADR=0x28;/*ACR0*/
CANDAT=1;
CANADR=0x29;/*ACR1*/
CANDAT=2;
CANADR=0x2a;/*ACR2*/
CANDAT=3;
CANADR=0x2b;/*ACR3*/
CANDAT=4;
CANADR=0x2c;/*AMR0*/
CANDAT=0xff;
CANADR=0x2d;/*AMR1*/
CANDAT=0xff;
CANADR=0x2e;/*AMR2*/
CANDAT=0xff;
CANADR=0x2f;/*AMR3*/
CANDAT=0xff;
/*bank3*/
CANADR=0x30;/*ACR0*/
CANDAT=1;
CANADR=0x31;/*ACR1*/
CANDAT=2;
CANADR=0x32;/*ACR2*/
CANDAT=3;
CANADR=0x33;/*ACR3*/
CANDAT=4;
CANADR=0x34;/*AMR0*/
CANDAT=0xff;
CANADR=0x35;/*AMR1*/
CANDAT=0xff;
CANADR=0x36;/*AMR2*/
CANDAT=0xff;
CANADR=0x37;/*AMR3*/
CANDAT=0xff;
/*bank4*/
CANADR=0x38;/*ACR0*/
CANDAT=1;
CANADR=0x39;/*ACR1*/
CANDAT=2;
CANADR=0x3a;/*ACR2*/
CANDAT=3;
CANADR=0x3b;/*ACR3*/
CANDAT=4;
CANADR=0x3c;/*AMR0*/
CANDAT=0xff;
CANADR=0x3d;/*AMR1*/
CANDAT=0xff;
CANADR=0x3e;/*AMR2*/
CANDAT=0xff;
CANADR=0x3f;/*AMR3*/
CANDAT=0xff;
CANMOD=0x00;////enter operatation mode
}
bit CanReceive(void)
{
uchar SRTEMP;
SRTEMP=CANSTA;
if(SRTEMP&0x80) //bus off
{
InitCan();
dlynus(3000);
//return 0;
}
if(SRTEMP&0x40) //error
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x20) //is transmitting
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x10) //is recieving
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x02) //overrun
{
CANCON|=0xc;
return 0;
}
if(SRTEMP&0x01) //have data in data buffer
{
CANADR=0x61;
id1=CANDAT;
CANADR=0x62;
id2=CANDAT;
CANADR=0x63;
recvdata[0]=CANDAT;
CANADR=0x64;
recvdata[1]=CANDAT;
CANADR=0x65;
recvdata[2]=CANDAT;
CANADR=0x66;
recvdata[3]=CANDAT;
CANADR=0x67;
recvdata[4]=CANDAT;
CANADR=0x68;
recvdata[5]=CANDAT;
CANADR=0x69;
recvdata[6]=CANDAT;
CANADR=0x6a;
recvdata[7]=CANDAT;
CANCON|=0x0c;
dlynms(10);
return 1;
}
return 0;
}
bit CanSend(void)
{
uchar SRTEMP;
SRTEMP=CANSTA;
if(SRTEMP&0x80) //bus off
{
dlynus(3000);
return 0;
}
if(SRTEMP&0x40) //error
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x20) //is transmitting
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x10) //is recieving
{
dlynus(10);
dog=~dog;
SRTEMP=CANSTA;
}
if(SRTEMP&0x02) //overrun
{
CANCON|=0xc;
return 0;
}
CANADR=0x70;
CANDAT=0x08;
CANADR=0x71;
CANDAT=0xa5;
CANADR=0x72;
CANDAT=0x20;
CANADR=0x73;
CANDAT=senddata[0];
CANADR=0x74;
CANDAT=senddata[1];
CANADR=0x75;
CANDAT=senddata[2];
CANADR=0x76;
CANDAT=senddata[3];
CANADR=0x77;
CANDAT=senddata[4];
CANADR=0x78;
CANDAT=senddata[5];
CANADR=0x79;
CANDAT=senddata[6];
CANADR=0x7a;
CANDAT=senddata[7];
CANCON|=0x01;
dlynus(10);
dog=~dog;
return 1;
}
void InitPort(void)
{
EA=0;
AUXR1=0x08;
P1M1=0x00;
P1M2=0x00;
P1M2|=0x02;
P2M1=0x00;
P2M2=0x00;
P2=0;
P3M1=0;
P3M2=0;
}
void clearchmain(uchar zxid)
{
uchar i,temp,wadd;
for(i=0;i<8;i++)
{
temp=i;
wadd=(temp<<4)|(zxid-1);
WR_MT8816(wadd,0,1);
}
}
void writechmain(uchar chmain,uchar zxid)
{
WR_MT8816(((chmain-1)<<4)|(zxid-1),1,1);
}
void clearchlisten(uchar zxid)
{
uchar i,temp,wadd;
for(i=0;i<8;i++)
{
temp=i;
wadd=(temp<<4)|(zxid-1);
WR_MT8816(wadd,0,2);
}
}
void writechlisten(uchar chlisten,uchar zxid)
{
WR_MT8816(((chlisten-1)<<4)|(zxid-1),1,2);
}
void WR_MT8816(uchar address,bit Type,uchar cs)
{
if(cs==1)
{
MT8816_CS1=1;
dlynus(15);
P0=(P0&0x80)|address;
dlynus(15);
MT8816_STORE=1; //set store bit
dlynus(30);
MT8816_DATA=Type; //write data bit
dlynus(30);
MT8816_STORE=0;
dlynus(15);
MT8816_CS1=0;
dlynus(15);
}
else if(cs==2)
{
MT8816_CS2=1;
dlynus(15);
P0=(P0&0x80)|address;
dlynus(15);
MT8816_STORE=1; //set store bit
dlynus(30);
MT8816_DATA=Type; //write data bit
dlynus(30);
MT8816_STORE=0;
dlynus(15);
MT8816_CS2=0;
dlynus(15);
}
else
{
MT8816_CS3=1;
dlynus(15);
P0=(P0&0x80)|address;
dlynus(15);
MT8816_STORE=1; //set store bit
dlynus(30);
MT8816_DATA=Type; //write data bit
dlynus(30);
MT8816_STORE=0;
dlynus(15);
MT8816_CS3=0;
dlynus(15);
}
}
void dlynms(uint n)
{
uchar i;
for(;n>0;n--)
{
dog=~dog;
for(i=0;i<0x7c;i++);
}
}
void dlynus(uint n)
{
for(;n>0;n--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -