|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC机通过上层软件控制单片机LED的亮灭或者控制LED的闪烁及闪烁时间,上层软件用户名密码均为admin 注意PROTEUS串口仿真需要配合虚拟串口软件才能工作。
; H l4 t. F6 h5 Q* A6 e, b& L
) H1 d: {# w- v% c1 E
C' w: b+ h6 a1 p. K8 U" L
, k. J9 Z/ }; |4 U2 q3 a0 N9 S- x9 J! s8 q
5 |: c% g) e' N, L: O% B. B; j
8 o4 d0 h4 d- F* \* F7 d上位机(包含源码)软件说明: O' c" E5 a. P3 k
发送数据解析3 y4 t" s% r: }( P5 e+ Q
字节1、2:0x55 0xaa 数据是否正确判断标志
. r2 B" O8 U) X字节3:
# T) F6 Z; o$ i% b% @ 0x01 ------单个LED控制手动控制& U& _2 f' F0 H& C( @: {% p2 X! Q
0x02 ------单个LED控制自动闪烁
0 `6 F$ G% u6 V4 }+ ?& i3 G! a. G1 T" P+ l6 U* o5 Y9 W! E
字节4 7 }3 o4 B$ L+ @, r- l2 J
此字节从低位到高位依次控制LED0-LED7,例如0x01表示手动点亮LED0或者LED0自动闪烁;0x28表示手动点 亮LED3、LED5或者LED3、LED5自动闪烁
. z/ L$ ~% J. e8 Z, x# u1 i! V4 V% m( P% j' c/ M" l' q% x2 P+ n' O
字节5、6:表示闪烁时间(6高8位 5低8位) 取值范围0-5000$ E/ [8 p+ L# ^0 Y- b
% t' Q& _, J8 f7 D5 x1 J" m
程序源码预览:
; ^- D+ O! \" U, ?- b* s- #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;
- }
- }
- }, l- ~) I: h/ V" V0 O/ ~0 v
$ i8 c. m) M4 i' C z: s. Q4 n) U# O+ X3 ]+ A; f( o% O/ p
9 x7 q$ t8 a9 q S [ |
|