RS232串口应用实例
设计要求:
通过串口发送接收数据(串口工作方式1)
实现思路:
定时器设置
串口设置
工作方式
开启定时/计数器
串口执行
接收数据
发送数据
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include 2 main() 3 { 4 TMOD = 0x20; 5 SM0 = 0; 6 SM1 = 1; 7 REN = 1; 8 PCON = 0; 9 TH1 = 0xFD; //253=256-(1*11.0592*10^6)/(384*9600) 10 TL1 = 0xFD; 11 TR1 = 1; 12 P1 = SBUF; 13 while(!RI); 14 RI = 0; 15 SBUF = P1; 16 while(!TI); 17 TI = 0; 18 } ———————————————————————————————————————————— 实验7.5:MAX487多机通信应用实例 设计要求: 在主从3个单片机中进行双机通信,当从机显示的数字和主机相同,则表示该主机和从机正在通信。按下主机按键切换当前对象。 实现思路: 主机端 在主机中设置定时器和串口参数,并一直保持发送数据的状态。 通过MAX487芯片将3个单片机连接,并通过设置/RE、DE管脚控制单片机输入输出状态。 需要按下主机按键时检测按键状态,切换当前对象,设置中断,并标记此时状态是从机1或从机2。 //中断发生时按照中断优先级,主机先执行cort++并发送信息,主机中断结束后才进入从机中断。 如果是从机1,输出状态下发送对应数字,输入状态下设置单片机通信(非多机通信)接收并显示对应数字,重置输出状态。从机2同理。 从机端 设置与主机相同的串口参数和定时器和默认显示值。允许接收中断 当按键被按下,判断主机要通信的是否是自己,是则显示对应数字并向主机发送数字,否则重置状态。 执行流程:(多机通信模式) 主机 从机 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 实现代码:SM2=1,多机通信模式! 主机 1 #include 2 #include 3 unsigned char cort = 0; 4 sbit P3_5 = P3 ^ 5; 5 key_serial() interrupt 0 using 1 6 { 7 ++cort; 8 if (cort == 3) 9 cort = 1; 10 } 11 void main() 12 { 13 P2 = 0xff; 14 TMOD = 0x20; 15 TH1 = 0xFD; 16 TL1 = 0xFD; 17 PCON = 0x00; 18 TR1 = 1; 19 SCON = 0xF8; 20 EA = 1; 21 EX0 = 1; 22 IT0 = 1; 23 P3_5 = 1; 24 while(1) 25 { 26 if (cort == 1) 27 { 28 SBUF = 0x01; 29 while(TI != 1); 30 TI = 0; 31 P3_5 = 0; 32 RB8 = 1; 33 while(RI != 1); 34 RI = 0; 35 P2 = SBUF; 36 P3_5 = 1; 37 } 38 if(cort == 2) 39 { 40 SBUF = 0x02; 41 while(TI != 1); 42 TI = 0; 43 P3_5 = 0; 44 RB8 = 1; 45 while(RI != 1); 46 RI = 0; 47 P2 = SBUF; 48 SM2 = 1; 49 P3_5 = 1; 50 } 51 52 } 53 } 从机1 1 #include 2 #include 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x01) 9 { 10 P3_5 = 1; 11 RI = 0; 12 TB8 = 1; 13 P1 = 0x10; 14 SBUF = 0x10; 15 while(!TI); 16 TI = 0; 17 } 18 else P1 = 0; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 } 从机2 1 #include 2 #include 3 sbit P3_5 = P3 ^ 5; 4 void serial() interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x02) 9 { 10 P3_5 = 1; 11 RI = 0; 12 TB8 = 1; 13 P1 = 0x20; 14 SBUF = 0x20; 15 while(!TI); 16 TI = 0; 17 } 18 else P1 = 0; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 实现代码:SM2=0,单机通信模式! 主机 1 #include 2 unsigned char cort = 0; 3 sbit P3_5 = P3 ^ 5; 4 void key_serial() interrupt 0 using 1 5 { 6 ++cort; 7 } 8 void main() 9 { 10 P2 = 0x0f; 11 TMOD = 0x20; 12 TH1 = 0xFD; 13 TL1 = 0xFD; 14 PCON = 0x00; 15 TR1 = 1; 16 SCON = 0xD0; 17 EA = 1; 18 EX0 = 1; 19 IT0 = 1; 20 P3_5 = 1; 21 while(1) 22 { 23 if (cort == 1) 24 { 25 SBUF = 0x01; 26 while(!TI); 27 TI = 0; 28 P3_5 = 0; 29 while(!RI); 30 RI = 0; 31 P2 = SBUF; 32 P3_5 = 1; 33 } 34 if(cort == 2) 35 { 36 SBUF = 0x02; 37 while(!TI); 38 TI = 0; 39 P3_5 = 0; 40 while(!RI); 41 RI = 0; 42 P2 = SBUF; 43 P3_5 = 1; 44 } 45 if (cort == 3) 46 cort = 1; 47 } 48 } 从机1 1 #include 2 #include 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 P2 = SBUF; 9 if (SBUF == 0x01) 10 { 11 P3_5 = 1; 12 P1 = 0x10; 13 SBUF = 0x30; 14 while(!TI); 15 TI = 0; 16 } 17 else P1 = 0; 18 P3_5 = 0; 19 ES = 1; 20 } 21 void main() 22 { 23 P1 = 0x00; 24 TMOD = 0x20; 25 TH1 = 0xFD; 26 TL1 = 0xFD; 27 PCON = 0x00; 28 TR1 = 1; 29 SCON = 0xD0; 30 EA = 1; 31 ES = 1; 32 P3_5 = 0; 33 while(1) 34 _nop_(); 35 } 从机2:略 ———————————————————————————————————————————— 关于该实验在多机通信和单机通信下不同情况的讨论 在单机通信模式下,SM2 == 0, 初始化:SCON = D0; 发送完毕:TI=0; 接收完毕:RI=0; 中断触发条件:RI=0且SM2=0,RI置位 此情况下,发送和接收信息结束后需要对RI和TI手动置为0即可。 在多机通信模式下,SM2在0和1之间调整 初始化:主机:SCON = F8;从机:SCON = F0; 中断触发条件:接收到的第九位RB9==1,RI置位(如果RB8=0,RI就会等于0,就不能进入接收中断,自然丢失信息了。) 51单片机原理及应用(陈海宴)书P129案例是在主机发送状态下使用多机通信,接收状态下使用单机通信,在理解上容易出现错误,过程分析及代码如下: 实现代码: 主机: 从机1: 从机2:略 1 #include 2 #include 3 sbit P3_5 = P3 ^ 5; 4 void serial(void) interrupt 4 using 1 5 { 6 ES = 0; 7 RI = 0; 8 if (SBUF == 0x01) 9 { 10 P3_5 = 1; 11 SM2 = 0; 12 P1 = 0x10; 13 SBUF = 0x10; 14 while(!TI); 15 TI = 0; 16 } 17 else P1 = 0; 18 SM2 = 1; 19 P3_5 = 0; 20 ES = 1; 21 } 22 void main() 23 { 24 P1 = 0x00; 25 TMOD = 0x20; 26 TH1 = 0xFD; 27 TL1 = 0xFD; 28 PCON = 0x00; 29 TR1 = 1; 30 SCON = 0xF0; 31 EA = 1; 32 ES = 1; 33 P3_5 = 0; 34 while(1) 35 _nop_(); 36 } 1 #include 2 #include 3 unsigned char cort = 0; 4 sbit P3_5 = P3 ^ 5; 5 key_serial() interrupt 0 using 1 6 { 7 ++cort; 8 } 9 void main() 10 { 11 P2 = 0xff; 12 TMOD = 0x20; 13 TH1 = 0xFD; 14 TL1 = 0xFD; 15 PCON = 0x00; 16 TR1 = 1; 17 SCON = 0xF8; 18 EA = 1; 19 EX0 = 1; 20 IT0 = 1; 21 P3_5 = 1; 22 while(1) 23 { 24 if (cort == 1) 25 { 26 SBUF = 0x01; 27 while(TI != 1);
上一篇:LCD1602温度显示程序设计流程
下一篇:51单片机入门 - 定时/计数器原理及结构(T0和T1)
推荐阅读最新更新时间:2024-11-12 22:12
推荐帖子
- ADXL345程序,,希望可以对大家有用
- #includereg52.h#defineucharunsignedchar#defineuintunsignedint#includeINTRINS.H#includemath.hsbitP2_0=P2^0;sbitP2_1=P2^1;sbitP2_2=P2^2;sbitP2_3=P2^3;uintwan,qian,bai,shi,ge,temp_data,t;intdis_data;floata,b,c;#
- jonlovehanxu 51单片机
- 液晶屏 做过 4位显示的 单颜色显示屏的 青帮忙
- 液晶屏做过4位显示的单颜色显示屏的青帮忙谢谢了QQ122473474液晶屏做过4位显示的单颜色显示屏的青帮忙
- xiaokai301 工控电子
- 求助:stm32对脉冲计数
- 有哪位大侠用stm32做过对脉冲计数的我现在对电机的位置编码器的输出脉冲进行计数位置编码器一周360度出1024个脉冲,一周以后重新计数哪位大侠指点下,或者有对脉冲计数的程序发我邮箱我来体会一下,不胜感激邮箱:fnj_fny0624@126.com求助:stm32对脉冲计数哇哈哈哈哈。原来STM32就是用这个来做QEI的啊。或者叫做QEP。感谢楼上提问。我也打算用这个做一个电机的位置编码器计数,请问楼主,这个脉冲计数是不是用定时器的输入捕获功能?
- zyyu stm32/stm8
- STM32插上网线如何通过路由器怎么访问外网啊
- 现在有一块STM32F107的开发板,按照lwip的例程已经可以和局域网内的另一台电脑进行TCP通信(用python写的server)收发数据。于是想访问互联网,比如简单的,访问一个网址获取网络时间,并且以TCP方式在win电脑上用python写的例子也是能访问成功的(网站没有挂掉),照猫画虎搬运到stm32上,为什么就收不到回信了呢?网上查到的方法有说内网穿透的,有说用ESP8266连WiFi的,但是我觉得电脑或者Linux的开发板,用网线直接插在路由器上就能上网,为什么单片机就不能
- 硫酸锌01 stm32/stm8
- 烧78E58 ldrom用什么烧录器.
- 烧78E58ldrom用什么烧录器.我们公司的烧录器是很老的一个superpro/Z,识别78E58话最大的也就到7FFF,而ldrom烧录的起始位为10000H,找不到这个空间,是不是我的设置不对,如果这个烧录器不能烧ldrom,请帮我介绍一个烧录器.烧78E58ldrom用什么烧录器.
- luoweiliang1982 嵌入式系统
- 我想要一份Evc平台下的用msxml做报告的例子
- 寻某了很久也没有解决这个问题。希望有人给我发一份MSN:guitar_1314@hotmail.comQQ:22174907我想要一份Evc平台下的用msxml做报告的例子什么意思,没有明白???用msxml做报告的wince例子自己顶下1123顶下有点失望了我不信11
- albertzhou 嵌入式系统
设计资源 培训 开发板 精华推荐
- “西北模电王”新概念模拟电路4 《运放电路的频率特性和滤波器》
- TI带你一起解剖共享单车智能锁!看视频涨知识赢好礼喽!
- TE有奖直播:未来感知 由我先知-传感器在物联网中的最新应用
- 【泰克注册观看有礼】 PCI-SIG 前主席解析:PCI Express5.0测试方案和测量挑战
- 有奖直播:瑞萨电子安全物联网套件为您提供安全云联接解决方案
- 微波单片集成电路简介
- 免费申请 | DFRobot盖革计数器模块
- Littelfuse|一个芯片实现过压、过流、短路和浪涌保护
- EEWORLD十周年为你而任性——上百块ST开发板团购盛宴开始啦!49元包邮,发帖还返现
- 【已结束】 Qorvo & Keysight 直播【新一代无线连接的挑战与应对之道】