📄 hjcomm.c
字号:
/*200-1交通信号控制机通信板程序*/
#include <reg51.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
/*-------------------------------------------------------*/
void wdi_reset() { /*触发MAX-705*/
uchar data i;
P1_0=~P1_0;
i=0;
i=0;
P1_0=~P1_0;
}
/*-------------------------------------------------------*/
void delay(uchar x) { /*延时X毫秒--函数*/
uchar data j;
while((x--)!=0){
for(j=0;j<113;j++)
{;}
}
wdi_reset();
}
/*-------------------------------------------------------*/
void sparkler(uchar x) { /*闪烁--函数*/
uchar i;
for(i=1;i<=x;i++){
P1_3=0;
P1_4=0;
P1_5=0;
delay(100);
P1_3=1;
P1_4=1;
P1_5=1;
delay(100);
}
}
/*-------------------------------------------------------*/
void sparkler0(uchar x){ /*闪烁--函数*/
uchar i;
for(i=1;i<=x;i++){
P1_5=0;
delay(100);
P1_5=1;
delay(100);
}
}
/*-------------------------------------------------------*/
void sparkler1(uchar x){ /*闪烁--函数*/
uchar i;
for(i=1;i<=x;i++){
P1_3=0;
delay(100);
P1_3=1;
delay(100);
}
}
/*-------------------------------------------------------*/
void sparkler2(uchar x){ /*闪烁--函数*/
uchar i;
for(i=1;i<=x;i++){
P1_4=0;
delay(100);
P1_4=1;
delay(100);
}
}
/*-------------------------------------------------------*/
void sparkler_main(uchar x){ /*闪烁--函数*/
uchar i;
for(i=1;i<=x;i++){
P1_6=1;
delay(100);
P1_6=0;
delay(100);
}
}
/*-------------------------------------------------------*/
void set_comm1(uchar baud){ /*初始化8250_1--函数*/
uchar data inter_var;
wdi_reset();
switch(baud){
case 5: /*19200*/
inter_var=0x06;break;
case 4: /*9600*/
inter_var=0x0c;break;
case 3: /*4800*/
inter_var=0x18;break;
case 2: /*2400*/
inter_var=0x30;break;
case 1: /*1200*/
inter_var=0x60;break;
default: /*4800*/
inter_var=0x0c;break;
}
XBYTE[0xeffb]=0x83;
XBYTE[0xeff8]=inter_var;
XBYTE[0xeff9]=0;
XBYTE[0xeffb]=3;
XBYTE[0xeff1]=1;
sparkler1(2);
}
/*-------------------------------------------------------*/
void set_comm2(uchar baud){ /*初始化8250_1--函数*/
uchar data inter_var;
wdi_reset();
switch(baud){
case 5: /*19200*/
inter_var=0x06;break;
case 4: /*9600*/
inter_var=0x0c;break;
case 3: /*4800*/
inter_var=0x18;break;
case 2: /*2400*/
inter_var=0x30;break;
case 1: /*1200*/
inter_var=0x60;break;
default: /*4800*/
inter_var=0x0c;break;
}
XBYTE[0xdffb]=0x83;
XBYTE[0xdff8]=inter_var;
XBYTE[0xdff9]=0;
XBYTE[0xdffb]=3;
XBYTE[0xdff1]=1;
sparkler2(2);
}
/*-------------------------------------------------------*/
void set_comm3(uchar baud){ /*初始化RS--485--函数*/
uchar data inter_var;
wdi_reset();
switch (baud){
case 5: /*19200*/
inter_var=0xfd;break;
case 4: /*9600*/
inter_var=0xfd;break;
case 3: /*4800*/
inter_var=0xfa;break;
case 2: /*2400*/
inter_var=0xf4 ;break;
case 1: /*1200*/
inter_var=0xe8;break;
default: /*4800*/
inter_var=0xfd;break;
}
if(baud==5){
PCON=0x80;
}
else{
PCON=0x00;
}
TMOD=0x20;
TL1=inter_var;TH1=inter_var;
SCON=0xd8;
TR1=1;
P1_2=0;
sparkler0(2);
}
/*-------------------------------------------------------*/
void set_dou_ram() { /*初始化双口RAM收发存储器函数*/
uchar data i;
wdi_reset();
i=0;
while(i<0x80){
XBYTE[0xf000+i]=0;
i=i+1;
}
XBYTE[0xf01b]=1;
XBYTE[0xf01c]=1;
XBYTE[0xf01d]=1;
XBYTE[0xf01f]=0xf0;
XBYTE[0xf020]=0x80;
XBYTE[0xf021]=0xf0;
XBYTE[0xf022]=0x80;
}
/*-------------------------------------------------------*/
void send_485(uchar no){ /*RS485--口发送数据函数*/
P1_5=~P1_5;
XBYTE[0xf030+5*no]=0;
}
/*-------------------------------------------------------*/
void send_8250(uchar no,uchar ko_no){/*RS232--口发送数据函数*/
uchar data sum;
uint data i,data j,data star_add,data end_add,data send_add;
uint data ko_add;
XBYTE[0xf01a]=1;
wdi_reset();
ko_add=0;
if(ko_no==2){ //串口2
ko_add=0x1000;
}
if(ko_no==1){ //串口1
P1_3=~P1_3;
}
else {
P1_4=~P1_4; //串口2
}
sum=0;
while(sum<10){
XBYTE[0xeff0-ko_add]=0x66+sum*0x11;/*发送起始位*/
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
sum=sum+1;
}
star_add=XBYTE[0xf031+5*no]*256+XBYTE[0xf032+5*no];
end_add=XBYTE[0xf033+5*no]*256+XBYTE[0xf034+5*no];
send_add=star_add;
XBYTE[0xeff0-ko_add]=XBYTE[send_add];/*发送数据标识*/
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
sum=XBYTE[send_add];
if(send_add==0xf7ff){
send_add=0xf080;
}
else{
send_add=send_add+1; /*发送数据长度*/
}
XBYTE[0xeff0-ko_add]=XBYTE[send_add];
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
if(send_add==0xf7ff){ //双口ram的边界
send_add=0xf080;
}
else{
send_add=send_add+1; /*发送数据长度*/
}
XBYTE[0xeff0-ko_add]=XBYTE[send_add];
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
/*i=XBYTE[star_add+1]*256+XBYTE[star_add+2]+3;*/
if(star_add<end_add){
i=end_add-star_add-2; //发送字节数
}
else{
i=0xf7ff-star_add+end_add-0xf080-1;
}
if(i>1900){
i=10;
}
while(i>0){ /*发送数据*/
if(send_add==0xf7ff){
send_add=0xf080;
}
else{
send_add=send_add+1;
}
sum=sum+XBYTE[send_add];
XBYTE[0xeff0-ko_add]=XBYTE[send_add];
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
i=i-1;
}
i=0;
j=0;
XBYTE[0xeff0-ko_add]=sum; //发送校验和
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
while(i<20){
XBYTE[0xf024]=1;
if((XBYTE[0xf023]==0)&(XBYTE[0xf024]==1)){
i=20;
}
i=i+1;
}
if((XBYTE[0xf023]==0)&(XBYTE[0xf024]==1))
{/*判CPU是否修改头尾*/
if((XBYTE[0xf021]==XBYTE[0xf033+5*no])&(XBYTE[0xf022]==XBYTE[0xf034+5*no])) //结束地址为f080
{
XBYTE[0xf021]=XBYTE[0xf031+5*no];/*修改尾标志*/
XBYTE[0xf022]=XBYTE[0xf032+5*no];
if((XBYTE[0xf022]==0)&(XBYTE[0xf021]>0xf0))
{
XBYTE[0xf022]=0xff;
XBYTE[0xf021]=XBYTE[0xf021]-1;
}
}
else{
if((XBYTE[0xf01f]==XBYTE[0xf031+5*no])&(XBYTE[0xf020]==XBYTE[0xf032+5*no])) //开始地址为f080
{
XBYTE[0xf01f]=XBYTE[0xf033+5*no];/*修改头标志*/
XBYTE[0xf020]=XBYTE[0xf034+5*no];
}
}
XBYTE[0xf030+5*no]=0;
if(ko_no==1){
XBYTE[0xf04F]=XBYTE[0xf04F]+1;/*通信口1发送成功记数*/
if(XBYTE[0xf04F]==0xff)
{
XBYTE[0xf04E]=XBYTE[0xf04E]+1;
}
}
i=0;
}
else{
i=10;
}
while((i<10)&(XBYTE[0xf030+5*no]>0)){
XBYTE[0xf030+5*no]=0;
i=i+1;
}
XBYTE[0xf024]==0;
i=0;
while((i<20)&(XBYTE[0xf024]==1)){
XBYTE[0xf024]==0;
i=i+1;
}
XBYTE[0xf01a]=0;
wdi_reset();
}
/*-------------------------------------------------------*/
void comm_dete(uchar ko_no,uchar obj){/*RS232--链路连通回馈函数*/
uchar data i;
uint data j,data ko_add;
wdi_reset();
ko_add=0;
if(ko_no==2){ //串口2
ko_add=0x1000;
}
i=0;
while(i<10){
XBYTE[0xeff0-ko_add]=0x66+i*0x11;/*发送起始位*/
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
i=i+1;
}
XBYTE[0xeff0-ko_add]=0x03;/*发送数据标识:通信测试*/
i=0x03;
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
XBYTE[0xeff0-ko_add]=0;/*发送数据体长度*/
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
}
XBYTE[0xeff0-ko_add]=2;/*发送数据体长度*/
j=0;
while((XBYTE[0xeffd-ko_add]<0x60)&(j<7000)){
wdi_reset();
j=j+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -