永发信息网

求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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯