📄 ser_my.c
字号:
#include<winbond\w77e58.h>
#define ser_dis0 P1_6
#define uchar unsigned char
extern uchar ser0_cal,ser1_cal;
void ser0_wrong();
void ser1_wrong();
void serial_init();
void k1_delay(unsigned int dltime);
uchar ser_cal(uchar *ser_ptmp,uchar lng_tmp);
extern uchar in0_lng,out0_lng,in1_lng,out1_lng,i;
extern uchar ser0_in[5],ser1_in[10],ser1_out[5];
extern bit ser0_wait,ser0_busy;
extern bit ser1_busy;
extern bit ser1_err;
extern uchar idata ser0_out[99];
#define ser1_control P1_6
#define ser0_control P3_5
//////connect to pc
void serial_0(void)interrupt 4
{
uchar sr_tmp;
///////串口0接收
if(RI)
{
sr_tmp=SBUF0;
RI=0;
if(in0_lng>4){in0_lng=0;return;}
/////判断校验字节
if(in0_lng==4)
{
REN=0;
if(sr_tmp==0xfa)
{
ser0_control=1;
out0_lng=0;
in0_lng=0;
ser0_busy=1;
ES0=0;
k1_delay(100);
ES0=1;
SBUF0=ser0_out[0];
}
else
{
ser0_wrong();
}
return;
}
////继续接收
switch(in0_lng)
{
case 0:if(sr_tmp==0xaa){
ser0_in[0]=0xaa;in0_lng++;ser0_cal=0xaa;
}
else ser0_wrong();break;
case 1:if(sr_tmp==0x01){
ser0_in[1]=0x01;in0_lng++;ser0_cal++;}
else ser0_wrong();break;
case 2:if(sr_tmp==0xff){
ser0_in[2]=0xff;in0_lng++;ser0_cal+=0xff;}
else ser0_wrong();break;
case 3:if(sr_tmp!=ser0_cal)ser0_wrong();else in0_lng++;break;
default :break;
}
}
////////串口0发送
if(TI)
{
TI=0;
if(out0_lng<98)
{
out0_lng++;
SBUF0=ser0_out[out0_lng];
}
else
{
ser0_control=0;
in0_lng=0;
REN=1;
// ser0_wait=0;
ser_dis0=0;
ser0_busy=0;
}
}
}
////串口0出错处理
void ser0_wrong()
{
ser0_busy=0;
in0_lng=0;
REN=1;
}
////串口1 connect to pic
void serial_1(void)interrupt 7 using 1
{
uchar sr_tmp;
if(RI1)
{
sr_tmp=SBUF1;
RI1=0;
if(in1_lng>7){in1_lng=0;return;}
/////判断校验字节
if(in1_lng==7)
{
REN1=0;
out1_lng=0;
if(sr_tmp==0xfa)
{
ser1_control=1;
ser1_busy=0;
TR0=0;
}
return;
}
////继续接收
switch(in1_lng)
{
case 0:if(sr_tmp==0xaa){
ser1_in[0]=0xaa;in1_lng++;ser1_cal=0xaa;
}
break;
case 1:if(sr_tmp==ser1_out[1]){
ser1_in[1]=sr_tmp;in1_lng++;ser1_cal+=sr_tmp;}
else in1_lng=0;break;
case 6:if(ser1_cal==sr_tmp)in1_lng++;else in1_lng=0;break;
default :ser1_in[in1_lng]=sr_tmp;in1_lng++;ser1_cal+=sr_tmp;break;
}
}
if(TI1)
{
TI1=0;
if(out1_lng<4)
{
out1_lng++;
SBUF1=ser1_out[out1_lng];
}
else
{
ser1_control=0;
in1_lng=0;
out1_lng=0;
REN1=1;
ser1_busy=1;
TR0=1;
}
}
}
/////通讯校验计算
uchar ser_cal(uchar *ser_ptmp,uchar lng_tmp)
{
uchar ser_ctmp;
ser_ctmp=0;
while(lng_tmp)
{
lng_tmp--;
ser_ctmp+=*(ser_ptmp+lng_tmp);
}
return ser_ctmp;
}
void serial_init()
{
//串口1的设置
TMOD=0x22; //定时器1工作在模式1
TL1=0xe8; //baud rate=1200
TH1=0xe8;
TL0=5;
TH0=5;
SCON1=0x58; //工作在模式1,允许接收
PCON=0x00; // SM0=0 SM1=1 在10位异步收发模式 SMOD=0 溢出速率/32
ES1=1; //串口1中断允许
SCON0=0x58; //工作在模式1,接收允许
T2CON=0x30; //用定时器2做串口0的波特率发生器
RCAP2H=0xff; // 11.0592M晶振下,baud rate=9600
RCAP2L=0xdc;
TR2=1;
TR1=1;
ES0=1;
ET0=1;
EA=1; //允许总中断和串口0的中断
}
void k1_delay(unsigned int dltime)
{
while(dltime)dltime--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -