📄 io_rs232_string.c
字号:
#include <reg51.h>
sbit BT_REC=P3^0; //使用IO口代替串口
sbit BT_SND=P3^1;
#define INBUF_LEN 4
unsigned char Str[INBUF_LEN];
unsigned char i=0;
bit read_flag=0;
#define F_TM F0 //F0是PSW寄存器中的一个用户可编程位,因此可以作为用户设置的标志位,用户的程序可以根据需要对这个位进行置位或者清零、或者对这个位进行测试!
void IntTimer1(void) interrupt 3 //定时、计数器1中断程序
{
F_TM=1;
}
/*在数据进行传送的时候,使用F_TM来控制数据位传输的时间。如果设定波特率为9600,即每一位传送所需的时间为0.106ms,所以F_TM中断时间控制在0.106ms*/
void PSendChar(unsigned char inch) //发送程序段
{
unsigned char ii;
TH1=(256-192); //使用22.1184MHZ时钟
TL1=TH1;
ii=0;
BT_SND=0; //传送开始位
F_TM=0;
TR1=1; //中断允许控制位
while(!F_TM);
while(ii<8)
{
if(inch&1) //取最低位
{
BT_SND=1;
}
else
{
BT_SND=0;
}
F_TM=0;
while(!F_TM);
ii++;
inch>>=1; //右移一位
}
BT_SND=1; //传送结束位
F_TM=0;
while(!F_TM);
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
PSendChar(*(str + k));
k++;
} while (k < strlen);
}
unsigned char PGetChar()
{
unsigned char rch,ii;
TH1=(256-195); //使用22.1184MHZ时钟
TL1=TH1;
F_TM=0;
ii=0;
rch=0;
// TR1=1; //中断允许控制位
while(!F_TM);
while(ii<8)
{
rch>>=1; //右移一位
if(BT_REC) //判断接收的数据位是否为1,接收到的第一位应为0开始位,最后一位为1结束位,数据从低到高接收
{
rch|=0x80; //实现数据从低到高接收
}
ii++;
F_TM=0;
while(!F_TM);
}
F_TM=0;
while(!F_TM)
{
if(BT_REC)
{break;}
}
return rch;
}
//检查是不是有起始位
bit StartBitOn()
{
return (BT_REC==0);
}
//接收字符串程序
void serial ()
{
unsigned char ch;
ch=PGetChar();
Str[i]=ch;
i++;
if(i==INBUF_LEN)
{
read_flag=1;
}
}
char code dx516[3] _at_ 0x003b;
void main()
{
TMOD=0x22;
PCON=0x00;
EA=1;
ET1=1; //定时/计数器1开通
PSendChar(0x11);
PSendChar(0x88);
while(1)
{
if(StartBitOn())
{
while(BT_REC==0x00) //判断有数据传输
{
serial();
}
if(read_flag)
{
read_flag=0;
send_string_com(Str,i);
i=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -