求AT89c52单片机用MAX232与pc机多机串口通信程序!谢谢!
答案:5 悬赏:30 手机版
解决时间 2021-01-28 05:54
- 提问者网友:不爱我么
- 2021-01-27 09:32
求AT89c52单片机用MAX232与pc机多机串口通信程序!谢谢!
最佳答案
- 五星知识达人网友:春色三分
- 2021-01-27 10:41
建议去 百度文库 里 搜搜
文章 很多
文章 很多
全部回答
- 1楼网友:从此江山别
- 2021-01-27 15:06
void serial_rec() interrupt 4 using 0 //需要连续接收 { uchar i; uchar r_buf[3]; //es=0; // en485=1; for(i=0; i<3; i++) // 接收数据 { //ri = 0; _nop_(); _nop_(); while(!ri); r_buf[i]=sbuf; _nop_(); ri = 0; _nop_(); } //ri = 0; if((r_buf[0]==0x41)&&(r_buf[1]==0x01)&&(r_buf[2]==0x42)) // 接收到的上一个字节为#, { setbit1=1; //es=1; } else { //es=1; setbit1=0; } }
- 2楼网友:雾月
- 2021-01-27 13:56
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
#include
#include
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag= 0 ;
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个,且校验没错,
//就置位取数标志
}
}
}
}
main()
{
init_serialcomm(); //初始化串口
while ( 1 )
{
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}
}
接收到的数据放在inbuf1[]数组里面了!!!
还有问题的话,我可以把C51文件给你发到邮箱里
- 3楼网友:轮獄道
- 2021-01-27 12:35
#include
#define ui unsigned int
#define uc unsigned char
uc a,b,t,tt;//table[]或结束标志
void main()
{
t=1;
TMOD=0x21;
TH1=0xf4;
TL1=0xf4;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
if(b==1)
{
ES=0;
SBUF=a;
if(TI==1)
{
t=1;
b=0;
TI=0;
}
}
ES=1;
}
}
void ser() interrupt 4
{
if(t==1)
{
if(RI==1)
{
RI=0;
b=1;
a=SBUF;
t=0;
}
}
}
通信程序,本程序发一个收一个,接收数据不会出错
- 4楼网友:煞尾
- 2021-01-27 11:30
试试吧以前写的
//串口中断的使用
#include
#define uchar unsigned char
#define uint unsigned int
uchar a,flag;
sbit g1=P3^4;
void main()
{
TMOD=0x20;//设置定时器工作方式
TH1=0xfd;
TL1=0xfd;//设置定时器的初值
TR1=1;//打开定时器1
REN=1;//允许接收数据
SM0=0;
SM1=1;//设置CPU接收数据的长度
EA=1;//打开总中断
ES=1;//打开串口中断
while(1)
{
P2=0x00;
if(flag==1)
{
flag=0;
SBUF=a;
while(!TI);
TI=0;
// REN=1;
}
}
}
void ball() interrupt 4
{
// REN=0;
RI=0;//清零,以防重复申请中断,出现乱码!
ES=0;//关上串口中断,理论上RI清零后,不关也行,
//但RI即使清零,计算机仍然在发送数据,使清零无效
g1=SBUF;
a=SBUF;
flag=1;
ES=1;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯