📄 com.c
字号:
#include <REG51.H> /* special function register declarations */
/* for the intended 8051 derivative */
#include <stdio.h> /* prototype declarations for I/O functions */
#define INBUF_LEN 4 //数据长度
unsigned char connect[6] ={0x05,0x82,0x01,0x01,0x83} ;
unsigned char reset[13] ={0x05,0xc2,0x01,0x07,0x10,0x00,0x05,0x00,0x00,0x00,0x00,0xd1} ;
unsigned char pay[13] ={0x05,0xc2,0x01,0x07,0x30,0x00,0x05,0x00,0x01,0x00,0x00,0xf0} ;
unsigned char inbuf1[INBUF_LEN];
unsigned char inbuf2[11] ={"Operation "} ;
unsigned char inbuf3[13] ={"completed!\n"} ;
unsigned char inbuf4[10] ={"failed!\n"} ;
unsigned char checksum,count3;
unsigned char odat=0;
unsigned char rec[5]={0xff,0xff,0xff,0xff,0xff};
unsigned int selch;
bit read_flag= 0 ;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
//查询计数器溢出标志位
void WaitTF0( void )
{
while(!TF0);
TF0=0;
}
//计数器初始化
void S2INI(unsigned int sel)
{
TMOD =0x02; //计数器0,方式2
if(sel==9600) TH0= 0x30;
else if (sel==19200) TH0= 0x9a;
else if (sel==38400) TH0= 0xd0;
else TH0= 0x30;
//TH0=sel; //指令周期s=(1/9600)/(1*2000000)=208 ,256-208=48=0x30 14400 117= 0x75 19200 154=0x9a 38400 204=0xCC
TL0=TH0;
TR0=0; //开始计数
TF0=0;
}
void WByte(unsigned char input)
{
//发送启始位
unsigned char i=8;
TR0=1;
//WaitTF0();
if(selch==1)
{
P1_1=(bit)1;
WaitTF0();//发送8位数据位
while(i--)
{
P1_1=(bit)((~input)&0x01); //先传低位给P0_1
WaitTF0();
input=input>>1;
}
//发送校验位(无)
//发送结束位
P1_1=(bit)0;
WaitTF0();
}
else if(selch==2)
{
P1_3=(bit)1;
WaitTF0();
//发送8位数据位
while(i--)
{
P1_3=(bit)((~input)&0x01); //先传低位给P0_3
WaitTF0();
input=input>>1;
}
//发送校验位(无)
//发送结束位
P1_3=(bit)0;
}
else if(selch==3)
{
P0_5=(bit)1;
WaitTF0();
//发送8位数据位
while(i--)
{
P0_5=(bit)((~input)&0x01); //先传低位给P0_5
WaitTF0();
input=input>>1;
}
//发送校验位(无)
//发送结束位
P0_5=(bit)0;
}
else if(selch==4)
{
P0_7=(bit)1;
WaitTF0();
//发送8位数据位
while(i--)
{
P0_7=(bit)((~input)&0x01); //先传低位给P0_7
WaitTF0();
input=input>>1;
}
//发送校验位(无)
//发送结束位
P0_7=(bit)0;
}
WaitTF0();
TR0=0;
}
RByte()
{
unsigned char i=8;
unsigned char j=0;
//启动Timer0
// TL0=TH0;
// WaitTF0(); //等过起始位
//发送8位数据位
if(selch==1)
{
if(P1_0==1)
{
TR0=1;
WaitTF0();
while(i--)
{
j=~(P1_0);
odat=odat|(j<<(8-i)); //check
WaitTF0();
}
}
}
else if(selch==2)
{
if(P1_2==1)
{
WaitTF0();
while(i--)
{
j=~(P1_2);
odat=odat|(j<<(8-i));
WaitTF0();
};
}
}
else if(selch==3)
{
if(P0_4==1)
{
WaitTF0();
while(i--)
{
j=~(P0_4);
odat=odat|(j<<(8-i));
WaitTF0();
}
}
}
else if(selch==4)
{
if(P0_6==1)
{
WaitTF0();
while(i--)
{
j=~(P0_6);
odat=odat|(j<<(8-i));
WaitTF0();
}
}
}
TR0=0;
return odat;
}
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
//TI=1;
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
} while (k < strlen);
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
unsigned char ch;
RI = 0 ;
ch=SBUF;
if (ch> 127 )
{
count3= 0 ;
inbuf1[count3]=ch;
checksum= ch- 128 ;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
{
read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
count3=0;
}
}
}
}
//延时模块
delay()
{
int t;
for(t=1;t<20000;t++);
}
main()
{
//init_serialcomm(); //初始化串口
//while ( 1 )
//{
// if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
// {
// read_flag= 0 ; //取数标志清0
// if((inbuf1[0]==0x90)&&(inbuf121]==0x40)&&(inbuf1[2]==0x45)&&(inbuf1[3]==0x15))
// {
int i=0;
int j=0;
selch=1;
S2INI(38400);
while(1)
{
for(j=0;j<4;j++)
{
RByte();
rec[j]=odat;
}
delay();
if((rec[0]==0x12)&&(rec[1]==0x34)&&(rec[2]==0x56)&&(rec[3]==0x78))
{
for(i=0;i<4;i++)
WByte(rec[i]);
delay();
delay();
for(i=0;i<5;i++)
{
WByte(connect[i]);
}
delay();
delay();
for(i=0;i<12;i++)
{
WByte(reset[i]);
}
delay();
delay();
for(i=0;i<12;i++)
{
WByte(pay[i]);
}
delay();
delay();
}
// }
// delay();
// init_serialcomm(); //初始化串口
// delay();
// send_string_com(inbuf2,10);
// send_string_com(inbuf3,12);
//}
//else
//send_string_com(inbuf3,20);
// }
//}
}
}
/*
MODE COM1 4800,0,8,1
ASSIGN COM1 <SIN> SOUT
sin 输入 sout 输出,把单片机串口绑定到计算机串口COM1
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -