📄 txd.c
字号:
//******************************显示一个字*********************************//
#include<math.h>
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define DISP_C P1_7
#define DISP_D P1_6
#define Rt_de P2_0
#define me_address 0x30
#define SAVE_D P1_5
#define SAVE_T P2_1
uchar stp_data[9];
uchar s_err_times;
uchar t_err_times;
void delay(unsigned int n)
{
unsigned int i;
for(i=n*200;i>0;i--)
;
}
void disp_one(unsigned char XSH_data)
{
char i;
bit F_temp;
for(i=0;i<8;i++)
{
F_temp=XSH_data&0x01;
XSH_data=XSH_data>>1;
if(F_temp)
{
DISP_C=0;
DISP_D=1;
_nop_();
_nop_();
DISP_C=1;
_nop_();
_nop_();
_nop_();
DISP_C=0;
_nop_();
}
else
{
DISP_C=0;
DISP_D=0;
_nop_();
_nop_();
DISP_C=1;
_nop_();
_nop_();
_nop_();
DISP_C=0;
_nop_();
}
}
}
void error(uchar error_type)
{
char i;
for(i=0;i<3;i++)
{
disp_one(error_type);
disp_one(0x40);
disp_one(0x50);
disp_one(0x50);
disp_one(0x79);
}
while(1);
}
//停止
void stop(void)
{
SAVE_D=0;
SAVE_T=1;
_nop_();
_nop_();
_nop_();
SAVE_D=1;
_nop_();
_nop_();
_nop_();
SAVE_T=0;
SAVE_D=0;
}
//发非应答信号
void n_ack(void)
{
SAVE_D=1;
SAVE_T=1;
_nop_();
_nop_();
_nop_();
SAVE_T=0;
SAVE_D=0;
}
//读八位
uchar rd_8byt(void)
{
uchar receive=0;
char i;
for(i=0;i<8;i++)
{
receive=receive<<1;
SAVE_D=1;
SAVE_T=1;
_nop_();
if(SAVE_D)
receive++;
SAVE_T=0;
}
return(receive);
}
//查应答
bit check(void)
{
bit aswer;
SAVE_D=1;
SAVE_T=1;
_nop_();
_nop_();
aswer=SAVE_D;
SAVE_T=0;
return(aswer);
}
//起始
void start(void)
{
SAVE_D=1;
SAVE_T=1;
_nop_();
_nop_();
_nop_();
SAVE_D=0;
_nop_();
_nop_();
_nop_();
SAVE_T=0;
}
void write_byt(uchar I_data)
{
char i;
for(i=0;i<8;i++)
{
SAVE_D=(bit)(I_data&0x80);
I_data=I_data<<1;
SAVE_T=1;
_nop_();
_nop_();
_nop_();
SAVE_T=0;
}
}
uchar readone(uchar edd)
{
char i;
uchar recivechar;
edd=edd<<1;
edd++;
for(i=0;i<20;i++)
{
start();
write_byt(edd);
if(!check())
goto bbb;
}
error(0x06);
bbb: recivechar=rd_8byt();
n_ack();
stop();
return(recivechar);
}
void Rs485_server(void)interrupt 4
{
uchar now_rec_dat;
uchar i;
int j;
EA=0;
if(~RI) //检测是否有接收中断
goto Rs485_err;
now_rec_dat=SBUF;
if(now_rec_dat!=me_address)
goto Rs485_err;
SM2=0; //不允许多机通讯
RI=0;
TI=0;
REN=0; //发送数据时禁止接收
Rt_de=1; //483发送方式
SBUF=me_address; //发送本机地址
while(~TI); //等待
TI=0; //清除标志
Rt_de=0; //483接收方式
REN=1; //接收允许
j=0;
while((~RI)&&(j<2000))//等待接收数据,如果时间过长退出
j++;
if(j>=2000)
goto Rs485_err;
now_rec_dat=SBUF; //读接收数据
RI=0;
TI=0;
Rt_de=1; //483发送方式
REN=0; //发送数据时禁止接收
switch(now_rec_dat)
{
case 0x00://收到数据=0发送36组存储数据
SBUF=0x00; //返回命令字
while(~TI);
TI=0;
for(i=0;i<108;i++)
{
SBUF=readone(i);
while(~TI);
TI=0;
}
break;
case 0x01://收到数据=1发送超量程记录
SBUF=0x01;//返回命令字
while(~TI);
TI=0;
SBUF=t_err_times;//chao liang cheng
while(~TI);
TI=0;
SBUF=s_err_times;//chao liang cheng
while(~TI);
TI=0;
SBUF=0;//chao liang cheng
while(~TI);
TI=0;
break;
case 0x02://收到数据=2发送3组表读数
SBUF=0x02;//返回命令字
while(~TI);
TI=0;
SBUF=0x88;//dang qian du shu
while(~TI);
TI=0;
/*
for(i=0;i<9;i++)
{
SBUF=stp_data[i];//dang qian du shu
while(~TI);
TI=0;
}
*/
break;
default:
SBUF=0xff;
while(~TI);
break;
}
Rs485_err: RI=0;
TI=0;
SM2=1;
Rt_de=0;
REN=1;
EA=1;
}
void main(void)
{
TL1=0xfd;/////通信初始化///////////
TH1=0xfd;//////////////
SCON=0xf0;/////////////;SM0=1,SM1=1,SM2=1,REN=1,工作方式3(9位UART,波特率可变),串行接收允许,
TMOD=0x21;//////////////
PCON=0x80;//////////////
TR1=1;/////////////////
Rt_de=0;
IT0=1;
PX0=1;
IP=0xff;
IE=0x97;////////通信初始化结束//////////////////////////////////////
EA=0;
EA=1;
P2_4=1;
P2_5=1;
P2_6=1;
P2_7=1;
Loop:
disp_one(0x3f);
disp_one(0x06);
disp_one(0x5b);
disp_one(0x4f);
disp_one(0x66);
//disp_one(0x6D);
// disp_one(0x7D);
// disp_one(0x07);
delay(100);
goto Loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -