找回密码
 注册
关于网站域名变更的通知
查看: 244|回复: 2
打印 上一主题 下一主题

51单片机与PC上位机串口通信之LED控制

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-10-12 10:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
PC机通过上层软件控制单片机LED的亮灭或者控制LED的闪烁及闪烁时间,上层软件用户名密码均为admin 注意PROTEUS串口仿真需要配合虚拟串口软件才能工作。
6 g8 a* r5 X* s( }  b. i0 z% K
" B. U# ^4 Q! y8 T5 b$ ~2 l* ?  d 7 Z2 x" e+ I3 J" y6 g+ I! R2 A; m
' \# D; ]$ |6 n( y/ T4 z# y

% r: b. U( X5 Q8 U! u/ O* k
; B$ X7 `5 Q% A( q- F' W' C/ g
- y6 p$ R4 O2 u  }  `0 a8 }, L8 W上位机(包含源码)软件说明:8 Y/ x: [' X3 [/ }/ j% M# t+ ?
发送数据解析% l+ G1 D4 _( A! z% B  B4 L1 G
字节1、2:0x55 0xaa 数据是否正确判断标志2 S2 l3 X" d) E6 x3 ^
字节3:
0 }& a( V" P6 r) T2 Y: N8 ^           0x01 ------单个LED控制手动控制
( C' |* ^% ?3 ^3 B+ {& W8 N           0x02 ------单个LED控制自动闪烁
2 c& O* _8 T# Z, K2 R
. T4 @- `, R) g+ G" T( R字节4                     
2 M& r0 s1 q6 B# h    此字节从低位到高位依次控制LED0-LED7,例如0x01表示手动点亮LED0或者LED0自动闪烁;0x28表示手动点    亮LED3、LED5或者LED3、LED5自动闪烁* `( G  v8 _  U+ M
% ?. n1 s1 H9 W* b$ k7 U
字节5、6:表示闪烁时间(6高8位 5低8位)    取值范围0-5000
5 |' e/ i8 S# e5 j. L7 H! z/ n! @" a" }; ~3 n: q
程序源码预览:
$ D/ L. o4 w* ^- A
  • #include<reg52.h>
  • #define uint8 unsigned char
  • #define uint16 unsigned int
  • uint8 receive_buffer[6];                        //存放接收到的数据
  • uint8 i,k;
  • void delay1ms(uint16 m)                                //1ms延时程序
  • {
  •         uint8 j;
  •         while(m--)
  •                 for(j=0;j<112;j++);
  • }
  • void main()
  • {
  •         uint16 time;
  •         P0 = 0xff;                        //初始化LED状态,熄灭
  •         TMOD = 0x20;                //定时器1工作在方式2
  •         TH1 = 0xfd;
  •         TL1 = 0xfd;                        //波特率9600
  •         TR1 = 1;                                //启动定时器1
  •         EA = 1;                                        //开启总中断
  •         SM0 = 0;
  •         SM1 = 1;                                //串行口工作方式1
  •         REN = 1;        //允许串行接收
  •         ES = 1;                                        //开启串行口中断
  •         while(1)
  •         {
  •                 if((receive_buffer[0] == 0x55) && (receive_buffer[1] == 0xaa))                                        //如果接收到0x55 0xaa说明接收到的数据是正确的
  •                 {
  •                         time = ((uint16)receive_buffer[5] << 8) + (uint16)receive_buffer[4];        //闪烁时间
  •                         switch(receive_buffer[2])
  •                         {
  •                                 case 0x01:                                                                                                                                                                                                                                                //手动控制LED亮灭
  •                                         P0 = ~receive_buffer[3];
  •                                         break;
  •                                 case 0x02:                                                                                                                                                                                                                                                //LED自动闪烁
  •                                         P0 = ~receive_buffer[3];
  •                                         delay1ms(time);
  •                                         P0 = 0xff;
  •                                         delay1ms(time);
  •                                         break;
  •                                 default:
  •                                         break;
  •                         }
  •                 }
  •         }
  • }
  • void uart_int() interrupt 4
  • {
  •         if(RI == 1)
  •         {
  •                 RI = 0;
  •                 receive_buffer = SBUF;
  •                 i++;
  •                 if(i == 6)
  •                 {
  •                         i = 0;
  •                         k = 0;
  •                         P0 = 0xff;
  •                 }
  •         }
  • }
    : K( h1 }1 y- J8 p# x+ H
) S9 N& g, R3 J$ c: P
, P% k0 O8 y/ R8 E% }$ `! w
& H# }0 D2 ^+ W. }' ?7 Y

LED控制.rar

1.6 MB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-10-12 13:36 | 只看该作者
仔细看说明,需要用到虚拟串口,这样能更好的使用。

该用户从未签到

3#
发表于 2022-10-12 13:47 | 只看该作者
使用一条数据线,将数据依次传输,每一位数据占据一个固定的时间长度。只需要几条线,就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-11 13:12 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表